你不知道的前端性能優(yōu)化 - 布局與樣式 (二)

你不知道的前端性能優(yōu)化 - 布局與樣式 (二)

前言:所有的優(yōu)化點都有其適用的條件,所有的優(yōu)化點都能夠量化看到效果,具體項目具體分析,并不是每個項目都能適用這里的每個點,望周知。

布局與樣式

在提出優(yōu)化點之前,我們先明白幾個瀏覽器渲染的重要概念,重繪(reflow) 、 回流(repaint)和圖層(layer)。

上一篇其實應該說了一些,在整個頁面被渲染出來之前會進行 layout(布局) 和 paint (繪制)的過程。

簡單的說

? 重繪:其實就是觸發(fā)瀏覽器的 paint 的過程。

? 回流:其實不僅僅是觸發(fā)了 paint 的過程還觸發(fā) layout 的過程,觸發(fā)順序由后往前。

也就是說 回流相當于 layout -> patint ; 重繪相當于 patint的過程, 所以回流必定觸發(fā)重繪,重繪不一定觸發(fā)回流。

還有一個重要的概念 Layer (圖層),我們怎么理解它呢,其實圖層就相當瀏覽器分層的渲染策略,比如我們可以舉一些原生就會增加 Layer 的標簽: <canvas> <video> (除了這些還有,下面會講到)。當遇到這些標簽的時候,瀏覽器會生成一個新的圖層,之后該元素內(nèi)的重繪和回流的過程只存在于該圖層中,之后再進行圖層的合并過程。 那么重繪和回流的效率就會提高,額外增加了一個圖層的合并(composite Layers)的過程。

有沒有一種方式可以避免重繪和回流呢?那么就是用CSS啟用硬件加速。

硬件加速就是GPU加速很多電腦顯卡都支持GPU加速。

  1. 能觸發(fā)回流的樣式:

    width top text-align
    height bottom overflow-y
    padding left font-weight
    margin right overflow
    display position font-family
    border-width float line-height
    border clear vertival-align
    min-height white-space
    font-size
  2. 只觸發(fā)重繪的樣式:

    color background outline-color
    border-style background-image outline
    border-radius background-position outline-style
    visibility background-repeat outline-width
    text-decoration background-size box-shadow
  3. 能觸發(fā)回流js

    offsetTop scrollTop clientTop width getComputedStyle()
    offsetLeft scrollLeft clientLeft height IE的:currentStyle
    offsetWidth scrollWidth clientWidth getBoundingClientRect()
    offsetHeight scrollHeight clientHeight

    除了上面的這些還有,只要是獲取元素位置相關(guān)的,瀏覽器都會在當前時間點去計算得到該屬性,該計算的過程就會觸發(fā)回流。

  4. 開啟GPU加速的方式常見的觸發(fā)硬件加速的css屬性:

    • transform

    • opacity

    • filters

    • Will-change

      will-change介紹-來自MDN

      對于動畫的其它屬性,比如background-color,width等,還是會引起回流重繪的,不過可以提升這些動畫的性能

