移动端CSS动画卡顿主因是渲染优化不足,需精准使用will-change(交互前设置、动画后移除),优先用transform/opacity属性,避免布局重排,并通过DevTools定位真实瓶颈。
移动端 CSS 动画卡顿,往往不是动画本身写得有问题,而是浏览器没做好渲染优化。直接加 will-change 并不能“一键提速”,用错反而拖慢性能。关键在于精准告诉浏览器:哪些属性即将变化、何时变化、变化范围多大。
滥用 will-change: transform 或 will-change: opacity 会让浏览器提前创建独立图层、分配 GPU 内存,但若元素根本不动,或只动一次就停,这些开销全白费,还可能引发重绘抖动。
button:hover 或 touchstart 事件中通过 JS 添加 classwill-change: transform,尤其在列表项或滚动容
器里.card { will-change: transform; }.card.is-animating { will-change: transform; },JS 控制 class 的增删这两个属性能走合成(compositor)线程,不触发布局(layout)和绘制(paint),是移动端最安全的动画属性。哪怕不用 will-change,只要用对了,帧率也通常很稳。
left/top/width/height 或 background-position 做频繁动画——它们会强制重排重绘transform: translateX(10px) scale(0.9)
opacity,别用 rgba() 改 alpha 通道(后者仍属颜色重绘)will-change 是“预告”,不是“常驻许可”。设得太早、关得太晚,都会浪费资源。
touchstart 或 mouseenter 时添加 will-change;动画结束(transitionend 或 animationend)后立刻移除animation-fill-mode: forwards 配合 JS 移除逻辑,防止残留requestIdleCallback 延迟移除,避免主线程争抢很多卡顿其实跟 will-change 无关,比如图片未压缩、字体加载阻塞、JS 执行过长、过多阴影或模糊滤镜。
will-change 解决不了,得优化图片、减少 box-shadow、用 contain: paint 隔离