1.高性能CSS3動畫 與PC端場景需要相比,移動web端需要考慮的因素也相對複雜,重點考慮:流量、功耗與流暢度。在pc端上考慮更多的是流暢度,而mobile web中需要考慮網路流量的使用和耗電情況。 關於流暢度,在前端動畫中主要有兩種:JS動畫與CSS3動畫。 JS動畫是通過JS動態改寫樣式實現 ...
1.高性能CSS3動畫
與PC端場景需要相比,移動web端需要考慮的因素也相對複雜,重點考慮:流量、功耗與流暢度。在pc端上考慮更多的是流暢度,而mobile web中需要考慮網路流量的使用和耗電情況。
關於流暢度,在前端動畫中主要有兩種:JS動畫與CSS3動畫。
JS動畫是通過JS動態改寫樣式實現動畫能力的一種方案,在PC端相容低端瀏覽器中不失為一種推薦方案。 而在移動端,我們選擇性能更優瀏覽器原生實現方案:CSS3動畫。然而,CSS3動畫在移動多終端設備場景下,相比PC會面對更多的性能問題,主要體現在動畫的卡頓與閃爍。
提升CSS3動畫:
(1)儘量利用硬體能力,如使用3D變形來開啟GPU加速
-webkit-transform: translate3d(0,0,0);
-moz-transform: translate3d(0,0,0);
-ms-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
(2)動畫過程閃爍
通常發生在動畫開始,嘗試使用hack
-webkit-backface-visibility: hidden;
-moz-backface-visibility:hidden;
-ms-backface-visibility:hidden;
backface-visibility:hidden;
-webkit-perspective: 1000;
-moz-perspective: 1000;
-ms-perspective: 1000;
perspective: 1000;
(3)translate3d
一個元素通過translate3d右移500px的動畫流暢度高於使用left
#ball-2 { transition: left .5s ease; left: 0; } #ball-2.slidein { left: 500px; }
#ball-1 {
transition: -webkit-transform .5s ease;
-webkit-transform: translate3d(0, 0, 0);
}
#ball-1.slidein {
-webkit-transform: translate3d(500px, 0, 0);
}
註:3D變形會消耗更多的記憶體與功耗,應確實有性能問題時才去使用它,兼在權衡。
(4)儘量少用box-shadows與gradients
box-shadows
與gradients
往往都是頁面的性能殺手,尤其是在一個元素同時都使用了它們,所以擁抱扁平化設計吧。
(5)儘量讓動畫不在文檔流中,以減少重排
position: fixed;
position:absolute;
(6)優化DOM layout性能
實例代碼:
// 觸發兩次 layout var newWidth = aDiv.offsetWidth + 10; // Read aDiv.style.width = newWidth + 'px'; // Write var newHeight = aDiv.offsetHeight + 10; // Read aDiv.style.height = newHeight + 'px'; // Write
// 只觸發一次 layout
var newWidth = aDiv.offsetWidth + 10; // Read
var newHeight = aDiv.offsetHeight + 10; // Read
aDiv.style.width = newWidth + 'px'; // Write
aDiv.style.height = newHeight + 'px'; // Write
從結果分析應與執行隊列有關,這是瀏覽器的優化策略。所有可觸發layout的操作都會被暫時放入 layout-queue
中,等到必須更新的時候,再計算整個隊列中所有操作影響的結果,如此就可只進行一次的layout,從而提升性能。
2.CSS動畫屬性性能
CSS動畫屬性會觸發整個頁面的重排relayout、重繪repaint、重組recomposite
Paint通常是其中最花費性能的,儘可能避免使用觸發paint的CSS動畫屬性,這也是為什麼我們推薦在CSS動畫中使用webkit-transform: translateX(3em)
的方案代替使用left: 3em
,因為left
會額外觸發layout與paint,而webkit-transform
只觸發整個頁面composite
推薦一個超小手勢庫AlloyFinger原理:https://github.com/AlloyTeam/AlloyCrop/blob/master/asset/alloyfinger.md
裁剪解決方案:https://github.com/AlloyTeam/AlloyCrop
小程式、小游戲以及web通用canvas渲染引擎:https://github.com/dntzhang/cax