【乾貨】十分鐘讀懂瀏覽器渲染流程
在之前寫過的一篇《"天龍八步"細說瀏覽器輸入URL後發生了什麼》一文中,和大家分享了從在瀏覽器中輸入網址URL到最終頁面展示的整個過程。部分讀者向我反饋對於最後的瀏覽器渲染布局這塊不是很清晰,所以本文就瀏覽器渲染流程單獨開篇講解,希望大家都能有新的收穫。
**瀏覽器主要元件結構**
(瀏覽器主要元件)
渲染引擎——webkit和Gecko
Firefox使用Geoko——Mozilla自主研發的渲染引擎。
Safari和Chrome都使用webkit。Webkit是一款開源渲染引擎,它本來是為linux平臺研發的,後來由Apple移植到Mac及Windows上。
本文我主要以webkit渲染引擎來講解,儘管webkit和Gecko使用的術語稍有不同,他們的主要流程基本相同。
(webkit渲染引擎流程)
關鍵渲染路徑
關鍵渲染路徑是指瀏覽器從最初接收請求來的HTML、CSS、javascript等資源,然後解析、構建樹、渲染布局、繪製,最後呈現給客戶能看到的介面這整個過程。
所以瀏覽器的渲染過程主要包括以下幾步:
- 解析HTML生成DOM樹。
- 解析CSS生成CSSOM規則樹。
- 將DOM樹與CSSOM規則樹合併在一起生成渲染樹。
- 遍歷渲染樹開始佈局,計算每個節點的位置大小資訊。
- 將渲染樹每個節點繪製到螢幕。
構建DOM樹
當瀏覽器接收到伺服器響應來的HTML文件後,會遍歷文件節點,生成DOM樹。
需要注意的是,DOM樹的生成過程中可能會被CSS和JS的載入執行阻塞。渲染阻塞問題下文會講。
構建CSSOM規則樹
瀏覽器解析CSS檔案並生成CSS規則樹,每個CSS檔案都被分析成一個StyleSheet物件,每個物件都包含CSS規則。CSS規則物件包含對應於CSS語法的選擇器和宣告物件以及其他物件。
渲染阻塞
當瀏覽器遇到一個 script 標記時,DOM 構建將暫停,直至指令碼完成執行,然後繼續構建DOM。每次去執行JavaScript指令碼都會嚴重地阻塞DOM樹的構建,如果JavaScript指令碼還操作了CSSOM,而正好這個CSSOM還沒有下載和構建,瀏覽器甚至會延遲指令碼執行和構建DOM,直至完成其CSSOM的下載和構建。
所以,script 標籤的位置很重要。實際使用時,可以遵循下面兩個原則:
CSS 優先:引入順序上,CSS 資源先於 JavaScript 資源。
JS置後:我們通常把JS程式碼放到頁面底部,且JavaScript 應儘量少影響 DOM 的構建。
當解析html的時候,會把新來的元素插入dom樹裡面,同時去查詢css,然後把對應的樣式規則應用到元素上,查詢樣式表是按照從右到左的順序去匹配的。
例如: div p {font-size: 16px},會先尋找所有p標籤並判斷它的父標籤是否為div之後才會決定要不要採用這個樣式進行渲染)。
所以,我們平時寫CSS時,儘量用id和class,千萬不要過渡層疊。
構建渲染樹
通過DOM樹和CSS規則樹我們便可以構建渲染樹。瀏覽器會先從DOM樹的根節點開始遍歷每個可見節點。對每個可見節點,找到其適配的CSS樣式規則並應用。
渲染樹構建完成後,每個節點都是可見節點並且都含有其內容和對應規則的樣式。這也是渲染樹與DOM樹的最大區別所在。渲染樹是用於顯示,那些不可見的元素當然就不會在這棵樹中出現了,譬如,display等於none的也不會被顯示在這棵樹裡頭,但是visibility等於hidden的元素是會顯示在這棵樹裡頭的。
渲染樹佈局
佈局階段會從渲染樹的根節點開始遍歷,然後確定每個節點物件在頁面上的確切大小與位置,佈局階段的輸出是一個盒子模型,它會精確地捕獲每個元素在螢幕內的確切位置與大小。
渲染樹繪製
在繪製階段,遍歷渲染樹,呼叫渲染器的paint()方法在螢幕上顯示其內容。渲染樹的繪製工作是由瀏覽器的UI後端元件完成的。
reflow與repaint:
根據渲染樹佈局,計算CSS樣式,即每個節點在頁面中的大小和位置等幾何資訊。HTML預設是流式佈局的,CSS和js會打破這種佈局,改變DOM的外觀樣式以及大小和位置。這時就要提到兩個重要概念:repaint和reflow。
repaint:螢幕的一部分重畫,不影響整體佈局,比如某個CSS的背景色變了,但元素的幾何尺寸和位置不變。
reflow: 意味著元件的幾何尺寸變了,我們需要重新驗證並計算渲染樹。是渲染樹的一部分或全部發生了變化。這就是Reflow,或是Layout。
所以我們應該儘量減少reflow和repaint,我想這也是為什麼現在很少有用table佈局的原因之一。
display:none 會觸發 reflow,visibility: hidden屬性並不算是不可見屬性,它的語義是隱藏元素,但元素仍然佔據著佈局空間,它會被渲染成一個空框,所以visibility:hidden 只會觸發 repaint,因為沒有發生位置變化。
有些情況下,比如修改了元素的樣式,瀏覽器並不會立刻 reflow 或 repaint 一次,而是會把這樣的操作積攢一批,然後做一次 reflow,這又叫非同步 reflow 或增量非同步 reflow。
有些情況下,比如 resize 視窗,改變了頁面預設的字型等。對於這些操作,瀏覽器會馬上進行 reflow。
小結
本文我們就瀏覽器渲染流程逐步瞭解了一遍,相信大家一定都有所新的收穫,如果大家對於瀏覽器渲染流程還有任何疑問,歡迎反饋,我們共同交流,共同學習,共同進步。
作者:GavinHsueh,QQ/微信:753391279,專注網站建站、運維及企業web應用開發技術。
參考文獻:
http://taligarsiel.com/Projects/howbrowserswork1.htm
https://segmentfault.com/a/1190000012960187
https://sylvanassun.github.io/2017/10/03/2017-10-03-BrowserCriticalRenderingPath/
相關文章
- 瀏覽器渲染流程瀏覽器
- 一篇文章讀懂瀏覽器渲染機制瀏覽器
- 瀏覽器渲染頁面的主體流程瀏覽器
- 瀏覽器核心渲染引擎工作流程瀏覽器
- 瀏覽器渲染瀏覽器
- 瀏覽器渲染流程&Composite(渲染層合併)簡單總結瀏覽器
- 一文讀懂瀏覽器快取瀏覽器快取
- 瀏覽器渲染原理瀏覽器
- 瀏覽器渲染引擎瀏覽器
- 基石-初見瀏覽器(一):瀏覽器渲染瀏覽器
- 瀏覽器之渲染引擎瀏覽器
- 【瀏覽器】渲染原理探究瀏覽器
- 瀏覽器渲染簡述瀏覽器
- 瀏覽器渲染機制瀏覽器
- 瀏覽器渲染流水線解析瀏覽器
- 瀏覽器核心渲染:重建引擎瀏覽器
- 深入淺出瀏覽器渲染原理瀏覽器
- 瀏覽器頁面渲染機制瀏覽器
- 瀏覽器渲染魔法之合成層瀏覽器
- 乾貨|一文讀懂 Spring Data Jpa!Spring
- 瀏覽器核心-流程概況瀏覽器
- 一文讀懂瀏覽器儲存與快取機制瀏覽器快取
- 瀏覽器從輸入URL到渲染瀏覽器
- 瀏覽器渲染程式多執行緒瀏覽器執行緒
- 瀏覽器載入及渲染機制瀏覽器
- 瀏覽器渲染網頁的過程瀏覽器網頁
- 瀏覽器渲染原理(一文搞懂)瀏覽器
- 十分鐘讀懂遊戲研發、發行、渠道那些事兒遊戲
- webkit 瀏覽器內幕之渲染基礎WebKit瀏覽器
- 必須明白的瀏覽器渲染機制瀏覽器
- 從 Chrome 看瀏覽器的渲染機制Chrome瀏覽器
- 【乾貨!!】十分鐘帶你搞懂 Java AQS 核心設計與實現!!!JavaAQS
- 現代瀏覽器探祕(part3):渲染瀏覽器
- 瀏覽器是怎樣渲染網頁的呢?瀏覽器網頁
- 瀏覽器渲染過程與原理淺析(一)瀏覽器
- 圖解瀏覽器的多程式渲染機制圖解瀏覽器
- 360瀏覽器怎麼解除安裝乾淨 怎麼徹底刪除360瀏覽器瀏覽器
- 2分鐘讀懂javaJava
- 3天學寫mvvm框架[三]:瀏覽器端渲染MVVM框架瀏覽器