明白了以上的概念后,我們就可以引出下面的優(yōu)化點了。

  1. 減少回流重繪
    相對來說回流是一個性能比較低的過程。布局、定位和文字的改變往往都會觸發(fā)回流。

    對照上表有以下的優(yōu)化點,

    在布局上:

    1. 可以用translate替代top/left...改變
      本質(zhì)上是啟用了GPU加速渲染

    2. 用opacity替代visibility
      因為如果使用 opacity 不一定會產(chǎn)生重繪。

    在操作dom元素上:

    1. 不要一條一條地修改 DOM 的樣式,預先定義好 class,然后修改 DOM 的 className
    2. 把 DOM 離線后修改,比如:先把 DOM 給 display:none (有一次 Reflow),然后你修改100次,然后再把它顯示出來,當然每個瀏覽器都做了相應的優(yōu)化所以沒必要這么弄
    3. 不要把 DOM 結(jié)點的屬性值放在一個循環(huán)里當成循環(huán)里的變量,例如循環(huán)調(diào)用 getBoundingClientRect() 方法,將會導致頁面一直處于回流的過程。
    4. 不要使用 table 布局,因為你改動一點點都將影響整個 table 的布局
    5. 動畫實現(xiàn)的速度的選擇
    6. 對于動畫新建圖層
      這是一種很好的方式,之后的重繪和回流就都只在該圖層中進行了。谷歌瀏覽器創(chuàng)建圖層的條件如下:
      • 3D或透視變換(perspective transform)CSS屬性
      • 使用加速視頻解碼的<video>節(jié)點
      • 擁有3D(WebGL)上下文或加速的2D上下文的<canvas>節(jié)點
      • 混合插件(如Flash)
      • 對自己的opacity做CSS動畫或使用一個動畫webkit變換的元素
      • 擁有加速CSS過濾器的元素
      • 元素有一個包含復合層的后代節(jié)點(一個元素擁有一個子元素,該子元素在自己的層里)
      • 元素有一個z-index較低且包含一個復合層的兄弟元素(換句話說就是該元素在復合層上面渲染)
    7. 啟用 GPU 硬件加速
      使用 transform、opacity、filtersWill-change可以啟用GPU加速

    圖層不能無限制的創(chuàng)建,超過一定范圍后反而會將頁面變得更卡。這是由于圖層雖然減少了重繪和回流的時間,但是增加了圖層合并的步驟,如果很多圖層合并將導致頁面卡死。

此外還有很多種方式能夠減少布局帶來的性能損耗。js的執(zhí)行會阻塞布局的渲染所以js方面的優(yōu)化往往更優(yōu)于布局層面上的優(yōu)化,js層面上的優(yōu)化能看到的效果比較顯著,所以在真實的項目中,這種布局上的優(yōu)化往往很少人去做。

總結(jié)一下:

  1. 在布局上盡量使用GPU加速,盡量使用 transform 代替 left \ ...
  2. 對于頁面的動畫,我們最好新建圖層,把回流和重繪的消耗降低
  3. 不在 js 上持續(xù)的獲取 dom 元素的定位屬性
  4. js優(yōu)化帶來的效益高,所以布局層面上的優(yōu)化比較少人做,所以這些東西得養(yǎng)成布局習慣。

本文章由作者自學完前端性能優(yōu)化后的自述,如有不正 歡迎大佬們在評論席交流。

其它篇幅傳送門:

你不知道的前端性能優(yōu)化 一 靜態(tài)資源優(yōu)化
你不知道的前端性能優(yōu)化 二 布局于樣式
你不知道的前端性能優(yōu)化 三 緩存優(yōu)化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 前端性能優(yōu)化資料整理 頁面性能差的直接后果是用戶需要等待,而等待,尤其是不確定要多長時間的等待會給用戶帶來焦慮,為...
    飄零之雪閱讀 886評論 2 3
  • 原理 現(xiàn)代瀏覽器在使用CSS3動畫時,以下四種情形繪制的效率較高,分別是: 改變位置 改變大小 旋轉(zhuǎn) 改變透明度 ...
    ddai_Q閱讀 3,803評論 0 11
  • 先看概念介紹: 重繪 Paint 當render tree中的一些元素需要更新屬性,而這些屬性只是影響元素的 外觀...
    Ethan__Hunt閱讀 1,758評論 0 2
  • CSS3動畫應用很廣,尤其是在H5項目中,炫酷的交互效果可以給產(chǎn)品帶來更好的體驗,更能吸引用戶。然而在應用的時候,...
    UIleader閱讀 2,303評論 0 7
  • 當企業(yè)處在成長期,組織發(fā)現(xiàn)速度加快,主要以績效為重,領(lǐng)導力的培養(yǎng)側(cè)重于在外能力,使其能夠解決業(yè)務中出現(xiàn)的問題,當企...
    橙子哥閱讀 365評論 0 0

友情鏈接更多精彩內(nèi)容