Styling Tables the Modern CSS Way
HTML 表格几乎和网络本身一样古老,几十年来一直被使用和滥用。 从前,无畏的网页设计师在没有其他合适方法的情况下,使用表格将复杂的布局拼凑在一起。 值得庆幸的是,如今这已不再是常见的做法,但表格仍然是网络的重要组成部分, 对于显示表格数据至关重要 —— 按行和列组织的二维数据。
本文最终的实现效果:
在网上创建好看的表格有时会很麻烦。 我们将介绍一些在 HTML 和 CSS 中构建简单和复杂表的技巧和陷阱, 以及现代 CSS 可以帮助我们的地方。
table 的元素
我们的示例数据展示的是 2022 年全球不同国家的平均温度变化。(来源:国际货币基金组织)
就像任何一篇好的 Piccalilli 文章一样,我们将从普通的标签开始。 这意味着,即使没有任何额外的样式,我们的表格在视觉上也是可以理解的,并且可以被屏幕阅读器解析。
<table>
元素对于包装我们的表内容至关重要。
<thead>
和<tbody>
元素分别包含表的头行和正文行。
<tr>
元素形成行,其中包含<th>
(header)和<td>
(body)单元格。
我们还使用<tfoot>
(页脚)元素在表格底部显示全球平均温度变化。
<table>
<thead>
<tr>
<th>Country</th>
<th>Mean temperature change (°C)</th>
</tr>
</thead>
<tbody>
<tr>
<th>United Kingdom</th>
<td>1.912</td>
</tr>
<tr>
<th>Afghanistan</th>
<td>2.154</td>
</tr>
<tr>
<th>Australia</th>
<td>0.681</td>
</tr>
<tr>
<th>Kenya</th>
<td>1.162</td>
</tr>
<tr>
<th>Honduras</th>
<td>0.945</td>
</tr>
<tr>
<th>Canada</th>
<td>1.284</td>
</tr>
</tbody>
<tfoot>
<tr>
<th>Global average</th>
<td>1.4</td>
</tr>
</tfoot>
</table>
我们的 行 和 列 都有标题(<th>
标签)。
为了确保我们的内容能够被辅助技术轻松解释,我们可以在scope
属性中包含一个值为 row 或 column 的值,以推断标题属于哪个轴。
对于这样的简单表来说,这可能不是绝对必要的,但当我们扩展表使其变得更加复杂时,这肯定会很有用。
<table>
<thead>
<tr>
<th scope="column">Country</th>
<th scope="column">Mean temperature change (°C)</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">United Kingdom</th>
<td>1.912</td>
</tr>
<tr>
<th scope="row">Afghanistan</th>
<td>2.154</td>
</tr>
<tr>
<th scope="row">Australia</th>
<td>0.681</td>
</tr>
<tr>
<th scope="row">Kenya</th>
<td>1.162</td>
</tr>
<tr>
<th scope="row">Honduras</th>
<td>0.945</td>
</tr>
<tr>
<th scope="row">Canada</th>
<td>1.284</td>
</tr>
</tbody>
<tfoot>
<tr>
<th scope="row">Global average</th>
<td>1.4</td>
</tr>
</tfoot>
</table>
最后,让我们在表格中添加一个标题来总结其内容。
为此,我们将使用<caption>
元素,它必须是<table>
元素的第一个子元素。
<table>
<caption>
Annual surface temperature change in 2022
</caption>
<thead>
<tr>
<th scope="column">Country</th>
<th scope="column">Mean temperature change (°C)</th>
</tr>
</thead>
<tbody>
...
</tbody>
<tfoot>
...
</tfoot>
</table>
W3C Web 可访问性倡议(WAI)提供了不同的示例,说明如何将更复杂的摘要无障碍地添加到表中。
用户代理样式
如果我们在浏览器中查看我们的表,它看起来还不太好。 我们的标题和说明都居中对齐,无法区分页眉、页脚和正文行。
如今,浏览器的默认表样式相当一致。
如果我们在浏览器的开发工具中检查<table>
元素,我们可以看到应用了以下样式:
table {
display: table;
border-spacing: 2px;
border-collapse: separate;
box-sizing: border-box;
text-indent: 0;
}
其中一些属性对我们很有用。
例如,浏览器将font-weight:bold
应用于<th>
元素,这在应用任何其他样式之前将标题与正文单元格区分开来。
在没有任何自定义 CSS 的情况下,我们可以看到行和列标题与其相应数据之间的清晰关系,为用户提供良好的最低可行体验。
其他用户代理样式的帮助较小。让我们应用一些基本的 CSS 来“重置”我们的 table 样式,使其更容易设置样式。
无论你做什么,都不要为了使样式更容易而将表的 display
属性值更改为 grid
。
您将打破浏览器免费提供的内置可访问性,使辅助技术的用户无法访问您的表。
table 的现代 CSS 样式重置
假设我们正在 CSS 文件的<body>
上设置字体。我们的表将继承这些字体样式,从而在一定程度上改善了表的外观。
body {
font-family: "Open Sans", sans-serif;
line-height: 1.5;
}
将文本向左对齐是另一种立即提高表格可读性的方法(说真的,为什么要居中对齐行标题?!)。
在整个表上设置 text-align
属性可以解决这个问题,并允许以后更改单个表列或单元格的对齐方式。
当继承对我们有用时,我非常喜欢依赖它。
table {
text-align: left;
}
现在让我们想象一下,我们希望在表格单元格之间有一些网格线。我们不能简单地为每个表行添加边框。
/* This won’t work yet */
tr {
border-bottom: 1px solid;
}
如果我们为 每个表单元格添加边框,我们可以看到默认情况下它们之间有一个小空间。
th,
td {
border: 1px solid;
}
这对于创建美观的表格并不是特别有帮助。
我们将把表上的 border-collapse
属性设置为 collapse
,而不是默认值: separate
。
这将导致我们的表单元格彼此共享边框,看起来更像我们期望的表。
table {
text-align: left;
border-collapse: collapse;
}
这种变化的一个方便的症状是,如果我们愿意,我们现在还可以在表行上设置边框,而不仅仅是单个单元格。
设计的考虑因素
当谈到定制 table 样式时,我们应该注意一些设计考虑因素。
文本对齐方式
在从左到右书写的语言中(如英语),当文本向左对齐时,通常更容易阅读,而从右到左的语言则相反。 另一方面,在某些情况下,数字数据右对齐可能更有意义,因为它更容易相互比较值或求和。
为了解释可能与默认书写方向不同的语言,我们可以为 text-align
属性使用逻辑值。
text-align: start
将确保如果在表格(或文档)上设置了不同的方向,文本对齐是有意义的。
将text-align:start
应用于<table>
元素并不适用于所有浏览器,但我们可以在表头和标题上设置它。
由于在本例中,表单元格的其余部分包含数值,我们将把它们(及其相应的列标题)对齐到末尾:
th,
caption {
text-align: start;
}
thead th:not(:first-child),
td {
text-align: end;
}
表头和表尾
行和列标题已经通过粗体字体粗细进行了区分,但更清楚地标记页眉和页脚行将使用户更容易理解此表。 我们可以通过向这些行添加更重的边框或更改背景颜色(或两者兼而有之)来实现这一点。
我们只能使用 border-block
属性来设置块轴上的边框样式。(我们也在这里为单元格添加了一些 padding
。)
thead {
border-block-end: 2px solid;
background: whitesmoke;
}
tfoot {
border-block: 2px solid;
background: whitesmoke;
}
th,
td {
border: 1px solid lightgrey;
padding: 0.25rem 0.75rem;
}
列之间的边界可能并不总是必要的,因为内容的自然排列有助于我们的大脑辨别列之间的关系。 不过,它可能有助于大型或复杂表的可读性。 与表头和表尾相比,我通常倾向于将单元格边框改为较浅的颜色,以避免 table 感觉过于拥挤。
为行和列着色
交替着色表格行背景是另一种帮助表格可读性的方法,可以替代边框。
在这个例子中,我们将主题颜色设置为表上的自定义属性,并使用 CSS color-mix()
函数创建相同颜色的透明变体,
以巧妙地为交替的行着色。
table {
--color: #d0d0f5;
}
thead,
tfoot {
background: var(--color);
}
tbody tr:nth-child(even) {
background: color-mix(in srgb, var(--color), transparent 60%);
}