前端小記4——高效能mobile web開發

TiffanyZZ發表於2018-07-19

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-shadowsgradients往往都是頁面的效能殺手,尤其是在一個元素同時都使用了它們,所以擁抱扁平化設計吧。

(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

 

相關文章