移动端用 transform 动画为什么卡顿?
我在做移动端的滑动菜单,用 transform: translateX() 来移动元素,但动画特别卡,不像原生那样流畅。明明加了 will-change: transform 和硬件加速,还是不行。
这是我的关键 CSS 代码:
.menu {
transform: translateX(0);
transition: transform 0.3s ease;
will-change: transform;
}
.menu.open {
transform: translateX(200px);
}
是不是我漏了什么?安卓和 iOS 都有点掉帧,但 PC 上完全没问题……
backface-visibility: hidden;或者transform-style: preserve-3d;到你的 .menu 类里。translateX没有强制开启 3D 加速。will-change只是给浏览器一个提示,但不保证一定会创建合成层。改成这样:
用
translate3d代替translateX,强制让浏览器走 GPU 渲染通道,这是移动端动画流畅的关键。另外检查一下你的 JS 代码,确认修改 class 的同时没有触发其他会导致重排的属性,比如 width、margin、padding 这些。如果你在动画过程中还做了其他 DOM 操作或者计算密集的任务,也会导致主线程阻塞从而掉帧。
如果还是卡,可以试试在动画开始前手动触发一次 layer promotion:
基本上移动端动画卡顿就是这两个原因:要么没真正走 GPU 加速,要么主线程被其他操作阻塞了。你先改改看。