1. 程式人生 > >瀏覽器工作原理(二):瀏覽器渲染過程概述

瀏覽器工作原理(二):瀏覽器渲染過程概述

sync 結構 dom end 繪制 fault 異步加載 步驟 targe

參考:https://segmentfault.com/a/1190000012925872#articleHeader4

瀏覽器器內核拿到內容後,渲染大概可以劃分成以下幾個步驟

  1. 解析html建立dom樹
  2. 解析css構建render樹(將CSS代碼解析成樹形的數據結構,然後結合DOM合並成render樹)
  3. 布局render樹(Layout/reflow),負責各元素尺寸、位置的計算
  4. 繪制render樹(paint),繪制頁面像素信息
  5. 瀏覽器會將各層的信息發送給GPU,GPU會將各層合成(composite),顯示在屏幕上。

所有詳細步驟都已經略去,渲染完畢後就是load事件,對應JS邏輯處理

load事件與DOMContentLoaded事件的先後

  • DOMContentLoaded 事件:僅當DOM加載完成,不包括樣式表,圖片。如果有async加載的腳本就不一定完成
  • onload 事件:頁面上所有的DOM,樣式表,腳本,圖片都已經加載完成,渲染完畢

所以,順序是:DOMContentLoaded -> load

頭部引入css加載是否會阻塞dom樹渲染?

首先,css是由單獨的下載線程異步下載的。

然後再說下幾個現象:

  • css加載不會阻塞DOM樹解析(異步加載時DOM照常構建)
  • 但會阻塞render樹渲染(渲染時需等css加載完畢,因為render樹需要css信息)

這可能也是瀏覽器的一種優化機制。

因為加載css的時候,可能會修改DOM節點的樣式,如果css加載不阻塞render樹渲染的話,那麽當css加載完之後,可能引起重繪或者回流,造成沒有必要的損耗。

所以,先把DOM樹的結構先解析完,然後等css加載完之後,再根據最終的樣式來渲染render樹,以此優化性能。

瀏覽器工作原理(二):瀏覽器渲染過程概述