Menu

HTML 表格:行、列、表头单元格与标题

如何在 HTML 中制作表格:用 <tr> 写行、用 <td> 写单元格、用 <th> 和 scope 写表头单元格,以及 caption、thead、tbody 和 tfoot、斑马纹,还有在小屏幕上可以滚动的表格。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

如何在 HTML 中制作表格

表格是一个由行(<tr>)组成的 <table> 元素,每一行又由单元格组成:表头单元格用 <th>,数据单元格用 <td>。

表格本身没有边框;那一条 CSS 规则给它加上了边框,好让你看清单元格。列是由单元格形成的:每一行的第一个单元格是第一列,第二个是第二列,以此类推。每一行的单元格数量应该相同。删掉一个 <td>,那一行就会提前结束,留下一个空缺。

<th> 单元格默认加粗并居中。但这只是外观;重要的是它们是标签,下一节就讲这个。

表格元素

元素作用
<table>表格本身
<caption>表格的标题,是 <table> 的第一个子元素
<thead>表头行的分组
<tbody>主体行的分组(一个表格可以有多个)
<tfoot>表尾行的分组,比如合计
<tr>一行
<th>一个表头单元格
<td>一个数据单元格
<colgroup>、<col>列,用于给整列设置样式(宽度、背景)

边框的内容见 HTML 表格边框,跨多列或多行的单元格见 colspan 和 rowspan。

表头单元格、scope 与 caption

如果一个表格顶部和侧边都有表头,就需要说明每个表头指向哪个方向。scope="col" 标注下方的列,scope="row" 标注旁边的行。<caption> 给表格一个可见的标题:

有了这样的标记,屏幕阅读器移到 14:00 这个单元格时,就能读出“Saturday, Closes, 14:00”,数字永远不会被孤零零地读出来。对于只有一行表头的简单表格,即使没有 scope,浏览器通常也能推断出表头,但写上它不费任何事,还能免去猜测。

caption 也是屏幕阅读器到达表格时会读出的内容。比起放在表格上方、和表格没有关联的标题,更推荐使用它。

thead、tbody 与 tfoot

这三个分组把行分成表头、主体和表尾。表尾是放合计的地方:

有两个细节让数字更易读:text-align: end 让小数点对齐(每个价格都有两位小数),font-variant-numeric: tabular-nums 让每个数字的宽度相同。

如果你像第一个例子那样直接在 <table> 中写 <tr>,浏览器仍然会在这些行外面加上一个 <tbody>。这就是为什么 table > tr 这样的 CSS 选择器永远匹配不到任何东西:在页面中,这些行位于 tbody 里面。请使用 table tr,或者自己写上 <tbody>。

表格样式:斑马纹、悬停与宽度

:nth-child 给交替的行加上条纹,:hover 高亮指针下方的行,width: 100% 让表格撑满它的容器:

text-align: start 让表头文字和下方的数据对齐;否则 th 是居中的。用 start 而不是 left,在从右到左书写的语言中,对齐方式也能保持正确。

可滚动的响应式表格

表格无法缩小到比内容还窄。在手机上,一个很宽的表格会把整个页面往旁边推。所以应该把它包在一个可以滚动的容器里:

这里把容器的宽度限制在 300 像素,模拟手机屏幕;试着横向滚动它。tabindex="0" 让键盘用户可以聚焦到这个容器,并用方向键滚动它;role="region" 加上 aria-label 给这一站起了个名字。

表格用于展示数据

当内容真的有行和列时才使用表格:价格、时间表、对比、结果。不要用表格在页面上把东西并排摆放。布局表格会让屏幕阅读器困惑,因为它们会读出毫无意义的行和列,而且无法适应小屏幕。布局请交给 CSS 的 flexbox 和 grid。

常见错误

  • 各行的单元格数量不同。短的行会提前结束,各列也就对不齐了。
  • 用加粗文字的 <td> 作为表头。请使用 <th>,让表头成为真正的标签。
  • 使用过时的属性 border、cellpadding、cellspacing、bgcolor 和 align。请改用 CSS。
  • 把内容直接放在 <tr> 或 <table> 中,而不是放在单元格里。浏览器会把它移出表格,通常移到表格上方。
  • 在表格上方放一个标题,而不是使用 <caption>。
  • 在 CSS 中写 table > tr。浏览器已经插入了一个 <tbody>;请写 table tr 或 tbody tr。

常见问题

如何在 HTML 中创建表格?

用 <table> 包起来,每一行写一个 <tr>,再把单元格放进去:表头单元格用 <th>,数据单元格用 <td>。每一行的单元格数量应该相同,除非有些单元格跨了多列。

th 和 td 有什么区别?

<th> 是表头单元格,用来标注一列或一行;<td> 是数据单元格。浏览器会把 <th> 显示为加粗居中,屏幕阅读器会在每个数据单元格之前读出对应的表头,让数字有意义。

thead、tbody 和 tfoot 有什么作用?

它们把行分组为表格的表头、主体和表尾(合计)。它们让辅助技术能清楚地了解表格结构,也给 CSS 提供了可以选中的目标;打印长表格时,浏览器还可以在每一页上重复 <thead>。

为什么我的 HTML 表格没有边框?

表格默认没有边框。用 CSS 添加:table { border-collapse: collapse; } th, td { border: 1px solid #ccc; }。旧的 border="1" 属性已经过时。

如何让 HTML 表格适应不同屏幕?

把表格放进一个设置了 overflow-x: auto 的容器中。在窄屏上,表格会在容器内横向滚动,而不会把整个页面撑宽。

Coddy 编程语言插图

和 Coddy 一起学编程

开始