scroll-snap-type 必须作用于显式可滚动容器,否则全屏滚动不会触发;需新建包裹层并设 height: 100vh、overflow-y: scroll 和 scroll-snap-type: y mandatory,同时 section 需固定尺寸并配 scroll-snap-align。

scroll-snap-type 必须作用于显式可滚动容器,否则全屏滚动根本不会触发——这是绝大多数人写完代码却“不动”的根本原因。
为什么直接在 body 或 html 上设 scroll-snap-type 会失效
浏览器只对「有溢出内容 + 显式设置了 overflow-y: scroll(或 auto)」的元素应用 scroll-snap-type。而默认情况下,body 的滚动由 html 承担;html 又常被视口撑满、无内容溢出,导致 snap 完全不计算。
- 不要给
html或body直接加scroll-snap-type: y mandatory - 必须新建一个包裹层,比如
<div class="scroll-container"></div> - 该容器需明确设
height: 100vh(不能用min-height或靠内容撑开) - 同时设
overflow-y: scroll和scroll-snap-type: y mandatory -
html和body需重置:margin: 0; padding: 0; height: 100%
section 必须显式声明尺寸与停靠对齐方式
scroll-snap-align 不是“建议停靠”,而是强制锚点。如果 section 高度不固定、被 flex 拉伸、或依赖内容自适应,浏览器无法确定停靠位置,就会跳过 snap 或错位。
- 每个
section必须设height: 100vh(垂直滚动)或width: 100vw(水平滚动) - 必须配
scroll-snap-align: start(顶部对齐)或center(居中对齐);只写scroll-snap-align不加值无效 - 禁用
margin-top/margin-bottom——它会改变offsetTop,导致视觉停靠偏移 - 避免用
flex: 1或min-height替代固定高度
移动端必须处理 overscroll-behavior 和 touch-action
iOS Safari 默认开启弹性回弹,滚动到底部时拉出空白再回弹,不仅破坏沉浸感,还会让 window.scrollY 在回弹阶段返回异常值,干扰 JS 判断逻辑。
- 在滚动容器上加
overscroll-behavior-y: contain,彻底禁用纵向回弹 - 横向滚动(如相册)必须加
touch-action: pan-x,否则 iOS 会锁死横向滑动 - 不要在滚动容器内监听
touchstart或touchmove,哪怕空回调也会触发passive event warning,拖慢滚动帧率 - 隐藏滚动条要分浏览器写死:
::-webkit-scrollbar { display: none }(Chrome/Edge),scrollbar-width: none(Firefox),Safari 需配合overflow: hidden+ 外层遮罩
scroll-snap 就只是 CSS 注释。



















