移动端transform动画出现元素抖动是怎么回事?
在给移动端H5页面添加图片缩放动画时,用transform: translate(scale)做了缩放,但运行时元素边缘会出现1-2帧的抖动。已经试过加will-change: transform和设置backface-visibility: hidden,但效果不明显。
具体场景是点击按钮让图片从100%缩放到110%,用CSS动画实现:
@keyframes zoom {
0% { transform: scale(1); }
100% { transform: scale(1.1);
}
但每次动画结束时右下角像素点会有跳动,真机测试在iOS和安卓都有这个问题,求大佬指点
动画结束时的跳动通常是因为缩放后元素边界落在非整数像素上,加一行
transform: scale(1.1) translateZ(0);强制硬件加速且对齐像素。will-change和backface-visibility了,但还是有跳动,那可能是浏览器渲染时对小数点精度的处理问题。试试在动画元素上加这个属性:
transform-origin: 0 0;默认的缩放中心点是元素的中心,改成左上角可能会减少边缘像素的计算误差。另外,动画结束时的跳动可能是因为最终的
scale(1.1)没有精确对应到像素点。可以在动画结束后用 JavaScript 把最终的尺寸固定下来:这样就把动画结束后的状态直接变成固定的尺寸,避免浏览器再重新计算。
如果还不行,那就可能是硬件加速的问题,可以试试给动画元素加个透明的
filter,比如filter: opacity(99.9%);这招有时候能强制开启GPU加速。实在不行就只能用JS来做动画了,虽然麻烦点,但能完全控制每一帧的表现。