介紹下重繪和迴流(Repaint & Reflow),以及如何進行優化

題目描述:

介紹下重繪和迴流(Repaint & Reflow),以及如何進行優化javascript

知識點:Repaint & Reflowcss

解題:

  • 思路一:

1. 瀏覽器渲染機制html

  • 瀏覽器採用流式佈局模型(Flow Based Layout)
  • 瀏覽器會把HTML解析成DOM,把CSS解析成CSSOM,DOM和CSSOM合併就產生了渲染樹(Render Tree)。
  • 有了RenderTree,咱們就知道了全部節點的樣式,而後計算他們在頁面上的大小和位置,最後把節點繪製到頁面上。
  • 因爲瀏覽器使用流式佈局,對Render Tree的計算一般只須要遍歷一次就能夠完成,但table及其內部元素除外,他們可能須要屢次計算,一般要花3倍於同等元素的時間,這也是爲何要避免使用table佈局的緣由之一。

2. 重繪前端

因爲節點的幾何屬性發生改變或者因爲樣式發生改變而不會影響佈局的,稱爲重繪,例如outline, visibility, color、background-color等,重繪的代價是高昂的,由於瀏覽器必須驗證DOM樹上其餘節點元素的可見性。java

3. 迴流css3

迴流是佈局或者幾何屬性須要改變就稱爲迴流。迴流是影響瀏覽器性能的關鍵因素,由於其變化涉及到部分頁面(或是整個頁面)的佈局更新。一個元素的迴流可能會致使了其全部子元素以及DOM中緊隨其後的節點、祖先節點元素的隨後的迴流。瀏覽器

<body>
<div class="error">
    <h4>個人組件</h4>
    <p><strong>錯誤:</strong>錯誤的描述…</p>
    <h5>錯誤糾正</h5>
    <ol>
        <li>第一步</li>
        <li>第二步</li>
    </ol>
</div>
</body>複製代碼

在上面的HTML片斷中,對該段落(緩存

標籤)迴流將會引起強烈的迴流,由於它是一個子節點。這也致使了祖先的迴流(div.error和body – 視瀏覽器而定)。此外,ide

    也會有簡單的迴流,由於其在DOM中在迴流元素以後。大部分的迴流將致使頁面的從新渲染。

    迴流一定會發生重繪,重繪不必定會引起迴流。佈局

    4. 瀏覽器優化現代瀏覽器大多都是經過隊列機制來批量更新佈局,瀏覽器會把修改操做放在隊列中,至少一個瀏覽器刷新(即16.6ms)纔會清空隊列,但當你獲取佈局信息的時候,隊列中可能有會影響這些屬性或方法返回值的操做,即便沒有,瀏覽器也會強制清空隊列,觸發迴流與重繪來確保返回正確的值。

    主要包括如下屬性或方法:

    • offsetTop、offsetLeft、offsetWidth、offsetHeight
    • scrollTop、scrollLeft、scrollWidth、scrollHeight
    • clientTop、clientLeft、clientWidth、clientHeight
    • width、height
    • getComputedStyle()
    • getBoundingClientRect()

    因此,咱們應該避免頻繁的使用上述的屬性,他們都會強制渲染刷新隊列。5. 減小重繪與迴流

    1.CSS

    • 使用 transform 替代 top
    • 使用 visibility 替換 display: none ,由於前者只會引發重繪,後者會引起迴流(改變了佈局)
    • 避免使用table佈局,可能很小的一個小改動會形成整個 table 的從新佈局。
    • 儘量在DOM樹的最末端改變class,迴流是不可避免的,但能夠減小其影響。儘量在DOM樹的最末端改變class,能夠限制了迴流的範圍,使其影響儘量少的節點。
    • 避免設置多層內聯樣式,CSS 選擇符從右往左匹配查找,避免節點層級過多。
    <div>
      <a> <span></span> </a>
    </div>
    <style>
      span {
        color: red;
      }
      div > a > span {
        color: red;
      }
    </style>複製代碼

    對於第一種設置樣式的方式來講,瀏覽器只須要找到頁面中全部的 span 標籤而後設置顏色,可是對於第二種設置樣式的方式來講,瀏覽器首先須要找到全部的 span 標籤,而後找到 span 標籤上的 a 標籤,最後再去找到 div 標籤,而後給符合這種條件的 span 標籤設置顏色,這樣的遞歸過程就很複雜。因此咱們應該儘量的避免寫過於具體的 CSS 選擇器,而後對於 HTML 來講也儘可能少的添加無心義標籤,保證層級扁平。

    • 將動畫效果應用到position屬性爲absolute或fixed的元素上,避免影響其餘元素的佈局,這樣只是一個重繪,而不是迴流,同時,控制動畫速度能夠選擇 requestAnimationFrame,詳見探討 requestAnimationFrame。
    • 避免使用CSS表達式,可能會引起迴流。
    • 將頻繁重繪或者回流的節點設置爲圖層,圖層可以阻止該節點的渲染行爲影響別的節點,例如will-change、video、iframe等標籤,瀏覽器會自動將該節點變爲圖層。
    • CSS3 硬件加速(GPU加速),使用css3硬件加速,可讓transform、opacity、filters這些動畫不會引發迴流重繪 。可是對於動畫的其它屬性,好比background-color這些,仍是會引發迴流重繪的,不過它仍是能夠提高這些動畫的性能。

    2.JavaScript

    • 避免頻繁操做樣式,最好一次性重寫style屬性,或者將樣式列表定義爲class並一次性更改class屬性。
    • 避免頻繁操做DOM,建立一個documentFragment,在它上面應用全部DOM操做,最後再把它添加到文檔中。
    • 避免頻繁讀取會引起迴流/重繪的屬性,若是確實須要屢次使用,就用一個變量緩存起來。
    • 對具備複雜動畫的元素使用絕對定位,使它脫離文檔流,不然會引發父元素及後續元素頻繁迴流。

    擴展閱讀:

    ❤️ 看完兩件小事

    若是你以爲這篇文章對你挺有啓發,我想請你幫我兩個小忙:

    把這篇文章分享給你的朋友 / 交流羣,讓更多的人看到,一塊兒進步,一塊兒成長!

    關注公衆號 「IT平頭哥聯盟」,公衆號後臺回覆「資源」 免費領取我精心整理的前端進階資源教程

    JS中文網 - 前端進階資源教程 www.javascriptC.com

    一個致力於幫助開發者用代碼改變世界爲使命的平臺,天天均可以在這裏找到技術世界的頭條內容
    ![JS中文網 - 前端進階資源教程,領略前端前沿,關注IT平頭哥聯盟](https://www.javascriptc.com)

相關文章
相關標籤/搜索