瀏覽器渲染機(jī)制


瀏覽器對內(nèi)容的渲染分為5個(gè)部分
  1. 處理 HTML 標(biāo)記并構(gòu)建 DOM 樹。
  2. 處理 CSS 標(biāo)記并構(gòu)建 CSSOM 樹。
  3. 將 DOM 與 CSSOM 合并成一個(gè)渲染樹。
  4. 根據(jù)渲染樹來布局,以計(jì)算每個(gè)節(jié)點(diǎn)的幾何信息。
  5. 將各個(gè)節(jié)點(diǎn)繪制到屏幕上。
    這五個(gè)部分并不一定按順序完成,首先瀏覽器幾乎是并行加載資源,但瀏覽器的渲染有先后。


    image.png

默認(rèn)情況下,CSS 被視為阻塞渲染的資源,這意味著瀏覽器將不會渲染任何已處理的內(nèi)容,直至 CSSOM 構(gòu)建完畢。存在阻塞的 CSS 資源時(shí),瀏覽器會延遲 JavaScript 的執(zhí)行和 DOM 構(gòu)建。
而JavaScript 不僅可以讀取和修改 DOM 屬性,還可以讀取和修改 CSSOM 屬性。當(dāng)瀏覽器遇到一個(gè) script 標(biāo)記時(shí),DOM 構(gòu)建將暫停,直至腳本完成執(zhí)行。

JavaScript 可以查詢和修改 DOM 與 CSSOM。
CSSOM 構(gòu)建時(shí),JavaScript 執(zhí)行將暫停,直至 CSSOM 就緒。
所以,script 標(biāo)簽的位置很重要。實(shí)際使用時(shí),可以遵循下面兩個(gè)原則:
CSS 優(yōu)先:引入順序上,CSS 資源先于 JavaScript 資源。
JavaScript 應(yīng)盡量少影響 DOM 的構(gòu)建。

白屏&FOUC(flash of unstyled content)無樣式內(nèi)容閃爍

白屏和 fouc 是不同瀏覽器的渲染機(jī)制,不是bug
白屏:CSS全部載入解析完后渲染展示頁面。如果沒有加載完,就會出現(xiàn)白屏
FOUC:CSS未完全加載前,會先渲染顯示已經(jīng)解析的HTML內(nèi)容,然后CSS完全加載完成后,再次渲染。

repaint & reflow

當(dāng)樣式如顏色、字體等更改時(shí)瀏覽器會進(jìn)行重繪,但是當(dāng)樣式的更改涉及到尺寸的更改時(shí),會回流處理——重新計(jì)算位置,再重繪。下面是一些可能導(dǎo)致重繪和重流的樣式:

var bstyle = document.body.style;//cache
bstyle.padding = "20px";//reflow,repaint
bstyle.border="10px solid red";//reflow,repaint
bstyle.color="blue"http://repaint
bstyle.fontSize="2em";//reflow,repaint

css 會阻礙圖片的加載,而瀏覽器在遇到 js 時(shí)會立即加載并執(zhí)行指定的腳本,“立即”指的是在渲染該 script 標(biāo)簽之下的文檔元素之前,也就是說不等待后續(xù)載入的文檔元素,讀到就加載并執(zhí)行,js在加載時(shí),渲染文件的加載會停止。

但是給script標(biāo)簽增加async和defer關(guān)鍵詞后,渲染問價(jià)可以與js文件同步加載,并且使用defer關(guān)鍵詞,js的加載完成后不會馬上執(zhí)行,會等候后續(xù)所有元素解析完成后再執(zhí)行

<script async src="script.js"></script>
<script defer src="script.js"></script>

參考文獻(xiàn)

https://juejin.im/entry/59e1d31f51882578c3411c77
https://zhuanlan.zhihu.com/p/33448591
https://zhuanlan.zhihu.com/p/29418126

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 瀏覽器指的是Chrome系瀏覽器【Firefox大同小異,IE未知】以下提到的“節(jié)點(diǎn)”、“標(biāo)簽”和“元素”不做區(qū)分...
    Yieiy閱讀 4,209評論 4 26
  • 關(guān)鍵渲染路徑 瀏覽器從接收到頁面開始到頁面顯示,這整個(gè)過程中的所有步驟,稱為關(guān)鍵渲染路徑。用戶看到頁面實(shí)際上可以分...
    ZombieBrandg閱讀 551評論 0 0
  • 一 : 為什么要了解瀏覽器渲染頁面的機(jī)制,主要還是性能的優(yōu)化。 了解瀏覽器如何進(jìn)行加載,我們可以在引用外部樣式文件...
    泡杯感冒靈閱讀 20,372評論 0 31
  • 參考鏈接:瀏覽器渲染的那些事(一)瀏覽器內(nèi)部工作原理瀏覽器的渲染原理簡介有關(guān)網(wǎng)頁渲染,每個(gè)前端開發(fā)者都該知道的那點(diǎn)...
    恰皮閱讀 583評論 3 1
  • 大家都知道萬維網(wǎng)的應(yīng)用層使用了HTTP協(xié)議,并且用瀏覽器作為入口訪問網(wǎng)絡(luò)上的資源。用戶在使用瀏覽器訪問一個(gè)網(wǎng)站時(shí)需...
    SylvanasSun閱讀 2,239評論 1 12

友情鏈接更多精彩內(nèi)容