安卓WebView和iOS UIWebView处理CSS3D动画差异大怎么办?
最近在做电商H5页面,用CSS3D动画做商品悬浮效果时遇到问题。在iOS的UIWebView里滑动流畅,但安卓的WebView经常出现卡顿,尤其是低版本系统。我试过把translateZ(0)改成translate3d(0,0,0),也加了will-change: transform,但小米和魅族的机型还是有明显延迟。
代码是这样写的:
.product-box {
transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);
backface-visibility: hidden;
perspective: 1000px;
}
难道要针对每个安卓厂商做特殊适配?有没有更通用的解决方案?
先说解决方案:把动画从CSS里抽出来,用requestAnimationFrame配合transform来实现。安卓对JS动画的优化比CSS好得多,而且能绕过部分厂商定制ROM的坑。
具体做法是这样的:给需要动画的元素加个标识类,然后在JS里控制它的位移。代码可以这么写:
记得把原先的CSS动画去掉,只保留基础样式。这个方法有几个好处:一是能精确控制每一帧的渲染时机,二是避免了CSS动画在安卓上的重绘问题,三是兼容性更好。
另外提醒一下,安卓4.4以下的WebView基本没法救,建议直接降级效果或者给用户提示。还有就是别忘了判断设备性能,在低端机上可以把动画间隔拉大点,比如改成200ms更新一次,这样能节省不少资源。
最后吐槽一句,安卓碎片化真是让人头大,不过用JS动画至少能保证大部分机型的表现一致。
还有一个办法是结合opacity和动画关键帧,比如用@keyframes控制透明度变化来触发GPU加速。另外,试试看在主题里加个-webkit-transform-style: preserve-3d,虽然看起来没啥用,但在某些安卓机器上确实能改善卡顿。
如果实在不行,可以考虑降级处理,根据UA判断安卓设备后改用2D动画或者直接关闭悬浮效果。WordPress里用wp_is_mobile()加个判断也不是不行,但要注意别影响iOS体验。这破事我折腾了大半天,最后还是用回2D算了。