重繪和重排(回流)的理解


重繪不一定需要重排(比如顏色的改變),重排必然導致重繪(比如改變網頁位置)

1.概念:

    DOM的變化影響了元素的幾何屬性,瀏覽器需要重新計算元素的幾何屬性,同時其他元素的幾何屬性和位置也會受到影響,瀏覽器會使渲染樹中受到影響的部分失效,並重新構造渲染樹,這個過程是重排

    瀏覽器會重新繪制受到影響的部分到屏幕,這個過程叫重繪

2.重排(Reflow)

    當渲染樹的一部分必須更新並且節點的尺寸發生了變化,瀏覽器會使渲染樹中受到影響的部分失效,並重新構造渲染樹。

3.重繪(Repaint)

    在一個元素的外觀被改變所觸發的瀏覽器行為,瀏覽器會根據元素的新屬性重新繪制,使元素呈現新的外觀。

    比如改變某個元素的背景色、文字顏色、邊框顏色等等

4.觸發重排的因素:   

    1.添加、刪除可見的dom

    2.元素的位置改變

    3.元素的尺寸改變(外邊距、內邊距、邊框厚度、寬高、等幾何屬性)

    4.頁面渲染初始化

    5.瀏覽器窗口尺寸改變

    6.獲取某些屬性。當獲取一些屬性時,瀏覽器為取得正確的值也會觸發重排,它會導致隊列刷新,這些屬性包括:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle() (currentStyle in IE)。

     因此,在多次使用這些值時應進行緩存。

5.如何進行優化

    1.瀏覽器自己的優化:

      瀏覽器會維護1個隊列,把所有會引起重排,重繪的操作放入這個隊列,等隊列中的操作到一定數量或者到了一定時間間隔,瀏覽器就會flush隊列,進行一批處理,這樣多次重排,重繪變成一次重排重繪

    2.減少重繪和重排:   

      1.不要一條一條地修改 DOM 的樣式。可以先定義好 css 的 class,然后修改 DOM 的 className。

      2.不要把 DOM 結點的屬性值放在一個循環里當成循環里的變量。
      3.為動畫的 HTML 元件使用 fixed 或 absoult 的 position,那么修改他們的 CSS 是不會 reflow 的。
      4.千萬不要使用 table 布局。因為可能很小的一個小改動會造成整個 table 的重新布局。

        table及其內部元素除外,它可能需要多次計算才能確定好其在渲染樹中節點的屬性,通常要花3倍於同等元素的時間。這也是為什么我們要避免使用table做布局的一個原因。

      5.不要在布局信息改變的時候做查詢(會導致渲染隊列強制刷新)  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM