配了十年表格横向滚动,今天 Chrome 156 用一个关键字把 sticky 表头彻底原生化了
做表格页面最怕什么?表头 sticky 失效。
Chrome 156(2026 年 10 月)把这件事用一对 CSS 关键字彻底修掉了。
这个问题困了开发者十年
CSS 有一个鲜为人知的 quirk:你给一个容器写了 overflow-x: auto,浏览器并不会乖乖只让横向可滚动。它会悄悄把 overflow-y 也计算成 auto,把这个容器变成一个二维滚动容器。
结果就是:position: sticky 在查找「最近的滚动祖先」时,找的是这个 wrapper,而不是页面的根滚动容器。你写的 top: 0 根本贴不到页面顶部去。
这个问题有多普遍?早在 2017 年 1 月,W3C CSS WG 就收到了第一个 issue(#865),主题是「在 overflow: hidden/auto 父容器里支持 position: sticky」。这个问题一拖就是将近十年。
十年的 workaround 是什么?写 JS,用 ScrollObserver 监听滚动,手动计算 sticky 的位置——然后在不支持的环境里还得写 fallback。
Chrome 156:从两个 API 修一个坑
Single-axis scroll containers 是 CSS Overflow Level 5 规范的一部分,Chrome 156 把它稳定化了。
核心改动:允许 overflow 的四个值(auto / scroll / hidden)和 clip 组合,形成「只在这个轴可滚动,另一轴只裁切」的行为。
/* 修 sticky 表头 */
.table-wrapper {
/* 旧写法:横向滚,但 overflow-y 会被浏览器强制改成 auto */
/* overflow-x: auto; */
/* 新写法:明确告知浏览器只在 inline 轴建滚动容器 */
overflow: auto clip;
}
配上 sticky 表头:
.table-wrapper {
overflow: auto clip; /* ← 关键:clip 不会建立滚动上下文 */
}
.table-wrapper thead {
position: sticky;
top: 0; /* 现在 sticky 会正确追踪页面根滚动容器 */
}
非要用分开写也可以:
.table-wrapper {
overflow-x: auto;
overflow-y: clip; /* 显式 clip,阻止第二轴建立滚动容器 */
}
真实副作用:190 个网站测过,有这些变化
官方团队在稳定发布前测试了 190 个网站,发现这个改动会连带影响三个 scroll 相关 API:
1. overscroll-behavior 在 clip 轴不再触发
/* 原来 pull-to-refresh 正常工作的页面 */
.thing {
overscroll-behavior-y: contain; /* 在单轴容器上,这个行为会失效 */
}
因为被 clip 的轴不再是滚动容器,overscroll-behavior 不会触发。Chrome 156 已和 Firefox/Safari 行为对齐。
2. scroll API 在 clip 轴强制限制
// 原来:overflow: hidden 的容器里调用 scrollTo() 可以滚动
wrapper.scrollTo({ top: 100 });
// 现在:overflow: auto clip 的容器里,对 clip 轴调用 scrollTo() 直接被拒绝
// 浏览器强制执行 programmatische scroll 限制
3. Flex/Grid 最小尺寸计算变化
这个最隐蔽:在 flex/grid 布局里,min-width: auto(默认最小尺寸)通常会被忽略,让子元素填满可用空间。但加了 overflow: clip 之后,这个默认值反而开始生效了,flex/grid 容器可能变大。
feature detection:一句 CSS 搞定
规范里新增了 @supports named-feature() 语法,专门检测这种「行为级」CSS 特性:
@supports named-feature(single-axis-scroll-container) {
.table-wrapper {
overflow: auto clip;
}
/* sticky 直接生效,无需 JS */
thead { position: sticky; top: 0; }
}
JS 检测:
if (CSS.supports('named-feature(single-axis-scroll-container)')) {
// 浏览器已支持,放心用纯 CSS
} else {
// 回退到 ScrollObserver 方案
}
注意:不能用 @supports (overflow: auto clip) 做检测——它只验证语法是否可解析,不验证浏览器是否真正实现了单轴滚动行为。
落地步骤
- 先检查你的页面有没有这类场景:横向卡片列表、表格同时有 sticky 行和 sticky 列、地图类嵌套滚动组件
- 加 feature detection 保护层(防止 Firefox/Safari 用户看到坏掉的布局)
- 把
overflow-x: auto替换成overflow: auto clip(或显式overflow-x: auto; overflow-y: clip) - 验证 overscroll-behavior 和 scroll API 是否受影响,有的话需要单独处理边界情况
- 在 Chrome 156 下测试 sticky 是否正确贴住页面顶部
Chrome 156 将于 2026 年 10 月稳定发布。Firefox 和 Safari 还在跟进(Bugzilla 各有 open ticket)。
修了一个十年的 CSS quirk,没多写一行 JS。
评论区
登录后可评论。