之前一直以为css3的才是最厉害的,但是最近做html5页面发现在微信上的效果不是太好。
最近发现的github上比较火的velocity.js,作者宣称要做dom动画方面的领导者,完全颠覆了我的认识啊。
相关链接:
css vs. js animation: which is faster?
回复内容:稍微做过一点点 web app,目前深陷在 android webview 里不能自拔,来谈一点看法。
1. 在现代pc 浏览器上,css3 animation 和 transition 好写好用,流畅丝滑,而且动画过程0 gc。当然js 控制dom动画如果控制好了,不要频繁reflow,动画也流畅。
2. 在 ios safari 上,css3 动画和js动画都容易搞流畅,只要别reflow。
3. 在 ios webview 上,不能用jit,js性能下降严重,如果css3动画能解决还是别用js。某个版本ios之后这个限制解除了好像,不太了解。
4. 低版本 android 用的是很老的 webkit,没有硬件加速,css3支持不完全,2d canvas有bug,性能比chrome 差老远了,如果动画复杂又大块,dom树复杂,还用了box-shadow 之类很耗性能的样式,很难做流畅。
这种情况请考虑 chrome on android,或者crosswalk。
5. android 4.4 以后,系统自带chromium,体验能做到与ios safari不相上下。
====
另外多提一句gc。
gc 你听过吧?如果不用css3 animation 和 transition,就要用 requestanimationframe() 。在动画的过程中会不断调用js,消耗内存,一段时间之后触发gc,如果gc时间超出frame budget,动画会卡顿。
如果非要用js动画,那么也请考虑使用无reflow 的 transform属性,加上 translatez(0) 强制指定硬件加速。js 动画也是通过更改 css 实现的。
而且从设计的角度来说,css 本身就是设计用来表现样式,js 控制逻辑。js 动画是 css3 出现之前的曲线救国。
个人觉得,简单的动画还是用 css 做,特别复杂的再用 js。
codepen 上面的趋势是去 js 化,动画一律用 css 实现。借助 less 等预编译语言可以做出很复杂的动画。
性能的话,短期手机浏览器可能对 css3 支持不太好,但长期一定是会优于 js 的。其实这个。。。。。看引擎的。。。。
chrome上css3明显流畅过js,ie11上的js动画如丝般顺滑。。。。动画的性能的关键,不在于js执行的效率,而在于dom结构。所以css原生动画,与js动画并不会相差太大。
优化动画性能,就要减轻dom,使用合理的定位方式,等等。这种对比应该还是要来个例子。
这是前几天我翻译一篇文章时看到的对比building great mobile menus (为你的网站创建移动菜单)
对了,我的翻译只是为了自己总结学习,有精简很多。。建议看原文=-=
不是涉及复杂的计算,css明显快,但是涉及到复杂的计算,比如点是不确定的,你还是要用js。
其实这种对比个人感觉没什么意义(可能是我水),在项目中, 大多数情况下-0-你都要用js来计算。js+canvas(html5)+水平>css3>js+dom就说一点,js动画比css3动画有控制,且没有兼容性问题从原理上来说的话
css == ios
js == android
(以20马赫快速逃跑中个人项目体会:
在没有raf时,css方式流畅度占优。
有raf后两者相当。
js方式要求开发人员对js足够熟悉,以避免引入其他问题其实这点差别在实际大部分使用情况下并木有卵区别……