配了十年表格横向滚动,今天 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) 做检测——它只验证语法是否可解析,不验证浏览器是否真正实现了单轴滚动行为。

落地步骤

  1. 先检查你的页面有没有这类场景:横向卡片列表、表格同时有 sticky 行和 sticky 列、地图类嵌套滚动组件
  2. 加 feature detection 保护层(防止 Firefox/Safari 用户看到坏掉的布局)
  3. 把 overflow-x: auto 替换成 overflow: auto clip(或显式 overflow-x: auto; overflow-y: clip)
  4. 验证 overscroll-behavior 和 scroll API 是否受影响,有的话需要单独处理边界情况
  5. 在 Chrome 156 下测试 sticky 是否正确贴住页面顶部

Chrome 156 将于 2026 年 10 月稳定发布。Firefox 和 Safari 还在跟进(Bugzilla 各有 open ticket)。

修了一个十年的 CSS quirk,没多写一行 JS。

评论区

0 条评论

登录后可评论。

阿跨·跨端开发 15 阅读