删掉 -webkit-overflow-scrolling: touch 是第一件事,该属性在 ios 15.4+/safari 16+ 中已被忽略或降级,反而引发 fixed 错位、下拉刷新失灵、惯性丢失和掉帧;滚动容器须设确定高度(如 100dvh)、加 will-change: scroll-position,并确保 touchmove/scroll 事件监听器启用 { passive: true }。

删掉 -webkit-overflow-scrolling: touch 是第一件事
这个属性在 iOS 15.4+/Safari 16+ 中已被浏览器主动忽略或降级处理,加了反而触发旧滚动线程,导致 fixed 元素错位、下拉刷新失灵、惯性丢失、掉帧更严重。DevTools 的 Elements 面板里搜一下,只要存在就删;还要检查 JS 是否动态注入(比如某些 UI 库初始化时偷偷加上)。
滚动容器必须有确定高度 + 合成层提示
iOS Safari 只有明确知道“可滚动范围”,才会激活原生滚动上下文和惯性。靠 height: auto、flex 内容撑开、或 100vh(地址栏展开时塌缩)都会让容器失效。
- 给滚动容器设
height、max-height或100dvh(别用100vh) - Flex 容器中父项需加
min-height: 0 - 加
will-change: scroll-position提示 iOS 15+ 创建合成层(旧版无效,别滥用) - 移除所有干扰合成层的祖先样式:
filter、opacity: 0.99、backdrop-filter、mask
touchmove 和 scroll 事件必须带 { passive: true }
这是最常被跳过、效果却最立竿见影的一环。不设该选项,iOS Safari 会暂停滚动等待 JS 回调返回,帧率可能从 60fps 直接掉到 20fps。
- 错误写法:
el.addEventListener('touchmove', handler) - 正确写法:
el.addEventListener('touchmove', handler, { passive: true }) - 同理适用于
scroll:el.addEventListener('scroll', handler, { passive: true }) - 需要阻止默认行为(如拖拽排序)?改用
touchstart+e.preventDefault(),别在scroll里调
别乱用 will-change: transform 或 translateZ(0)
对滚动容器本身加 transform: translateZ(0) 在 iOS 12–15 中可能有用,但在 iOS 15+ 已非必需;而给每个列表项(如 .item)加 will-change: transform 是典型翻车操作——一屏 10 个,滚动中常驻 20+ 图层,中低端安卓机显存吃紧,帧率直接跌破 20fps。
真正起效的是容器是否建立了稳定的合成层、事件链是否畅通、高度是否可计算——这些点一旦漏掉一个,光靠加属性是补不回来的。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











