现代浏览器可使用position:sticky固定表格表头,需满足父容器有滚动上下文、tr无overflow:hidden、th设置背景色与z-index三个条件。列宽错位可通过table-layout:fixed与显式宽度解决。IE11及以下需将表头与数据拆分为两个表格,并用JavaScript同步列宽。
position: sticky 是现代浏览器固定表头最轻量可靠的方式,但需满足父容器有滚动上下文、tr 无 overflow: hidden、th 显式设置 background-color 和 z-index 三个条件;IE11 及以下需降级为分离表头+JS 同步列宽。

说到固定表格表头,现代浏览器其实已经给出了相当优雅的解决方案: 长期稳定更新的攒劲资源: >>>点此立即查看<<< 不过, 一个比较稳妥的写法示例可以参考下面这段代码: 条件都满足了,表头也固定了,但怎么滚动时表头和下面的数据列对不齐了?这种情况在表格内容长度差异大时(比如一列全是短名字,另一列全是长URL)尤其常见。 别急,这通常不是 解决这个问题的核心思路是让列宽固定下来: 对于IE11及以下这些不支持 说到底,固定表头真正的难点往往不在于“怎么写代码”,而在于“为什么代码写了却没反应”。实践中,90%的问题都出在父容器没有形成正确的滚动上下文,或者忘记了设置 侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述position: sticky。没错,这通常是实现这个功能最轻量、也最可靠的方式。只要父容器能正确滚动,并且的样式设置得当,一行CSS就能搞定。当然,对于旧版IE(特别是IE11及以下)这种不支持 sticky的“钉子户”,我们就得准备一套降级方案了。用
position: sticky 固定 的前提条件
position: sticky; top: 0;可不是万灵丹,写上就一定能生效。它有三个硬性前提,缺一不可:
本身或者它的任意一个祖先容器,必须形成一个“滚动上下文”。通俗点说,就是得给它设置一个
max-height,再加上overflow-y: auto(注意,不能是hidden或visible)。
的直接父元素(通常是 )不能有 overflow: hidden这类样式,它们会阻断粘性定位行为。
必须显式设置 background-color和z-index(哪怕只是z-index: 1)。否则滚动时,表头文字很可能被下方滚动的内容盖住,或者透出难看的底色。
姓名
城市
张三 北京 李四 上海 列宽错位?
table-layout: fixed + 显式宽度是关键sticky的bug。根源在于表格默认的table-layout: auto模式。在这种模式下,每一列的宽度会根据其内容动态计算。而和在浏览器渲染时是相对独立的区块,当内某列内容特别宽时,就可能把整列撑开,导致固定的表头列宽与之脱节。
加上
table-layout: fixed。
和它对应的那一列所有 设置相同的 width或min-width(比如width: 20%或width: 150px)。
的 offsetWidth,然后把这个宽度值赋给对应的 style.width。
IE11 及以下必须降级:分离
+ 手动同步列宽
position: sticky的浏览器,上面的方法就完全失效了。强行使用只会让表头消失或者布局错乱。更务实的做法是“分而治之”:把表头抽离出来,和表格数据主体拆分成两个独立的。
部分)。
,放在这个滚动容器的上方。
table-layout: fixed。然后,用Ja vaScript监听window.resize事件和数据表格tbody的scroll事件,动态同步两个表格每一列的offsetWidth,确保它们始终对齐。和 都加上内联的 width样式,靠人工确保宽度一致。
background和z-index。至于IE的降级方案,虽然看起来步骤多一些,但比起在生产环境中反复调试那些诡异的兼容性问题,前期多花这点时间通常是更划算的。相关攻略
更多
同类更新
更多
热游推荐
更多