表格有一个 CSS 属性,在我看来,它支持良好、鲜为人知,而且非常有用。它改变了表格的渲染方式,从而提供更稳固、更可预测的布局。
它就是
table {
table-layout: fixed;
}
table-layout
的默认属性是 auto
,我认为大多数人都熟悉这种表格布局。这种风格在我看来感觉很松散,很奇怪。以下是一些探索
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的 默认表格很奇怪。.
table-layout: fixed;
使用 有了这个属性/值,事情变得更加稳固和可预测。
布局根据第一行固定。设置它们的宽度,表格的其余部分将随之而来。
这有点复杂,但并不多。以下是一些探索
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的 固定表格解决了一些问题.
用例
我之所以研究它,是因为我试图为 CodePen 上列表视图中的 Pens 保持统一的行高(即不换行 Pens 标题),但又不想让表格的宽度过大。这效果很好。

我想你们大多数人知道这一点:**表格用于表格数据和电子邮件。**而不是网页布局,因为原因.
实际的 HTML 和 CSS
我想大多数用例都像这样
<table class="users">
<thead>
<tr>
<th class="row-1 row-ID">ID</th>
<th class="row-2 row-name">Name</th>
<th class="row-3 row-job">Job</th>
<th class="row-4 row-email">Email<th>
</tr>
</thead>
<tbody>
<tr>
<td>0001</td>
<td>Johnny Five</td>
<td>Robotin'</td>
<td>[email protected]</td>
</tr>
<tr>
<td>0002</td>
<td>Super Superlonglastnamesmith</td>
<td>Doin' stuff</td>
<td>[email protected]</td>
</tr>
</tbody>
</table>
.users {
table-layout: fixed;
width: 100%;
white-space: nowrap;
}
.users td {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Column widths are based on these cells */
.row-ID {
width: 10%;
}
.row-name {
width: 40%;
}
.row-job {
width: 30%;
}
.row-email {
width: 20%;
}
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的 xFcrp.
为了确保万无一失,请知道可以使用 <col>
元素来设置列宽,因为这些元素会影响第一行的单元格,而第一行的单元格正是设置表格其余部分基础的关键。
布局速度
我听说这种表格布局方式也更快,这是有道理的,因为不需要分析整个表格的内容来确定列宽。不过,我还没有这方面的数据。
在电子邮件中
Campaign Montior 的 电子邮件客户端中 CSS 支持图表 显示 table-layout 在各处都受到支持。
更多信息
- 关于
<table>
的更多信息 - table-layout 在 MDN 上。包括浏览器支持,基本上是无处不在的。
后续推文
@chriscoyier 我用来制作 ungrid 的就是它,它是一个只有 97 字节的响应式网格 https://#/RgIFjpcCXu
— Chris Nager (@chrisnager) 2014年7月2日
@chriscoyier Chekkit: https://#/lO62D4lECK
— Harry Roberts (@csswizardry) 2014年7月2日
@chriscoyier @twbootstrap 正在使用它来处理水平按钮组: https://#/dhLRuN0Jof
— Lucas Constantino (@luconsilva) 2014年7月2日
@chriscoyier Chris,有没有什么理由不总是使用 table-layout: fixed?
— Mike Aparicio (@peruvianidol) 2014年7月2日
当使用
display: table;
和display: table-cell; vertical-align: middle;
对子元素进行垂直对齐时,如果其中一个子元素包含一个“,并且你希望它也进行缩放并保持其比例,那么我必须在具有display: table;
的元素上使用table-layout: fixed
,以便它在 Firefox 中正常运行。抱歉,我之前评论中的错别字应该是
img
标签。是的,我经常遇到这种情况,在固定比例的容器中(例如产品列表网格)垂直居中不同尺寸的图像!图像在 Chrome 中按比例缩放,但在 FF 中,图像会超出容器,没有 table-layout: fixed。
一如既往地棒,Chris。谢谢!
很棒的文章,但为什么没有提到 colgroups 和 cols?
有。我只是没有过多地讨论它们,因为我不觉得它们特别有用。
对于我的响应式电子邮件,我只将它应用于最外层的表格。否则就乱套了。
您好,Chris,
谢谢您的提示!我最近也必须使用它,正如您在这里清楚地展示的那样,它非常有用。
我有一个关于最后一个 CodePen 示例(可调整大小的示例,使用 text-overflow: ellipsis)的问题。当您将宽度缩小到最小宽度时,第一列的 ID 会正常显示省略号。但是,当我将其缩小到最小宽度时,第一列的 ID 不会再显示省略号,而是显示 000,其余部分被截断,就像使用 overflow: hidden 一样。
您知道这是为什么吗?我只是好奇!
我也注意到了!有点奇怪。也许就像如果它无法容纳省略号,它就会默认回到文本。这很奇怪,可能是一个错误。或者可能不是。很难说。
顺便说一下,overflow 在 Firefox 中不支持表格单元格。早在 2003 年就提交了错误报告 (https://bugzilla.mozilla.org/show_bug.cgi?id=221154),但什么动静都没有。
是的,Firebox 的行为与其他浏览器不同,我遇到了一些 bug,因为**其他浏览器**将**单元格视为块级元素**,而**Firebox 不会**这样做,因此我需要在单元格内添加一个 div 来解决这个问题。
我已经在 2 个项目中使用了这个属性,但是在 DIV 上使用。好处是子元素可以有固定宽度,而其余部分会自动适应。
你可以在这个页面上看到它的实际效果。底部的时序图就是用这种方法制作的。
http://windpowerpioneers.vestas.com/timeline
在特定浏览器宽度下,选择的年份至少会换行到 Firefox 中的第二行。这是由 `word-wrap: break-word;` 引起的,这是一个通配符规则。你使用它有什么原因吗?在我看来,这会导致大量意想不到的布局问题。
嗨,Vesa
你说得有道理。在这个例子中,我会删除 word-wrap。但总的来说,我喜欢把它放在 * 上,因为客户偶尔会写一些长词,或者复制一个长 URL 到内容中。
Chris,干得漂亮。
另外,还有一点完全不同的事情。你的 CDN 好像有点问题……
关于:“而且我宽 1000 像素。你可能会认为它最终宽度是 1/3,但实际情况并非如此。”
难道它不是在做这件事吗?那列是另一列宽度的 1/3,或者整个表格宽度的 1/4(总共 4000 像素中的 1000 像素)。
对我来说,不是这样。它小于 1/4,和最长单词“ultimately”的宽度一样。
是的,它实际上是这样的。
我更新了示例,使其更清晰,其中一个单元格宽 2000 像素,另一个宽 1000 像素,最终结果是 2/3 和 1/3。
更多用途/示例 http://csswizardry.com/2013/11/taming-data-tables/
我喜欢 `table-layout: fixed`。在 IE8 安全到可以忘记之前,我仍然将其用作 flexbox 的替代方案。它使得让一个流体宽度项目占用容器剩余宽度变得极其容易。
虽然 IE9 也不支持 Flexbox,但你是否计划在放弃 IE8 后,也放弃 IE9(用户群少于 IE8)?
我的公司很久以前就放弃了 IE8,并且也准备放弃 IE9,但 `table-layout: fixed` 的使用有时会很方便。
我肯定遗漏了什么 - 这是我尝试查看你代码的样子:http://jsfiddle.net/clayshannon/8m8xr/
将 `text-align:left` 属性添加到 `table` 元素。
在具有固定布局的表格中使用 `
谢谢!
我认为 `table-layout:fixed` 是等宽的。
IE9 也不支持 Flexbox,你是否准备在保留 IE8 的情况下,也放弃 IE9(用户群少于 IE8)?
谢谢。我经常使用 CSS 中的表格布局来“代替”传统的 HTML 表格布局,结果总是失败,所以我最终放弃了,完全坚持使用 HTML。正是像你这样的文章,没有使用泛泛的语言,而是提供了具体实用的内容,才让我能够完成“CSS 戒毒”。我的问题是,我有很多遗留的 XLS 和 ODT 表格/数据库,其中包含很多资料,我想将它们放到网上,但每次尝试都会在“连接处断裂”。
是的,它实际上是这样的,谢谢。