iOS Safari 滚动驱动图片动画抖动问题排查求助
哥们,我之前也踩过iOS Safari上滚动驱动动画抖动的坑,结合你描述的场景——用transform: translate3d+GSAP ScrollTrigger做的图片滚动动画,桌面Chrome正常、iOS Safari抖,不松手滚动没事一滑就抖,will-change也不管用——给你梳理几个可能的原因和对应的排查/解决方向:
iOS惯性滚动阶段的线程冲突
你说的“不松手不抖、滑动松手就抖”是关键!iOS Safari的惯性滚动(就是松手后页面自己滑的阶段),浏览器的主线程很容易被一些隐性任务(比如页面悄悄重绘、后台JS微任务)抢占资源,而transform动画是靠合成线程跑的,一旦主线程卡了,合成线程的帧更新就会被打断,直接表现就是抖动。
你可以用Safari的Web Inspector开Timeline面板,录一段惯性滚动的过程,看看有没有超过16ms的长任务占着主线程。解决的话,把和动画无关的JS逻辑(比如统计、懒加载)要么延迟到滚动结束再执行,要么用requestIdleCallback丢到空闲时间跑。硬件加速的“隐形失效”问题
虽然translate3d一般会触发硬件加速,但iOS Safari在某些场景下(比如动画元素父级有overflow: scroll、元素带透明效果、图层层级复杂),会偷偷把合成层合并回去,导致动画从GPU又切回CPU渲染,自然就抖了。
你可以在Web Inspector的Layers面板看看动画元素是不是一直保持独立合成层。解决的话,试试给动画元素再加个transform: translateZ(0)强制锁死硬件加速;如果父元素有overflow属性,要么去掉,要么给父元素也加个硬件加速属性;另外检查下元素有没有opacity或者filter,这些属性很容易搞乱合成层。GSAP ScrollTrigger的监听适配问题
iOS Safari的滚动事件触发频率和桌面端不一样,尤其是惯性滚动阶段,事件间隔不稳定。如果ScrollTrigger的监听逻辑没适配iOS的特性,就会导致动画更新跟不上滚动节奏,出现抖动。
你可以先写个原生的scroll事件+requestAnimationFrame的简单滚动动画试试,如果原生的不抖,那问题大概率在GSAP的配置上。可以试试调整scrub参数(比如设成0.1代替true,给动画加一点延迟缓冲),或者开启ScrollTrigger的smoothScrubbing配置;另外检查下是不是同时跑了多个ScrollTrigger实例,资源占太多了。原生橡皮筋滚动的干扰
iOS Safari的原生滚动有橡皮筋(bounce)效果,当滚到页面顶/底部时,浏览器会额外触发滚动动画,这会打乱自定义动画的帧同步,导致抖动。如果你的页面不需要橡皮筋效果,可以加overscroll-behavior: none禁用,但要注意这会影响原生滚动的体验;如果必须保留,那就得在滚动到边界时暂停或者调整动画的更新逻辑。
备注:内容来源于stack exchange,提问作者Daler

