摘要:高性能動(dòng)畫與端場(chǎng)景需要相比,移動(dòng)端需要考慮的因素也相對(duì)復(fù)雜,重點(diǎn)考慮流量功耗與流暢度。而在移動(dòng)端,我們選擇性能更優(yōu)瀏覽器原生實(shí)現(xiàn)方案動(dòng)畫。然而,動(dòng)畫在移動(dòng)多終端設(shè)備場(chǎng)景下,相比會(huì)面對(duì)更多的性能問題,主要體現(xiàn)在動(dòng)畫的卡頓與閃爍。
1.高性能CSS3動(dòng)畫
與PC端場(chǎng)景需要相比,移動(dòng)web端需要考慮的因素也相對(duì)復(fù)雜,重點(diǎn)考慮:流量、功耗與流暢度。在pc端上考慮更多的是流暢度,而mobile web中需要考慮網(wǎng)絡(luò)流量的使用和耗電情況。
關(guān)于流暢度,在前端動(dòng)畫中主要有兩種:JS動(dòng)畫與CSS3動(dòng)畫。
JS動(dòng)畫是通過JS動(dòng)態(tài)改寫樣式實(shí)現(xiàn)動(dòng)畫能力的一種方案,在PC端兼容低端瀏覽器中不失為一種推薦方案。 而在移動(dòng)端,我們選擇性能更優(yōu)瀏覽器原生實(shí)現(xiàn)方案:CSS3動(dòng)畫。然而,CSS3動(dòng)畫在移動(dòng)多終端設(shè)備場(chǎng)景下,相比PC會(huì)面對(duì)更多的性能問題,主要體現(xiàn)在動(dòng)畫的卡頓與閃爍。
提升CSS3動(dòng)畫:
(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)動(dòng)畫過程閃爍
通常發(fā)生在動(dòng)畫開始,嘗試使用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
一個(gè)元素通過translate3d右移500px的動(dòng)畫流暢度高于使用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變形會(huì)消耗更多的內(nèi)存與功耗,應(yīng)確實(shí)有性能問題時(shí)才去使用它,兼在權(quán)衡。
(4)盡量少用box-shadows與gradients
box-shadows
與gradients
往往都是頁面的性能殺手,尤其是在一個(gè)元素同時(shí)都使用了它們,所以擁抱扁平化設(shè)計(jì)吧。
(5)盡量讓動(dòng)畫不在文檔流中,以減少重排
position: fixed;
position:absolute;
(6)優(yōu)化DOM layout性能
實(shí)例代碼:
// 觸發(fā)兩次 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
// 只觸發(fā)一次 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
從結(jié)果分析應(yīng)與執(zhí)行隊(duì)列有關(guān),這是瀏覽器的優(yōu)化策略。所有可觸發(fā)layout的操作都會(huì)被暫時(shí)放入 layout-queue
中,等到必須更新的時(shí)候,再計(jì)算整個(gè)隊(duì)列中所有操作影響的結(jié)果,如此就可只進(jìn)行一次的layout,從而提升性能。
2.CSS動(dòng)畫屬性性能
CSS動(dòng)畫屬性會(huì)觸發(fā)整個(gè)頁面的重排relayout、重繪repaint、重組recomposite
Paint通常是其中最花費(fèi)性能的,盡可能避免使用觸發(fā)paint的CSS動(dòng)畫屬性,這也是為什么我們推薦在CSS動(dòng)畫中使用webkit-transform: translateX(3em)
的方案代替使用left: 3em
,因?yàn)?code>left會(huì)額外觸發(fā)layout與paint,而webkit-transform
只觸發(fā)整個(gè)頁面composite
推薦一個(gè)超小手勢(shì)庫AlloyFinger原理:https://github.com/AlloyTeam/AlloyCrop/blob/master/asset/alloyfinger.md
裁剪解決方案:https://github.com/AlloyTeam/AlloyCrop
小程序、小游戲以及web通用canvas渲染引擎:https://github.com/dntzhang/cax
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/1998.html
摘要:介紹微信風(fēng)格的,與客戶端體驗(yàn)一致,這個(gè)自己去微信上看吧,略。微信調(diào)試一件套,網(wǎng)頁授權(quán)模擬集成代理遠(yuǎn)程調(diào)試。這些在微信開發(fā)者中心有介紹,略。年微信開發(fā)經(jīng)驗(yàn)的人,終于又成為了零年開發(fā)經(jīng)驗(yàn)的人,重新走上了踩坑之路。 showImg(https://segmentfault.com/img/bVtEd1);活動(dòng)地址:http://fequan.com/2016/ 注意:英文不好,小記也帶有自己...
摘要:我聽不太懂了內(nèi)存管理日后需要解決不應(yīng)該合并小的請(qǐng)求升級(jí)成本可能會(huì)有多頁面構(gòu)建工程歡迎社區(qū)人士來搞尤大說盡量少用會(huì)有副作用值得借鑒的啊勾股建議全局現(xiàn)階段停留在底層,不能完全解決,還是需要框架 主持人:陰明 virtual dom 然后balabala(走神了- -) 尤小右 服務(wù)端渲染:流式渲染v-model用在自定義組件業(yè)務(wù)邏輯的組建需要可服用的 需要注意父子組件的解耦(不推薦雙向綁定...
摘要:由我所在的團(tuán)隊(duì)共同翻譯完成,并發(fā)布在前端技術(shù)公眾號(hào)方凳雅集上,轉(zhuǎn)載于此。在移動(dòng)端,客戶端渲染很難獲得并保持一個(gè)較快的渲染速度。使用技術(shù)進(jìn)行服務(wù)端渲染的主要問題在于它會(huì)對(duì)可交互時(shí)間有明顯的負(fù)面影響,盡管它縮短了首次繪制時(shí)間 本文簡單介紹了web應(yīng)用各種渲染方案,其中包括客戶端渲染、服務(wù)器端渲染等各種渲染方案。文章翻譯自:https://developers.google.com...。由...
摘要:由我所在的團(tuán)隊(duì)共同翻譯完成,并發(fā)布在前端技術(shù)公眾號(hào)方凳雅集上,轉(zhuǎn)載于此。在移動(dòng)端,客戶端渲染很難獲得并保持一個(gè)較快的渲染速度。使用技術(shù)進(jìn)行服務(wù)端渲染的主要問題在于它會(huì)對(duì)可交互時(shí)間有明顯的負(fù)面影響,盡管它縮短了首次繪制時(shí)間 本文簡單介紹了web應(yīng)用各種渲染方案,其中包括客戶端渲染、服務(wù)器端渲染等各種渲染方案。文章翻譯自:https://developers.google.com...。由...
摘要:如果說用一句話來概括那就是它開啟了服務(wù)器端語言。系列的文章并不會(huì)從一開始長篇概論的講的歷史,安裝,以及其他很瑣碎的事情。只會(huì)專門介紹關(guān)于或者準(zhǔn)確來講是關(guān)于的敏捷開發(fā)。性能不對(duì)已有的特性進(jìn)行二次抽象,我們只是在它之上擴(kuò)展了應(yīng)用所需的基本功能。 如果說用一句話來概括Node那就是:它開啟了JavaScript服務(wù)器端語言。 Node系列的文章并不會(huì)從一開始長篇概論的講Node的歷史,安裝,...
閱讀 740·2023-04-25 19:43
閱讀 3986·2021-11-30 14:52
閱讀 3816·2021-11-30 14:52
閱讀 3873·2021-11-29 11:00
閱讀 3808·2021-11-29 11:00
閱讀 3907·2021-11-29 11:00
閱讀 3584·2021-11-29 11:00
閱讀 6197·2021-11-29 11:00