前端工程師需要明白的瀏覽器渲染
前端工程師為什麼需要明白瀏覽器渲染?
像素完美(Pixel Perfection)、分辨率無關(Resolution Independent)和多平台體驗一致性是設計師們的追求。可訪問性(Accessability)、加載性能和重構靈活性則是前端工程師們關心的主題。其中加載性能與瀏覽器的渲染機制深深掛鉤,弄明白瀏覽器背後的渲染機制,才能在日常的前端的開發中明白如何進行性能優化。
瀏覽器如何渲染頁面
瀏覽器解析
1、瀏覽器通過請求的URL進行域名解析,向服務器發起請求,接收文件(HTML、CSS、JS、Images等等)。
2、HTML文件加載後,開始構建DOM Tree
3、CSS樣式文件加載後,開始解析和構建CSS Rule Tree
4、Javascript腳本文件加載後,通過DOM API和CSSOM API來操作DOM Tree和CSS Rule Tree
瀏覽器渲染
1、瀏覽器引擎通過DOM Tree和CSS Rule Tree構建Rendering Tree
2、Rendering Tree並不與DOM Tree對應,比如像<head>標籤內容或帶有display: none;的元素節點並不包括在Rendering Tree中。
3、通過CSS Rule Tree匹配DOM Tree進行定位坐標和大小,是否換行,以及position、overflow、z-index等等屬性,這個過程稱為Flow或Layout 。
4、最終通過調用Native GUI的API繪製網頁畫面的過程稱為Paint 。
當用戶在瀏覽網頁時進行交互或通過js 腳本改變頁面結構時,以上的部分操作有可能重複運行,此過程稱為Repaint 或Reflow。
Repaint當元素改變的時候,將不會影響元素在頁面當中的位置(比如background-color, border-color, visibility),瀏覽器僅僅會應用新的樣式重繪此元素,此過程稱為Repaint。
Reflow當元素改變的時候,將會影響文檔內容或結構,或元素位置,此過程稱為Reflow。( HTML使用的是flow based layout ,也就是流式佈局,所以,如果某元件的幾何尺寸發生了變化,需要重新佈局,也就叫Reflow。)
Reflow 的成本比Repaint 的成本高得多的多。一個結點的Reflow 很有可能導致子結點,甚至父點以及同級結點的Reflow 。在一些高性能的電腦上也許還沒什麼,但是如果Reflow 發生在手機上,那麼這個過程是延慢加載和耗電的。----瀏覽器的渲染原理簡介
以下行為將有可能產生Reflow
- 增加、刪除、或改變DOM 節點
- 增加、刪除'class' 屬性值
- 元素尺寸改變
- 文本內容改變
- 瀏覽器窗口改變大小或拖動
- 動畫效果進行計算和改變CSS 屬性值
- 偽類激活(:hover)
舉例:
當然,我們的瀏覽器是聰明的,它不會像上面那樣,你每改一次樣式,它就Reflow 或Repaint 一次。一般來說,瀏覽器會把這樣的操作積攢一批,然後做一次Reflow ,這又叫異步reflow 或增量異步Reflow 。但是有些情況瀏覽器是不會這麼做的,比如:Resize 窗口,改變了頁面默認的字體,等。對於這些操作,瀏覽器會馬上進行Reflow 。----瀏覽器的渲染原理簡介
如何優化瀏覽器渲染過程
最佳實踐
1、創建有效的HTML和CSS ,不要忘記指定文檔編碼,比如<meta charset="utf-8">。
2、CSS樣式應該包含在<head>中, Javascript腳本出現在<body>末尾。
3、減少CSS嵌套層級和選擇適當的選擇器,可參考如何提升CSS選擇器性能。
4、不要通過JS 逐條修改DOM 的樣式,提前定義好CSS 的Class 進行操作。
舉例:
5、盡量減少將DOM節點屬性值放在循環當中,會導致大量讀寫此屬性值。
6、盡可能的為產生動畫的HTML元素使用fixed或absolute的position ,那麼修改他們的CSS是不會Reflow的。