不久前,我在博文 带粘性表头和粘性第一列的表格 中查看了 HTML <table>
中的粘性表头和表尾。在其中,我从未在任何 <thead>
、<tfoot>
或 <tr>
元素上使用 position: sticky
,因为即使 Safari 和 Firefox 可以这样做,Chrome 也无法做到。但它可以使用像 <th>
和 <td>
这样的表格单元格,这是一个足够好的变通方法。
现在情况发生了变化。
听起来 Chromium 中的渲染引擎对表格进行了彻底的改进,从而提高了表格的速度。修复的不仅仅是粘性问题,还有 各种其他问题。我只会关注粘性问题,因为这是我关注的重点。
对我来说,重点是 <thead>
和 <tfoot>
可以设置为粘性。这似乎将是这里最常见的用例。
table thead,
table tfoot {
position: sticky;
}
table thead {
inset-block-start: 0; /* "top" */
}
table tfoot {
inset-block-end: 0; /* "bottom" */
}
这在所有三个主要浏览器中都有效。您可能想要变得聪明一点,只在某些最小视口高度下将它们设置为粘性,但重点是它有效。
我还听到了一些关于表格列的问题。我最初的文章有一个粘性第一列(这有点像重点)。虽然有一个表格 <col>
标签,但它……很奇怪。它实际上并没有包裹列,更像是用于在需要时向下设置列样式的指针。我几乎从未见过它被使用,但它确实存在。无论如何,您绝对无法使用 position: sticky;
设置 <col>
的样式,但您可以创建粘性列。您需要选择该列中的所有单元格,并将它们粘贴到左侧或右侧。以下是如何使用逻辑属性来实现这一点……
table tr th:first-child {
position: sticky;
inset-inline-start: 0; /* "left" */
}
这是一个有点讨厌的表格,其中 <thead>
、<tfoot>
以及第一列和最后一列都是粘性的。
我相信你可以用它做一些有品位的事情。比如也许
太棒了。维基能否添加它?
首先,这是一篇很棒的文章,但你能告诉我 {font: 110%/1.4 system-ui} 的含义以及浏览器如何读取它吗?
110%
指的是font-size
1.4
指的是line-height
system-ui
指的是font-family
将所有这些都放在一个
font
声明中称为简写,并且完全有效!您可以在 MDN 上了解更多信息。在 Microsoft Edge 91.0.864.48 上不起作用。
已确认。
那么这告诉我们什么?我认为这告诉我们,尽管 Microsoft Edge 使用 Chromium,但它在版本到版本的发布方面并没有与 Chrome 保持一致。“重写”的表格可能会出现在 Edge 的未来版本中,我想。
现在可以用了,至少。
对于 display: table-header-group 仍然不起作用 :(
我还没有尝试过,只是发现了它,但对于那些说它在 Edge 上不起作用的人,请尝试使用
Edge-Dev
版本。Edge 现在运行在与 Chrome 和 Firefox 相同的“基础”上,所以它应该可以工作……今天早上我阅读了您最初的文章来完成此操作,并且效果很好。
现在它会变得更加棒!
感谢您提供此信息!
在我的手机 Chrome 上似乎也不起作用。
不幸的是,在大多数页面上,同时使用粘性表头/表尾行和列似乎仍然几乎不可能,因为表格不尊重父级宽度。如果您的表格比其父级宽,它将超出末尾边缘(从而阻止水平滚动,而水平滚动在粘性列中很有用),除非将其放置在具有
overflow-x: auto
(或scroll
)的包装器中。但如果您这样做,您将建立一个新的格式化上下文并丢失表头/表尾行的粘性。请在此处查看最小示例:https://jsfiddle.net/jye05wzc/
我想使用
iframe
作为包装器是一种变通方法,但这对于基本的滚动行为来说是一个相当大的扭曲。实际上,取消我之前关于
iframe
的说法——我以为我看到其中一个嵌入示例正确地粘贴到文章窗口的顶部边缘(而不是其嵌入窗口),但后来我又找不到它了。在检查详细信息后,我找不到任何理由认为iframe
最终会在这里提供任何帮助。这让我们回到了起点:表格是否真的不支持任何类型的溢出滚动,其中表格本身(而不是包装器)被视为其单元格的容器?
我再次重新审视了这个问题,认为我可能在 此 CSS 工作组问题 中找到了解决方案,并认为我应该总结一下。
overflow: clip
是一个最近引入的值,它允许其行为 按轴应用。它本身不会建立块级格式化上下文,所以我猜想overflow-x: scroll
与overflow-y: clip
可能会提供所需的行为。不幸的是,Chrome 和 Firefox 都不这样实现——只要存在overflow-x: scroll
,就会建立一个新的格式化上下文(适用于两个维度),并且列标题不会随着页面滚动。似乎工作组问题 865 仍然存在,正是因为这个用例,所以我想在这一点上,希望position: sticky
在具有overflow: hidden
或overflow: scroll
的父级中获得对所需行为的支持。嗨,Chris,
是什么阻止了粘性表头或表尾对所有表格列都保持粘性?使用您概述的 CSS,我的表头对所有列都是粘性的,但是表尾除了最后一列之外对所有列都是粘性的?我已经搜索了包括 Stack Overflow 在内的解决方案,但没有成功。
这效果很好,但是当我应用它时,在任何表头/表尾行之上和之下都会有一些额外的底层表格。这不会造成任何功能问题,但在视觉上很丑陋。
不知道如何解决这个问题,有什么想法吗?大概修复方法也会修复此处显示的 2 行 tfoot 之间的小间隙
https://staff.scheig.com/extraneous.png
我的 Edge 版本是 93.0.961.38,它像 Chrome 一样工作。终于可以在所有地方使用了 :)