HTML 教程 / 无障碍表格:caption、scope 与合并单元格

一个可读的数据表应明确其主题,并指出每个数值对应的行和列标题。使用 caption 和 th,必要时添加 scope,并且仅在合并单元格后关系仍然清晰时才合并。

使用 caption 为表格命名

caption 总体描述表格,并且必须是 table 的第一个子元素。它不同于邻近的段落标题,因为它是表格的一部分。如果需要时间段或测量方法来解释数字,请在表格标题或邻近的文本中说明。表格标题引入表格;行和列的各个名称保留在表头单元格中。

通过 scope 将数据与表头关联

列标题使用 scope="col",行标题使用 scope="row"。在此示例中,与星期一上午对应的值是三个访问者。

<table>
  <caption>按星期与时段统计的访客人数</caption>
  <thead>
    <tr>
      <th scope="col">星期</th>
      <th scope="col">上午</th>
      <th scope="col">下午</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">星期一</th>
      <td>3 位访客</td>
      <td>5 位访客</td>
    </tr>
    <tr>
      <th scope="row">星期二</th>
      <td>4 位访客</td>
      <td>6 位访客</td>
    </tr>
  </tbody>
</table>
按星期与时段统计的访客人数
星期 上午 下午
星期一 3 位访客 5 位访客
星期二 4 位访客 6 位访客

scope 说明表头单元格关联的是行、列还是分组;它不是视觉样式规则。在一个简单的表格中,这种关系可能不言而喻,但明确标注可以方便检查意图。 W3C WAI 表格教程 解释了更多模式。

只有在数据需要时才合并单元格

colspan="2" 涵盖两列;rowspan="2" 涵盖两行。以下示例在一个共同的标题下对上午和下午进行分组。colgroup 定义这两列,以便 scope="colgroup" 有一个明确的目标。有关下面的行和单元格,请参见 表格基础知识:table、tr、th 和 td 。

<table>
  <colgroup><col></colgroup>
  <colgroup span="2"></colgroup>
  <tr>
    <th scope="col" rowspan="2">星期</th>
    <th scope="colgroup" colspan="2">访客</th>
  </tr>
  <tr>
    <th scope="col">上午</th>
    <th scope="col">下午</th>
  </tr>
  <tr>
    <th scope="row">星期一</th>
    <td>3 位访客</td>
    <td>5 位访客</td>
  </tr>
</table>

结果包含一个用于星期的列组,以及一个包含上午/下午两列的组。第一列也在一个显式的 colgroup 中,因此其结构是可读的,无需依赖省略标签的规则。

带分组标题的示例
星期 访客
上午 下午
星期一 3 位访客 5 位访客

不要仅仅为了装饰简单的表格而添加合并的单元格。如果读者必须猜测某个数字属于哪一个表头单元格,请简化表格或将其分成较小的表格。W3C-WAI 关于 不规则表头的指导 提供了更复杂的示例。

测试这些关系

选择任意表格值并问:“这显示的是哪一天和哪个时间段?”在检查答案时,不要仅依赖颜色或位置。在窄屏幕上测试是否有内容被截断,并在复杂的合并表格中尝试使用屏幕阅读器。表格应表示数据,而不是用于布局或输入表单。将表格检查与《无障碍基础:标题、链接、图片和键盘》中手动测试的原则结合起来。