Repaint and Reflow

1. Repaint

repaint(重繪)是在一個元素的外觀被改變,但沒有改變佈局的情況下發生,如改變visibility、outline、前景色。當repaint發生時,瀏覽器會驗證DOM樹上的所有其它結點的visibility屬性。

2. Reflow

如果變化涉及元素佈局 (如 width), 瀏覽器則拋棄原有屬性, 重新計算並把結果傳遞給 render 以重新描繪頁面元素, 此過程稱為 reflow。reflow(回流)是導致DOM腳本執行低效的關鍵因素之一。頁面上任何一個結點觸發reflow,都會導致它的子結點及祖先結點重新渲染。

以下操作會引起reflow:

改變窗囗大小

改變文字大小

添加/刪除樣式表

內容的改變,如用戶在輸入框中敲字

激活偽類,如:hover

操作class屬性

腳本操作DOM

計算offsetWidth和offsetHeight

設置style屬性

Reflow是不可避免的,隻能將reflow對性能的影響減小到最小,以下是一些建議:

盡可能限制reflow的影響范圍。有時 reflow 頁面中的一個元素會 reflow 它的父元素(譯註:這裡是復數)以及所有子元素。www.2cto.com

通過設置style屬性改變結點樣式的話,每設置一次都會導致一次reflow。所以最好通過設置class的方式。

實現元素的動畫,它的position屬性應當設為fixed或absolute,這樣不會影響其它元素的佈局。

權衡速度的平滑。比如實現一個動畫,以1個像素為單位移動這樣最平滑,但reflow就會過於頻繁,CPU很快就會被完全占用。如果以3個像素為單位移動就會好很多。

不要用tables佈局的另一個原因就是tables中某個元素一旦觸發reflow就會導致table裡所有的其它元素reflow。在適合用table的場合,可以設置table-layout為auto或fixed,這樣可以讓table一行一行的渲染,這種做法也是為瞭限制reflow的影響范圍。

很多情況下都會觸發reflow,如果css裡有expression,每次都會重新計算一遍。

避免在document上直接進行頻繁的DOM操作,如果確實需要可以采用off-document的方式進行

先將元素從document中刪除,完成修改後再把元素放回原來的位置

將元素的display設置為”none”,完成修改後再把display修改為原來的值

如果需要創建多個DOM節點,可以使用DocumentFragment創建完後一次性的加入

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *