瀏覽器渲染主要有以下步驟:首先解析收到的文檔,根據文檔定義構建一棵 DOM 樹,DOM 樹是由 DOM 元素及屬性節點組成的。
然后對 CSS 進行解析,生成 CSSOM 規則樹。
根據 DOM 樹和 CSSOM 規則樹構建渲染樹。渲染樹的節點被稱為渲染對象,渲染對象是一個包含有顏色和大小等屬性的矩形,渲染對象和 DOM 元素相對應,但這種對應關系不是一對一的,不可見的 DOM 元素不會被插入渲染樹。還有一些 DOM元素對應幾個可見對象,它們一般是一些具有復雜結構的元素,無法用一個矩形來描述。
當渲染對象被創建并添加到樹中,它們并沒有位置和大小,所以當瀏覽器生成渲染樹以后,就會根據渲染樹來進行布局(也可以叫做回流)。這一階段瀏覽器要做的事情是要弄清楚各個節點在頁面中的確切位置和大小。通常這一行為也被稱為“自動重排”。
布局階段結束后是繪制階段,遍歷渲染樹并調用渲染對象的 paint 方法將它們的內容顯示在屏幕上,繪制使用 UI 基礎組件。大致過程如圖所示:
注意: 這個過程是逐步完成的,為了更好的用戶體驗,渲染引擎將會盡可能早的將內容呈現到屏幕上,并不會等到所有的html 都解析完成之后再去構建和布局 render 樹。它是解析完一部分內容就顯示一部分內容,同時,可能還在通過網絡下載其余內容。