我们已经介绍过 单个<table>
单元格、<th>
和<td>
可以是position: sticky
。使表格的表头在滚动浏览大量行时粘贴到屏幕顶部非常容易(例如 此演示)。
但是,粘性不仅仅适用于屏幕顶部,您可以在任何滚动方向上粘贴内容(水平滚动 同样有趣)。事实上,我们可以在同一个元素内部拥有多个粘性元素,它们分别粘贴在不同的方向上,甚至可以拥有在多个方向上粘贴的单个元素。
这是一个同时粘贴表头和首列的表格的视频示例
为什么要这样做?**特别是对于以交叉引用为目的的表格数据。**在此表格中(当然,它表示棒球比赛的得分情况,不知何故有20支球队同时进行比赛,因为棒球就是这样运作的),您不希望球队名称或局数滚动消失是有道理的,因为您会失去对所查看内容的上下文。
并非所有表格都需要双向交叉引用。许多表格可以在小屏幕上 将行拆分为块,以获得更好的小屏幕体验。
这里使用的“技巧”部分在于position: sticky;
的使用,但对我来说更多的是如何处理重叠元素。粘性表格单元格需要有背景,否则我们会看到重叠的内容。它还需要适当的z-index
处理,以便当它粘贴到位时,它将位于它应该位于其顶部的元素之上。这感觉是最棘手的部分
- 确保
tbody>th
单元格位于普通表格单元格之上,以便它们在水平滚动期间保持在顶部。 - 确保
thead>th
单元格位于这些单元格之上,以进行垂直滚动。 - 确保
thead>th:first-child
单元格位于最顶层,因为它需要位于主体单元格及其同级表头之上以进行水平滚动。
有点像跳舞,但可以做到。
感谢 Cameron Clark 通过邮件向我 演示了这一点 并向我展示了它有多酷。确实,Cameron,它很酷。当我与他人分享时,Estelle Weyl 向我展示了她几年前制作的 演示。这感觉很正常,Estelle 总是比我领先几年。
我俩都比不上 ;)
这些都是很酷的解决方案 :-)
这是我对这个问题的看法
http://hgsweb.de/sticky/index.html
源代码位于
https://github.com/napengam/sticky
我之前也遇到过类似的需求,当时我需要构建一个产品比较表,我意识到在小屏幕上始终显示第一列可能会存在问题,因为没有足够的空间。相反,我更倾向于将标签作为自定义属性添加,并使用 CSS attr() 获取它。不过,我也确实使用了水平粘性来处理中间部分。
这是 相应的代码示例 和 更详细的解释。
是否有包含大型表格虚拟化的类似解决方案?
所有浏览器将在今年年底之前支持 th/thead 粘性。
“您不能定位 tr 或 thead”在 Firefox/Safari 中是不正确的,并且是 Chrome 中的 crbug.com/702927。Chrome 的表格重写工作已接近完成,并且随着它的完成,粘性错误将得到修复。
是否可以发布 HTML 和 CSS 代码?
尝试点击 CodePen 演示中的“查看编译”按钮。这将把 Pug 编译成 HTML 供您使用。
您是否尝试过使用任何辅助技术(VoiceOver、JAWS 等)进行测试?从历史上看,当您使用 CSS 对表格进行“复杂”操作并导致混淆时,它们的表现并不理想。
不过,这看起来是一个很棒的尝试。
Wayne,这在 JAWS、VO 和 NVDA 中都能正常工作,因为包装器具有可访问的名称和适当的角色,并且表格没有覆盖其语义的显示属性。
Android 上的 TalkBack 并不是很好。我在 12 月份提交了一个错误,因为此技术可能会导致问题:TalkBack 无法识别具有 tabindex 的父元素中的表格。
我在我的文章 设计不足的响应式表格 中提供了屏幕阅读器支持说明,解释了这些属性。
对于 Safari 中的定位,您可能需要使用
-webkit-sticky
,并且<caption>
也可能出现故障(请务必进行测试)。我在 固定的表格表头 中更详细地介绍了问题并概述了解决方法。您也可以将第二列设置为粘性,只需要知道它相对于左侧的位置即可。换句话说,您需要知道第一列的大小。
我使用自定义 CSS 属性来表示“固定”列的大小。然后使用 JS 使“固定”列可由用户调整大小。
效果非常好! :)
你能提供实现此功能的 CSS 代码吗?
巧妙的解决方案!我唯一的问题是,如果我想要单元格边框,我基本上只有两个选择:1)使用border-collapse: collapse 或 2)使用border-collapse: separate。在第一种情况下,我可以拥有 1px 的单元格边框,但它们在向下滚动表格时会消失。在第二种情况下,单元格边框始终存在,但至少为 2px 宽。有没有办法解决这个问题,使表头单元格始终显示 1px 的单元格边框?
我可以使用 border-collapse: collapse 和一些边框技巧来解决我的问题:https://jsfiddle.net/koldev/1kwg3arq/
我有这个表格,无法修复表头,有人可以帮我解决这个问题吗?
找到了问题 -> 粘性功能无法在以下 CSS 中的 tbody - thead 中工作。
有什么解决方法吗?
display: table;
table-layout: fixed;
width: 100%;
我浪费了几个小时试图对左侧的 2 列和右侧的 1 列使用 position:absolute 做同样的事情,遇到了各种问题(单元格不再具有相同的高度)等等。而它只需要是粘性的(+ 一些定位)… 谢谢!
所有这些解决方案的问题在于水平滚动条不正确。它跨越表格的整个宽度,而不是实际的可滚动区域。仍在寻找解决这个问题的方法
您是否找到了水平滚动条的任何解决方案?
我和您有同样的问题。您找到任何解决方案了吗?
有没有办法保持顶部粘性,同时保持左侧 2 列(而不是仅 1 列)?
让我告诉你,先生,你救了我的命。感谢你。
是否可以使表头使用“resize: horizontal”,同时第一列保持固定?
很棒的实现。谢谢。
table
选择器的样式设置为border: none;
和border: 1px solid black;
。我认为第二个样式是不必要的,它覆盖了第一个样式。此外,当您水平滚动表格时,它会导致轻微的闪烁。因为table
有1px
的边框,但th
的left
值为0px
。