讲解

<table> 用来展示二维的结构化数据:成绩表、价格对比、赛程安排——注意是「数据」,不是版式。最基础的骨架是 <tr>(行)套 <td>(单元格);表头单元格用 <th> 替代 td,浏览器默认加粗居中,更重要的是它携带「我是标题」的语义。给 th 加上 scope="col"scope="row",能明确告诉屏幕阅读器这个标题管辖一整列还是一整行,读表时会自动报出对应表头,复杂表格的可访问性全靠它。

规范的数据表建议分三段:<thead> 放表头行,<tbody> 放数据行,<tfoot> 放汇总行(如合计)。分段不仅语义清晰,还让长表格打印时每页都能重复表头。<caption> 是表格的标题,必须作为 table 的第一个子元素,用一句话说明「这是什么表」,比在外面包一个 h3 更贴切。

跨行跨列用 colspan(横向合并)和 rowspan(纵向合并):<td colspan="2"> 占两列,被合并的位置直接少写对应数量的单元格。合并单元格是表格最容易写乱的地方,画个草图数清楚每行实际写了几个单元格再动手。最后强调历史教训:上古时代曾用 table 做整个页面的布局,这是早已被 CSS 取代的反模式——table 只装表格数据,布局交给 Flexbox 和 Grid。

示例

<table>
  <caption>2026 年第一季度销售数据(单位:万元)</caption>
  <thead>
    <tr>
      <th scope="col">地区</th>
      <th scope="col">一月</th>
      <th scope="col">二月</th>
      <th scope="col">三月</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">华东</th>
      <td>120</td>
      <td>135</td>
      <td>150</td>
    </tr>
    <tr>
      <th scope="row">华南</th>
      <td>98</td>
      <td>110</td>
      <td>126</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <th scope="row">合计</th>
      <td colspan="3">739</td>
    </tr>
  </tfoot>
</table>

想让表格在手机窄屏上不撑破版式,通行的做法是外面包一层容器并允许横向滚动:

.table-wrapper {
  overflow-x: auto;
}

常见坑

  • 用 table 做页面布局:两栏、居中都靠表格摆——这是 2005 年之前的做法,语义错乱、难以维护、对移动适配极不友好。
  • 表头用 td 加粗冒充 th:视觉上一样,但丢掉了表头语义和 scope 的关联能力,屏幕阅读器无法把数据和表头对应起来。
  • colspan/rowspan 后没减单元格:合并了几格,本行就要少写几格,多写的单元格会把整行顶歪。
  • 忘记 caption、summary 全靠猜:表格标题让用户在扫读时立刻知道这张表讲什么,也是无障碍的基本要求之一。

小结

table 只装数据:tr 行、td 格、th 表头(配 scope),thead/tbody/tfoot 分段,caption 命名,colspan/rowspan 合并。布局不要用表格。下一章进入交互的大门:表单基础。