根据HTML DTD,这是 HTML 表格的内容模型:
<!ELEMENT TABLE - -
(CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
<!ELEMENT CAPTION - - (%inline;)* -- table caption -->
<!ELEMENT THEAD - O (TR)+ -- table header -->
<!ELEMENT TFOOT - O (TR)+ -- table footer -->
<!ELEMENT TBODY O O (TR)+ -- table body -->
<!ELEMENT COLGROUP - O (COL)* -- table column group -->
<!ELEMENT COL - O EMPTY -- table column -->
<!ELEMENT TR - O (TH|TD)+ -- table row -->
<!ELEMENT (TH|TD) - O (%flow;)* -- table header cell, table data cell-->
所以这是非法的语法:
<thead><th>Heading of table</th></thead>
它应该是:
<thead><tr><th>Heading of table</th></tr></thead>
<th>
任何地方都不需要元素。它们只是<td>
您可以在表格行中使用的两种单元格类型之一(另一种是 )。A<thead>
是一个可选的表部分,可以包含一个或多个行。
编辑:至于为什么要使用<thead>
有几个原因:
- 语义:您正在区分表的内容和“元数据”。这最常用于在列标题和数据行之间划定;
- 可访问性:帮助使用屏幕阅读器的人理解表格的内容;
- 非屏幕媒体:打印多页表格可以让您将
<thead>
内容放在每页的顶部,这样人们就可以理解列的含义,而无需翻回几页;
- 样式: CSS 可以应用于
<tbody>
元素、<thead>
元素、两者或其他组合。它为您提供了其他东西来编写选择器;
- Javascript:这在使用 jQuery 和类似库时经常出现。额外的信息有助于编写代码。
作为 (5) 的示例,您可以这样做:
$("table > tbody > tr:nth-child(odd)").addClass("odd");
该<thead>
元素意味着这些行不会以这种方式设置样式。或者你可以这样做:
$("table > tbody > tr").hover(function() {
$(this).addClass("hover");
}, function() {
$(this).removeClass("hover");
});
和:
tr.hover { background: yellow; }
这再次排除了<thead>
行。
最后,许多相同的论点适用于在<th>
元素之上使用<td>
元素:您表明此单元格不是数据,而是某种标题。通常,此类单元格将在该<thead>
部分中的一个或多个行中组合在一起,或者成为每行中的第一个单元格,具体取决于表格的结构和性质。