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