1. 程式人生 > >前端系統複習之瀏覽器渲染機制

前端系統複習之瀏覽器渲染機制

這裡寫圖片描述

二面的內容:

  • 渲染機制

  • JS 執行機制

  • 頁面效能

  • 錯誤監控

本文接下來講渲染機制。

渲染機制包括的內容:

  • 什麼是DOCTYPE及作用

  • 瀏覽器渲染過程

面試經常會問:在瀏覽器中輸入url,發生了哪些事情。其中有一部就是瀏覽器的渲染過程。

  • Reflow:重排

面試官問完了渲染機制,一般會緊接著問重排Reflow,你可千萬別說你沒聽過。

  • Repaint:重繪

  • Layout:佈局

這裡的Layout指的是瀏覽器的Layout。

什麼是DOCTYPE及作用

定義

DTD(Document Type Definition):文件型別定義。

是一系列的語法規則,用來定義XML或者(X)HTML檔案型別。瀏覽器會使用DTD來判斷文字型別

,決定使用何種協議來解析,以及切換瀏覽器模式。(說白了就是:DTD就是告訴瀏覽器,我是什麼文件型別,你要用什麼協議來解析我)

DOCTYPE:用來宣告DTD規範。

一個主要的用途便是檔案的合法性驗證。如果檔案程式碼不合法,那麼瀏覽器解析時便會出現一些差錯。(說白了,DOCTYPE就是用來宣告DTD的)

常見的DOCTYPE宣告有幾種

面試官緊接著會問,常見的 DOCTYPE 有哪些,以及 HTML5 的 DOCTYPE 怎麼寫。

1、HTML 4.01 Strict:(嚴格的)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

PS:該DTD包含所有的HTML元素和屬性,但不包括展示性的和棄用的元素(比如 font、u下劃線等,這些是被廢棄了的)。

2、HTML 4.01 Transitional:(傳統的)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

PS:該DTD包含所有的HTML元素和屬性,但包括展示性的和棄用的元素(比如 font、u下劃線等)。

3、HTML 5:

<!DOCTYPE html>

總結:

面試時,不會讓你寫出 HTML 4.01的寫法,因為大家都記不住。但是要記住 HTML 5 的寫法,別看它簡單,知道的人還真不多。

面試時,可以這樣回答: HTML 4.01 中有兩種寫法,一種是嚴格的,一種是傳統的;並且答出二者的區別。 HTML 5的寫法是<!DOCTYPE html>

瀏覽器的渲染過程

瀏覽器的渲染過程非常複雜,但是面試只用說幾句話就行了,不然太耗時間。如何快速簡潔地描述清楚,是關鍵。

這裡先解釋一下幾個概念,方便大家理解:

  • DOM Tree:瀏覽器將HTML解析成樹形的資料結構(DOM 樹)。

  • CSS Rule Tree:瀏覽器將CSS解析成樹形的資料結構。

  • Render Tree: DOM和CSSOM合併後生成Render Tree。(雖然有了Render Tree,但並不知道節點的位置,需要依靠接下來的layout)

  • layout: 有了Render Tree,瀏覽器已經能知道網頁中有哪些節點、各個節點的CSS定義以及他們的從屬關係,從而去計算出每個節點在螢幕中的位置(寬高、顏色等)。

  • painting:按照算出來的規則,通過顯示卡,把內容畫到螢幕上。

  • display:打擊看到的最終效果。

參考連結:

Reflow:重排

定義

重排 Reflow:DOM結果中的各個元素都有自己的盒子(模型),這些都需要瀏覽器根據各種樣式來計算,並根據計算結果將元素放在它該出現的位置,這個過程稱之為Reflow。

什麼時候觸發 Reflow

  • 增加、刪除、修改DOM節點時,會導致 Reflow 或 Repaint。

  • 移動DOM的位置,或是加個動畫的時候

  • 修改CSS樣式時(寬高、display 為none等,都是通過css樣式來修改的)

  • 當用戶Resize視窗時(移動端沒有這個問題),或是滾動的時候,有可能會觸發(具體要看瀏覽器的規則)。

  • 修改網頁的預設字型時(這個影響非常嚴重)。

面試總結:

首先要答出 Reflow 定義;其次,什麼時候觸發,至少要答出兩條。更進一步,面試官可能還會問你怎麼避免reflow,這個自己去查查吧。

Repaint:重繪

定義

Repaint重繪製:當各種盒子的位置、大小以及其他屬性,例如顏色、字型大小等都確定下來後,瀏覽器便把這些元素都按照各自的特性繪製一遍,於是頁面的內容出現了,這個過程稱之為 Repaint。

說白了,頁面要呈現的內容,統統畫在螢幕上,這就叫 Repaint。

什麼時候觸發 Repaint

  • DOM改動

  • CSS改動

其實,就是判斷當前呈現的內容是否發生變化(無論這個變化是通過DOM改動還是CSS改動)。只要頁面顯示的內容不一樣了,肯定要 Repaint。

面試總結:

面試官經常會問:“如何**儘量減少**Repaint的頻率?”

注意, reflow是問“怎麼避免”,repaint是問“怎麼減少”。Repaint是無法避免的,否則就成了靜態頁面了。

答案

(1)如果需要建立多個DOM節點,可以使用DocumentFragment建立完,然後一次性地加入document。(加一個節點,就repaint一次,不太好)

(2)將元素的display設定為”none”,完成修改後再把display修改為原來的值。