渲染樹render tree

CSSOM樹和DOM樹鏈接在一塊兒造成一個render tree,渲染樹用來計算可見元素的佈局而且做爲將像素渲染到屏幕上的過程的輸入。html

  • DOM樹和CSSOM樹鏈接在一塊兒造成render tree .
  • render tree只包含了用於渲染頁面的節點
  • 佈局計算了每個對象的準確的位置以及大小
  • 繪畫是最後一步,繪畫要求利用render tree來將像素顯示到屏幕上

第一步是結合DOM樹和CSSOM樹造成「render tree」,渲染樹用來描述全部可見的DOM內容,而且將CSSOM樣式信息附加到節點上。web

DOM and CSSOM are combined to create the render tree

爲了造成渲染樹,瀏覽器大體作的事情有:瀏覽器

  1. 從DOM樹根節點開始,遍歷每個可見的節點
    • 一些節點是徹底不可見的(好比 script標籤,meta標籤等),這些節點會被忽略,由於他們不會影響渲染的輸出
    • 一些節點是經過CSS樣式隱藏了,這些節點一樣被忽略——例如上例中的span節點在render tree中被忽略,由於span樣式是display:none;
  2. 對每個可見的節點,找到合適的匹配的CSSOM規則,而且應用樣式
  3. 顯示可見節點(節點包括內容和被計算的樣式)

記住

  • 記住「visibility:hidden」和「display:none」之間的不一樣,「visibility:hidden」將元素設置爲不可見,可是一樣在佈局上佔領必定空間(例如,它會被渲染成爲空盒子),可是「display:none」的元素是將節點從整個render tree中移除,因此不是佈局中的一部分 。

最後輸出的是一個render包括了屏幕上可見內容的樣式信息和內容信息。工具

咱們知道了哪些元素應該被顯示以及元素的樣式,可是咱們尚未計算元素在設備中的確切的位置和大小——這是「佈局」階段,一樣也被叫作「reflow」。佈局

<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Critial Path: Hello world!</title>
  </head>
  <body>
    <div style="width: 50%">
      <div style="width: 50%">Hello world!</div>
    </div>
  </body>
</html>

上面的頁面展現了兩個div:第一個div是整個視圖的一半,第二個div是父親寬度的一半——也就是說是整個視圖的25%。優化

Calculating layout information

佈局的輸出是「盒子模型」,而且將相對定位轉化成屏幕上的絕對像素。google

最後,咱們只差將render tree上的全部節點轉化成屏幕上的確切像素——這個步驟一般被稱爲「painting」或者「rasterizing」。spa

每一個步驟都要花費一些時間,谷歌瀏覽器開封工具爲咱們描述了一些步驟所花費的時間:code

Measuring layout in DevTools

  • 構造render tree和計算位置以及大小信息被捕捉在時間軸上的「Layout」時間中
  • 一旦佈局完成,瀏覽器計算"Paint Setup"和「Paint」事件用來描述render tree轉化成屏幕上世紀像素的時間。

顯示構造render tree以及佈局和paint的時間受到頁面的大小,被應用的樣式和正在運行的設備影響。orm

頁面越大,瀏覽器將要作更多工做;樣式越複雜,painting階段所花費的時間也越多。

可是,咱們的頁面完成了!WOOOO!

Rendered Hello World page

讓咱們快速的瀏覽下瀏覽器所作的事情:

  1. 處理HTML標籤創建DOM樹
  2. 處理CSS標籤創建CSSOM樹
  3. 鏈接CSSOM樹和DOM樹造成一個render樹
  4. 在render樹上運行佈局來計算每一個節點的形狀
  5. 在屏幕上畫每個節點

雖然咱們的頁面很簡單,可是它進行了大量的工做!下一章咱們討論怎樣對渲染進行優化。

 

原文:https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction?hl=en

相關文章
相關標籤/搜索