本文主要介紹一下什麼是reflow,repaint, 怎樣避免它們形成的不良影響, 怎麼經過工具查看分析它們. css
一.首先對瀏覽器渲染引擎下網頁呈現過程簡要說一下:
- 瀏覽器的渲染引擎開始解析html構建成DOM樹,DOM樹是以document對象爲根節點,包含全部的html標籤, 包括display: none隱藏的,也包括js動態添加的元素。
- 解析html的同時, 將css文件或者樣式元素中的樣式解析成CSS Rule Tree,解析時會去掉瀏覽器不能識別的樣式。
- 根據DOM樹和CSSOM來構造Rendering Trre。Rendering Trre和DOM Tree相比較,Rendering Trre中每一個節點都包含樣式信息,並且Render Tree不會包含隱藏的節點,只有影響到呈現的節點纔會包含在Render Tree中(例如: display:none的節點,head節點不會包含在Render Tree中,visibility:hidden會被包含,由於它會影響layout)。
- 生成佈局(layout),計算各節點元素在屏幕上所在位置和幾何結構。
- 繪製(paint),將佈局繪製到屏幕上。
以上5步中,主要耗時的是後2步,後兩步合稱爲渲染(render)。html
二: 什麼是reflow 和 repaint:
網頁在生成的過程當中,至少要渲染一次。以後在訪問過程當中,還會不斷的進行渲染。從新渲染就行從新生成佈局和繪製(也就是重複進行上面的第4,5步)從新生成佈局的過程就是reflow(迴流,重排),從新繪製就叫作reflow(重繪)。java
三: 何時觸發reflow和repaint
注: repaint不必定須要reflow,例如:改變某元素的顏色,只會觸發repaint,不會觸發reflow。可是reflow必定會致使repaint,由於佈局改變了,就必定須要從新繪製。
Reflow 的成本比 Repaint 的成本高不少。DOM Tree裏的每一個節點都會有reflow方法,一個結點的reflow可能致使其子結點,甚至父點以及同級結點的 reflow。在PC端或許還沒什麼,可是在手機上,仍是比較耗性能和耗電的。
如下狀況會致使reflow:瀏覽器
- 增長貨移除css樣式
- 改變字體大小
- 改變窗口大小
- 操做class屬性
- 激活css僞類
- 內容變化,如在input內輸入文字
- js操做DOM
- 獲取offsetTop, offsetLeft等layout屬性
- 設置css屬性等值
... ...緩存
四.如何減少reflow的影響:
- 減小沒必要要的DOM層級.
- 避免使用table進行佈局,由於可能很小的一個小改動會形成整個 table 的從新佈局。
- 儘可能經過position屬性爲absolute或fixed實現動畫效果
- 不要一條一條地修改 DOM 的樣式。而是預先定義好對應的 class,而後修改對應節點的 className
- 不要逐條操做DOM節點: a> 使用 documentFragment 對象在內存裏操做 DOM。 b> 先把 DOM 給 display:none (有一次 repaint),作完全部的修改後,再把他顯示出來。 c> clone 一個 DOM 節點到內存裏,作完全部的修改後,再交換一下。
- 請求以下值offsetTop, offsetLeft, offsetWidth, offsetHeight,scrollTop/Left/Width/Height,clientTop/Left/Width/Height,瀏覽器會發生reflow,建議將他們合併到一塊兒操做,能夠減小回流的次數。屢次要用到值,能夠先用變量緩存起來.
... ...工具
五.開發者工具查看
Chrome瀏覽器開發者工具的Performance面板,能夠查看頁面迴流和重繪所花費的時間.
打開f12下的開發者工具, 切換到Performance面板.以下圖:佈局
點擊開始錄製按鈕,會開始錄製,這時在網頁上進行一些操做, 而後點擊中止按鈕,以下:性能
從圖中能夠判斷出性能問題到底出如今哪一個環節,是js的執行,仍是渲染字體
圖中不一樣顏色表明不一樣的事件, 哪一個色塊越大, 說明耗時越長,問題越大.能夠根據此去進行優化.優化
- 黃色: javaScript執行時間
- 紫色: 樣式從新計算和佈局, 即reflow時間
- 綠色: repaint時間
如何對線上項目進行性能監控