1. 程式人生 > >瀏覽器如何解析程式碼渲染頁面

瀏覽器如何解析程式碼渲染頁面

最近看到有的朋友在糾結我們程式碼和瀏覽器到底具體發生了什麼。

  我們從開啟瀏覽器一步一步開始。

  1. 開啟瀏覽器
  2. 輸入網址並搜尋
  3. 瀏覽器解析網址併發送到DNS伺服器
  4. 伺服器收到資訊後將相應的HTML,CSS,JS檔案等外部資源傳送給瀏覽器
  5. 瀏覽器解析將HTML程式碼稱為DOM樹結構
  6. 將CSS程式碼解析成CSSOM結構(CSS Object Model)
  7. 結合DOM和CSSOM構建渲染樹
  8. 生成佈局,即將所有渲染樹的頁面進行合成
  9. 將佈局繪到螢幕

從第5-9步是真正的渲染過程,從5-7這三步非常快。

"生成佈局"(flow)和"繪製"(paint)這兩步,合稱為"渲染"(render)

 

 

現在簡單講一下瀏覽器的渲染過程

首先,建立DOM樹: 

D: document(文件),沒有文件,DOM也就無從談起,當建立網頁就把編寫的頁面文件轉換辰為一個文件物件。

O:物件。物件分為使用者自定義物件、內建物件、宿主物件。

M:model(模型),DOM把文件表現成一顆樹。其本身就是這個M模型。

例如有這麼一段程式碼:

<html>
<head>
  <title>Beautiful page</title>
</head>
<body>
    
  <p>
    Once upon a time there was 
    a looong paragraph...
  </p>
  
  <div style="display: none">
    Secret message
  </div>
  
  <div><img src="..." /></div>
  ...
 
</body>
</html>

那麼DOM樹是完全和HTML標籤一一對應的,如下所示:
documentElement (html)
    head
        title
    body
        p
            [text node]
                
        div 
            [text node]
                
        div
            img
                

  由此可知我們知道DOM樹由一個個節點組成。其中有:元素節點、文字節點、屬性節點。當構建完DOM樹後,就會開始構建渲染樹。

而渲染樹就不同了,她只有哪些需要繪製出來的元素,所以head 以及被隱藏的div都不會出現在渲染樹中。
root (RenderView)
    body
        p
            line 1
            line 2
            line 3
            ...
            
        div
            img
            
        ...

 

重繪和重排

當頁面剛初始化的時候頁面就會開始一次重排操作。任何一次對渲染樹的修改都會可能導致下面兩個操作。

1,重排
就是渲染樹的一部分必須要更新 並且節點的尺寸發生了變化。這就會觸發重排操作。重排必定會導致重繪。

  • 修改DOM
  • 修改樣式表
  • 使用者事件(比如滑鼠懸停、頁面滾動、輸入框鍵入文字、改變視窗大小等等)


2,重繪
部分節點需要更新,但是沒有改變他的集合形狀,比如改變了背景顏色,這就會觸發重繪。

 

 更多請見:阮一峰大神的http://www.ruanyifeng.com/blog/2015/09/web-page-performance-in-depth.html