DOM和CSSDOM樹渲染過程

瀏覽器渲染頁面前需要先構(gòu)建 DOM 和 CSSOM 樹吊说。因此论咏,我們需要確保盡快將 HTML 和 CSS 都提供給瀏覽器。

TL;DR

  • 字節(jié) → 字符 → 令牌 → 節(jié)點 → 對象模型颁井。
  • HTML 標(biāo)記轉(zhuǎn)換成文檔對象模型 (DOM)厅贪;CSS 標(biāo)記轉(zhuǎn)換成 CSS 對象模型 (CSSOM)。
  • DOM 和 CSSOM 是獨立的數(shù)據(jù)結(jié)構(gòu)雅宾。
  • Chrome DevTools Timeline 讓我們可以捕獲和檢查 DOM 和 CSSOM 的構(gòu)建和處理開銷养涮。

文檔對象模型 (DOM)

<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link href="style.css" rel="stylesheet">
    <title>Critical Path</title>
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg"></div>
  </body>
</html>

讓我們從可能的最簡單情況入手:一個包含一些文本和一幅圖片的普通 HTML 頁面。瀏覽器如何處理此頁面?


image.png
  1. 轉(zhuǎn)換: 瀏覽器從磁盤或網(wǎng)絡(luò)讀取 HTML 的原始字節(jié)单寂,并根據(jù)文件的指定編碼(例如 UTF-8)將它們轉(zhuǎn)換成各個字符贬芥。
  2. 令牌化: 瀏覽器將字符串轉(zhuǎn)換成 W3C HTML5 標(biāo)準(zhǔn)規(guī)定的各種令牌吐辙,例如宣决,“<html>”、“<body>”昏苏,以及其他尖括號內(nèi)的字符串尊沸。每個令牌都具有特殊含義和一組規(guī)則。
  3. 詞法分析: 發(fā)出的令牌轉(zhuǎn)換成定義其屬性和規(guī)則的“對象”贤惯。
  4. DOM 構(gòu)建: 最后洼专,由于 HTML 標(biāo)記定義不同標(biāo)記之間的關(guān)系(一些標(biāo)記包含在其他標(biāo)記內(nèi)),創(chuàng)建的對象鏈接在一個樹數(shù)據(jù)結(jié)構(gòu)內(nèi)孵构,此結(jié)構(gòu)也會捕獲原始標(biāo)記中定義的父項-子項關(guān)系:HTML 對象是 body 對象的父項屁商,bodyparagraph 對象的父項,依此類推颈墅。

整個流程的最終輸出是我們這個簡單頁面的文檔對象模型 (DOM)蜡镶,瀏覽器對頁面進(jìn)行的所有進(jìn)一步處理都會用到它。

瀏覽器每次處理 HTML 標(biāo)記時恤筛,都會完成以上所有步驟:將字節(jié)轉(zhuǎn)換成字符官还,確定令牌,將令牌轉(zhuǎn)換成節(jié)點毒坛,然后構(gòu)建 DOM 樹望伦。這整個流程可能需要一些時間才能完成,有大量 HTML 需要處理時更是如此煎殷。


image.png

如果您打開 Chrome DevTools 并在頁面加載時記錄時間線屯伞,就可以看到執(zhí)行該步驟實際花費的時間。在上例中豪直,將一堆 HTML 字節(jié)轉(zhuǎn)換成 DOM 樹大約需要 5 毫秒劣摇。對于較大的頁面,這一過程需要的時間可能會顯著增加顶伞。創(chuàng)建流暢動畫時饵撑,如果瀏覽器需要處理大量 HTML,這很容易成為瓶頸唆貌。

DOM 樹捕獲文檔標(biāo)記的屬性和關(guān)系滑潘,但并未告訴我們元素在渲染后呈現(xiàn)的外觀。那是 CSSOM 的責(zé)任锨咙。

CSS 對象模型 (CSSOM)

在瀏覽器構(gòu)建我們這個簡單頁面的 DOM 時语卤,在文檔的 head 部分遇到了一個 link 標(biāo)記,該標(biāo)記引用一個外部 CSS 樣式表:style.css。由于預(yù)見到需要利用該資源來渲染頁面粹舵,它會立即發(fā)出對該資源的請求钮孵,并返回以下內(nèi)容:

body { font-size: 16px }
p { font-weight: bold }
span { color: red }
p span { display: none }
img { float: right }

