表格


有些信息天生就是网格状的。火车时间表、价格方案、联赛排名、营养成分表:它们都有行和列,意义就藏在它们的对齐方式里。HTML 专门为这类内容准备了一组元素,用它们能让网格在屏幕上和被朗读软件读出来时都保持清晰易懂。
表格基础
**表格**是一个由行和列组成的网格,形状和电子表格一样。你要用四个元素来搭建它。<table> 包住整个网格。每个 <tr> 是一行(tr 是 table row 的缩写)。在一行里,每个 <td> 是一个数据单元格(td 是 table data 的缩写)。当一个单元格是用来标注它所在的列或行时,就要换成 <th>(th 是 table header 的缩写),浏览器会把它显示为粗体并居中,让它跟数据区分开来。
<table>
<tr>
<th>Day</th>
<th>Opening hours</th>
</tr>
<tr>
<td>Monday</td>
<td>8:00 to 18:00</td>
</tr>
<tr>
<td>Saturday</td>
<td>9:00 to 14:00</td>
</tr>
</table>顶部两个表头单元格,接着是两行数据。浏览器会画出这个网格,按内容自动调整每列宽度,并把那两个 <th> 单元格渲染成粗体。
<table> 包住整体,<tr> 对应每一行,<td> 是一个单元格,<th> 是表头单元格。表头单元格会自动变成粗体并居中,跟数据区分开来。一行一行地搭建,列自然就会对齐。 组织表格结构
行的顺序就是别人阅读它们的顺序,所以要把由 <th> 单元格构成的**表头行**放在最上面。然后保证每一行长度一致:如果表头行有三个单元格,下面每个 <tr> 也都得有三个 <td> 单元格。少了一个单元格,网格里就会出现一个空缺,列也就对不齐了。这里没有新知识要学,只是要对你已经熟悉的行多加留意。
<table>
<caption>Quarterly revenue by region</caption>
<thead>
<tr>
<th>Region</th>
<th>Q1</th>
<th>Q2</th>
</tr>
</thead>
<tbody>
<tr>
<th>North</th>
<td>£12,000</td>
<td>£15,400</td>
</tr>
<tr>
<th>South</th>
<td>£9,800</td>
<td>£11,200</td>
</tr>
</tbody>
<tfoot>
<tr>
<th>Total</th>
<td>£21,800</td>
<td>£26,600</td>
</tr>
</tfoot>
</table><th> 单元格组成的表头行放在最前面。然后保证每一行长度一致:上面有三个表头,下面每一行就要有三个 <td> 单元格。少了一个单元格,网格就会出现空缺,这正是新手最容易踩的坑。 无障碍表格
一个具有无障碍性的表格,应该对每个人都讲得通,包括那些用**屏幕阅读器**(把页面朗读出来的软件)听页面而不是用眼睛看页面的人。你能做的最有用的事,其实早就在你的工具箱里了:每个表头单元格都用 <th>,而不是 <td>。这样屏幕阅读器就能告诉听的人哪些单元格是标签、哪些是数据,于是像"£15"这样的值,就会连同它所属的列一起被读出来。如果表格里所有单元格都是普通的 <td>,读出来就是一堵没有任何锚点的数字墙。
无障碍性涉及的范围远不止表格;无障碍性这一章讲了更完整的内容。
<th>,数据用 <td>。屏幕阅读器靠这个区分,把每个值和它所属的表头一起读出来,所以 £15 会连着它所在的列一起出现,而不是孤零零一个数字。省掉这一步,整个表格听起来就是一堆散乱的数字。 表格是用来做什么的
在 CSS 还没能处理布局的那个年代,人们曾经用表格来搭建整个页面的布局:用一个 <table> 把菜单放在左边、内容放在右边。这种做法在视觉上确实能用,所以你还能在老页面和一些邮件模板里看到它。不要照着学。表格是用来放**表格数据**的,也就是本来就该排成行和列的信息。安排页面各部分的位置是 CSS 的工作。用表格来摆放东西而不是承载数据,会让页面对使用屏幕阅读器的人来说更难读,之后也更难调整。
<!-- Wrong: a table used to place a sidebar next to an article -->
<table>
<tr>
<td><nav>...</nav></td>
<td><article>...</article></td>
</tr>
</table>
<!-- Right: real elements, with CSS handling the columns -->
<nav>...</nav>
<article>...</article>这和 什么是 HTML 里讲到的结构与呈现分离的原则是一致的:结构交给 HTML,布局交给 CSS。关于按语义来选择元素,可以参考语义化 HTML。

