ios 15 及更早版本不支持 overscroll-behavior,因 webkit 直至 ios 16.4 才首次实现且仅支持 contain;即使升级后,也需同时满足 overflow-y 为 auto/scroll、容器有明确高度、内容真实溢出三条件,并避开 transform/will-change 等禁用声明;根元素 body/html 上该属性被 webkit 明确禁止。

为什么 overscroll-behavior 在 iOS 15 及更早版本中完全不生效
因为 WebKit 直到 iOS 16.4 才首次实现 overscroll-behavior,且仅支持 contain 值;iOS 15 及之前所有版本的渲染引擎压根没有该属性的解析逻辑,写上去等于注释。
写了 contain 却被静默忽略的三个硬条件
即使升级到 iOS 16.4+,overscroll-behavior: contain 也只在满足全部三条件时才激活:
-
overflow-y必须显式设为auto或scroll(hidden、未声明、或仅靠min-height撑高都不算) - 滚动容器必须有明确高度:用
height: 70vh、max-height: 400px等,不能是height: auto或依赖 Flex 自动计算 - 内容必须真实溢出——空 div 加
overflow-y: auto不触发滚动上下文,属性直接跳过
父级 transform/will-change 会直接禁用该属性
iOS Safari 对滚动链异常敏感,只要祖先元素含以下任一声明,overscroll-behavior 就会被强制忽略:
-
transform: translateZ(0)或任何非none的transform -
will-change: transform、will-change: scroll-position -
-webkit-overflow-scrolling: touch(旧式 iOS 滚动优化,与新属性互斥)
这些声明会创建新层叠上下文或覆盖滚动根节点,导致浏览器无法建立有效的“滚动传播链”,overscroll-behavior 失去作用对象。
为什么 body/html 上加了也完全没反应
不是选择器写错,是 WebKit 明确禁止在根元素上启用该属性。DevTools 中 body { overscroll-behavior: contain } 会显示为灰色禁用状态,computed 值为空。系统把视口级橡皮筋行为锁死在 WebView 底层,CSS 无权干预——真正起效的只能是 .modal__content、#app 这类实际发生滚动的子容器。
overscroll-behavior 不控制“能不能滚动”,只干预“滚到头之后怎么办”。旧版 iOS 连这个“之后”都还没实现。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