我們本可以直接在 HTML 標(biāo)記內(nèi)聲明樣式(內(nèi)聯(lián)),但讓 CSS 獨立于 HTML 有利于我們將內(nèi)容和設(shè)計作為獨立關(guān)注點進(jìn)行處理:設(shè)計人員負(fù)責(zé)處理 CSS眼滤,開發(fā)者側(cè)重于 HTML巴席,等等。

與處理 HTML 時一樣诅需,我們需要將收到的 CSS 規(guī)則轉(zhuǎn)換成某種瀏覽器能夠理解和處理的東西漾唉。因此,我們會重復(fù) HTML 過程堰塌,不過是為 CSS 而不是 HTML:


image.png

CSS 字節(jié)轉(zhuǎn)換成字符赵刑,接著轉(zhuǎn)換成令牌和節(jié)點,最后鏈接到一個稱為“CSS 對象模型”(CSSOM) 的樹結(jié)構(gòu)內(nèi):


image.png

CSSOM 為何具有樹結(jié)構(gòu)场刑?為頁面上的任何對象計算最后一組樣式時般此,瀏覽器都會先從適用于該節(jié)點的最通用規(guī)則開始(例如,如果該節(jié)點是 body 元素的子項牵现,則應(yīng)用所有 body 樣式)铐懊,然后通過應(yīng)用更具體的規(guī)則(即規(guī)則“向下級聯(lián)”)以遞歸方式優(yōu)化計算的樣式。

以上面的 CSSOM 樹為例進(jìn)行更具體的闡述施籍。span 標(biāo)記內(nèi)包含的任何置于 body 元素內(nèi)的文本都將具有 16 像素字號居扒,并且顏色為紅色 — font-size 指令從 body 向下級聯(lián)至 span。不過丑慎,如果某個 span 標(biāo)記是某個段落 (p) 標(biāo)記的子項喜喂,則其內(nèi)容將不會顯示。

還請注意竿裂,以上樹并非完整的 CSSOM 樹玉吁,它只顯示了我們決定在樣式表中替換的樣式。每個瀏覽器都提供一組默認(rèn)樣式(也稱為“User Agent 樣式”)腻异,即我們不提供任何自定義樣式時所看到的樣式进副,我們的樣式只是替換這些默認(rèn)樣式(例如默認(rèn) IE 樣式)。

要了解 CSS 處理所需的時間悔常,您可以在 DevTools 中記錄時間線并尋找“Recalculate Style”事件:與 DOM 解析不同影斑,該時間線不顯示單獨的“Parse CSS”條目,而是在這一個事件下一同捕獲解析和 CSSOM 樹構(gòu)建机打,以及計算的樣式的遞歸計算矫户。

image.png

我們的小樣式表需要大約 0.6 毫秒的處理時間,影響頁面上的 8 個元素 — 雖然不多残邀,但同樣會產(chǎn)生開銷皆辽。不過柑蛇,這 8 個元素從何而來呢?CSSOM 和 DOM 是獨立的數(shù)據(jù)結(jié)構(gòu)驱闷!結(jié)果證明耻台,瀏覽器隱藏了一個重要步驟。接下來空另,讓我們談一談將 DOM 與 CSSOM 關(guān)聯(lián)在一起的渲染樹盆耽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市痹换,隨后出現(xiàn)的幾起案子征字,更是在濱河造成了極大的恐慌,老刑警劉巖娇豫,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異畅厢,居然都是意外死亡冯痢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門框杜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浦楣,“玉大人,你說我怎么就攤上這事咪辱≌窭停” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵油狂,是天一觀的道長历恐。 經(jīng)常有香客問我,道長专筷,這世上最難降的妖魔是什么弱贼? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮磷蛹,結(jié)果婚禮上吮旅,老公的妹妹穿的比我還像新娘。我一直安慰自己味咳,他們只是感情好庇勃,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著槽驶,像睡著了一般责嚷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捺檬,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天再层,我揣著相機(jī)與錄音贸铜,去河邊找鬼。 笑死聂受,一個胖子當(dāng)著我的面吹牛蒿秦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛋济,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼啊楚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了津辩?” 一聲冷哼從身側(cè)響起棠笑,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祟辟,沒想到半個月后医瘫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡旧困,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年醇份,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吼具。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡僚纷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拗盒,到底是詐尸還是另有隱情怖竭,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布陡蝇,位于F島的核電站痊臭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毅整。R本人自食惡果不足惜趣兄,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悼嫉。 院中可真熱鬧艇潭,春花似錦、人聲如沸戏蔑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽总棵。三九已至鳍寂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間情龄,已是汗流浹背迄汛。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工捍壤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鞍爱。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓鹃觉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親睹逃。 傳聞我的和親對象是個殘疾皇子盗扇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345