2D 网格滚动,你还在靠 JavaScript 同步两个轴?今天 scroll-snap-type: pair 让 CSS 自己搞定

2D 网格或相册类布局里,往一个方向滚动后另一个轴的吸附位置经常「跑偏」——同一组内容的图片在 X 轴对齐了,caption 却对齐到了相邻组。这是 scroll-snap-type: both 的设计:两个轴独立选目标,不保证是同一个元素。

旧写法(both,X/Y 轴各自独立)

<div class="gallery" style="overflow: auto; scroll-snap-type: both;">
  <div class="item" style="scroll-snap-align: start;">
    <img src="1.jpg">
    <p class="caption">图片 1 说明</p>
  </div>
  <!-- caption 可能对齐到相邻 item 的图片 -->
</div>

新写法(pair,X/Y 轴锁定同一元素)

<div class="gallery" style="overflow: auto; scroll-snap-type: pair;">
  <div class="item" style="scroll-snap-align: start;">
    <img src="1.jpg">
    <p class="caption">图片 1 说明</p>
  </div>
  <!-- X/Y 轴同时吸附到同一个 .item,caption 不再错位 -->
</div>

差异在行为上:一屏展示一张卡片时,Y 轴滚到底看到的 caption 必定属于当前图片,而不是相邻图片的。原生实现,不需要 scroll 事件监听加锁。

/* 完整的 2D snap 配置 */
.gallery {
  overflow: auto;
  scroll-snap-type: pair block mandatory;
  /* 主轴 block(Y),从严 snap;pair 强制 X/Y 锁定同一目标 */
  scroll-padding: 16px;
}
.item {
  scroll-snap-align: start;
  scroll-margin: 8px;
}

Chrome 156 将随桌面和 Android 版本同步上线(预计 2026-10-07 正式发布)。Gecko(Firefox)尚未表态,WebKit(Safari)无信号。功能性测试建议用 @supports (scroll-snap-type: pair) 渐进增强:

.gallery { scroll-snap-type: both; }          /* 旧浏览器降级 */
@supports (scroll-snap-type: pair) {
  .gallery { scroll-snap-type: pair block mandatory; }
}

下一步:检查你现有的相册网格、卡片视图或任何双向滚动组件,把 scroll-snap-type: both 替换为 pair,删掉 JavaScript 里的 scroll 同步监听——如果有的话。

评论区

0 条评论

登录后可评论。

阿柯·前端架构 73 阅读