<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>
複製代碼
不管是DOM仍是CSSOM,都是要通過Bytes → characters → tokens → nodes → object model這個過程。css
DOM樹構建過程:當前節點的全部子節點都構建好後纔會去構建當前節點的下一個兄弟節點。html
上述也提到了CSSOM的構建過程,也是樹的結構,在最終計算各個節點的樣式時,瀏覽器都會先從該節點的廣泛屬性(好比body裏設置的全局樣式)開始,再去應用該節點的具體屬性。還有要注意的是,每一個瀏覽器都有本身默認的樣式表,所以不少時候這棵CSSOM樹只是對這張默認樣式表的部分替換。node
DOM樹和CSSOM樹合併生成render樹web
簡單描述這個過程:瀏覽器
DOM樹從根節點開始遍歷可見節點,這裏之因此強調了「可見」,是由於若是遇到設置了相似display: none;的不可見節點,在render過程當中是會被跳過的(但visibility: hidden; opacity: 0這種仍舊佔據空間的節點不會被跳過render),保存各個節點的樣式信息及其他節點的從屬關係。bash
有了各個節點的樣式信息和屬性,但不知道各個節點的確切位置和大小,因此要經過佈局將樣式信息和屬性轉換爲實際可視窗口的相對大小和位置。dom
萬事俱備,最後只要將肯定好位置大小的各節點,經過GPU渲染到屏幕的實際像素。佈局