我們可能都知道瀏覽器含有一個(gè)渲染引擎,用來渲染窗口所展示的內(nèi)容。默認(rèn)情況下,渲染引擎可以顯示html、xml文檔及圖片,它也可以借助插件(一種瀏覽器擴(kuò)展)顯示其他類型數(shù)據(jù),例如使用PDF閱讀器插件,用于顯示PDF格式。但是其具體的渲染原理和流程估計(jì)也有很多人都不知道或者不清楚吧。這些天研究了一下瀏覽器的渲染原理,有了些心得,在這里跟大家分享一下,這里只討論渲染引擎最主要的用途——顯示應(yīng)用了CSS之后的html及圖片。
1.解析HTML,構(gòu)建DOM樹(這里遇到外鏈,此時(shí)會(huì)發(fā)起請(qǐng)求)
2.解析CSS,生成CSS規(guī)則樹
3.合并DOM樹和CSS規(guī)則,生成render樹
4.布局render樹(Layout/reflow),負(fù)責(zé)各元素尺寸、位置的計(jì)算
5.繪制render樹(paint),繪制頁(yè)面像素信息
6.瀏覽器會(huì)將各層的信息發(fā)送給GPU,GPU將各層合成(composite),顯示在屏幕上。這一點(diǎn)在網(wǎng)站開發(fā)中十分重要。

1.構(gòu)建DOM樹
?無論是DOM還是CSSOM,都是要經(jīng)過 Bytes→characters→tokens→nodes→objectmodel這個(gè)過程。
DOM樹構(gòu)建過程:當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)都構(gòu)建好后才會(huì)去構(gòu)建當(dāng)前節(jié)點(diǎn)的下一個(gè)兄弟節(jié)點(diǎn)。
2.構(gòu)建CSSOM樹
上述也提到了CSSOM的構(gòu)建過程,也是樹的結(jié)構(gòu),在最終計(jì)算各個(gè)節(jié)點(diǎn)的樣式時(shí),瀏覽器都會(huì)先從該節(jié)點(diǎn)的普遍屬性(比如body里設(shè)置的全局樣式)開始,再去應(yīng)用該節(jié)點(diǎn)的具體屬性。還有要注意的是,每個(gè)瀏覽器都有自己默認(rèn)的樣式表,因此很多時(shí)候這棵CSSOM樹只是對(duì)這張默認(rèn)樣式表的部分替換。
3.生成render樹
DOM樹和CSSOM樹合并生成render樹
簡(jiǎn)單描述這個(gè)過程:
DOM樹從根節(jié)點(diǎn)開始遍歷可見節(jié)點(diǎn),這里之所以強(qiáng)調(diào)了“可見”,是因?yàn)槿绻龅皆O(shè)置了類似 display:none;的不可見節(jié)點(diǎn),在render過程中是會(huì)被跳過的(但 visibility:hidden;opacity:0這種仍舊占據(jù)空間的節(jié)點(diǎn)不會(huì)被跳過render),保存各個(gè)節(jié)點(diǎn)的樣式信息及其余節(jié)點(diǎn)的從屬關(guān)系。
4.Layout 布局
有了各個(gè)節(jié)點(diǎn)的樣式信息和屬性,但不知道各個(gè)節(jié)點(diǎn)的確切位置和大小,所以要通過布局將樣式信息和屬性轉(zhuǎn)換為實(shí)際可視窗口的相對(duì)大小和位置。
5.Paint 繪制
對(duì)于網(wǎng)站建設(shè)而言,Paint 繪制可以說是會(huì)給人一種萬事俱備的感覺,最后只要將確定好位置大小的各節(jié)點(diǎn),通過GPU渲染到屏幕的實(shí)際像素。
希望以上內(nèi)容對(duì)您有所幫,如果大家對(duì)這些內(nèi)容還有想要了解的可以隨時(shí)咨詢我們,也可以關(guān)注尚武科技的官方公眾號(hào),里邊會(huì)有更多的相關(guān)內(nèi)容解決您的問題。