JS動畫比CSS3動畫性能誰更好?
之前一直以為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 的。css3的動畫適合dom樹不是很複雜的結構,是方便的小型動畫工具。對於大型動畫,建議用刷新頻率較高的庫,這些庫都是web animation的變種。
js+canvas(html5)+水平&>css3&>js+dom
JS動畫特指canvas動畫嗎?但是js也可以操作CSS做動畫呀。性能方面,其實最主要的是看使用者的水平。
CSS雖然是由瀏覽器實現,按理在瀏覽器支持的前提下性能會更好,然而使用者如果加入了其他干擾,發生頻繁的重繪或者迴流,自然性能就差了。
JS我猜測是說的是Canvas動畫,因為他沒有迴流,所以自然性能比有迴流的CSS動畫性能要好了。從原理上來說的話
CSS == iOSJS == Android(以20馬赫快速逃跑中就說一點,JS動畫比CSS3動畫有控制,且沒有兼容性問題
其實這個。。。。。看引擎的。。。。chrome上css3明顯流暢過js,IE11上的js動畫如絲般順滑。。。。
我覺得如果能用css3 Animation去做就用它來做,如果不能就再加js去控制
這種對比應該還是要來個例子。
這是前幾天我翻譯一篇文章時看到的對比Building Great Mobile Menus (為你的網站創建移動菜單)對了,我的翻譯只是為了自己總結學習,有精簡很多。。建議看原文=-=不是涉及複雜的計算,css明顯快,但是涉及到複雜的計算,比如點是不確定的,你還是要用js。其實這種對比個人感覺沒什麼意義(可能是我水),在項目中, 大多數情況下-0-你都要用js來計算。動畫的性能的關鍵,不在於js執行的效率,而在於dom結構。所以css原生動畫,與js動畫並不會相差太大。優化動畫性能,就要減輕dom,使用合理的定位方式,等等。
個人項目體會:
在沒有RAF時,css方式流暢度佔優。有RAF後兩者相當。
js方式要求開發人員對js足夠熟悉,以避免引入其他問題其實這點差別在實際大部分使用情況下並木有卵區別……
推薦閱讀:
※怎樣以簡單易懂方式向普通人解釋 HTML5 對 HTML 技術的改進?
※學習路途迷茫,請各位前端大佬幫忙制定學習路線,我該如何入坑?
※input type="submit" 和"button"有什麼區別?
※有HTML / XML這麼好的前端及UI解決方案,微軟為什麼還要繼續推WPF?
TAG:前端開發 | JavaScript | HTML5 | CSS3 |