JS與頁(yè)面渲染機(jī)制相關(guān)概念

CSS和JS在網(wǎng)頁(yè)中的放置順序是怎樣的?

  • JS一般放置在</body>標(biāo)簽之前或添加defer屬性

    1. JS是阻塞加載,會(huì)阻塞DOM樹或阻塞渲染樹的構(gòu)建。
    2. JS 可能會(huì)修改 DOM,如果在DOM樹加載完成前修改DOM會(huì)導(dǎo)致JS代碼無(wú)效。
    3. JS可能會(huì)通過(guò)操作DOM對(duì)象的class來(lái)改變DOM,因此必須保證CSS在JS之前加載和解析完成。
  • CSS一般放置在head標(biāo)簽內(nèi)

    由于Render Tree是由DOM樹和CSSOM樹組合成的,html頁(yè)面需要等到CSS解析完后才能完成渲染,所以CSS應(yīng)放在head標(biāo)簽內(nèi),優(yōu)先下載解析,以避免頁(yè)面元素由于樣式缺失造成瞬間的白頁(yè)或者給用戶閃爍感。

白屏和FOUC

  • 當(dāng)把CSS樣式放在底部或者使用@import方式引入樣式、或?qū)S放在頭部造成其他內(nèi)容阻塞加載時(shí):
    • 一些瀏覽器例如chrome,他的加載和渲染機(jī)制是等頭部的JS和底部的CSS全部加載解析完后再渲染展示頁(yè)面,而這個(gè)等待的時(shí)間就為白屏。
    • 另一些瀏覽器例如Firefox,他會(huì)在CSS未加載前先展現(xiàn)頁(yè)面,等css加載后再重繪一次,這就造成了FOUC (無(wú)樣式內(nèi)容閃爍)。

async和defer的作用是什么?有什么區(qū)別

  • 當(dāng)瀏覽器碰到<script>標(biāo)簽時(shí):
    • 瀏覽器會(huì)立即加載并執(zhí)行指定的腳本,并且阻塞后續(xù)的頁(yè)面渲染。
    • 有 async時(shí),加載和渲染后續(xù)文檔元素的過(guò)程將和 js腳本 的加載與執(zhí)行并行進(jìn)行(異步)。有 async 的情況下,JavaScript 腳本一旦下載好了就會(huì)執(zhí)行,所以很有可能不是按照原本的順序來(lái)執(zhí)行的。如果 JavaScript 腳本前后有依賴性,使用 async 就很有可能出現(xiàn)錯(cuò)誤。
    • 有 defer時(shí),加載后續(xù)文檔元素的過(guò)程將和 js腳本 的加載并行進(jìn)行(異步),但是 js腳本 的執(zhí)行要在DOM加載完成之后,DOMContentLoaded 事件觸發(fā)之前完成。

簡(jiǎn)述網(wǎng)頁(yè)的渲染機(jī)制

  1. 解析html構(gòu)建DOM樹
  2. 解析CSS構(gòu)建CSSOM樹
  3. 把DOM和CSSOM組合成渲染樹(Render Tree)
  4. 在渲染樹的基礎(chǔ)上進(jìn)行布局,計(jì)算每個(gè)節(jié)點(diǎn)的幾何結(jié)構(gòu)(Layout Tree)
  5. 把每個(gè)節(jié)點(diǎn)繪制到屏幕上(Painting)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. CSS和JS在網(wǎng)頁(yè)中的放置順序是怎樣的? css放在head標(biāo)簽內(nèi),防止渲染時(shí)出現(xiàn)白屏 js放在最后body...
    billa_8f6b閱讀 635評(píng)論 0 0
  • 簡(jiǎn)單介紹JavaScript的發(fā)展歷史 JavaScript因互聯(lián)網(wǎng)而生,回顧它的歷史要從瀏覽器的歷史講起。 19...
    _Dot912閱讀 611評(píng)論 0 3
  • 作為一個(gè)前端開發(fā),有必要了解從我們?cè)跒g覽器地址欄輸入網(wǎng)址到看到頁(yè)面這期間瀏覽器是如何進(jìn)行工作的,進(jìn)而了解如何更好的...
    李奕錦liyijin閱讀 610評(píng)論 0 0
  • 大家都知道萬(wàn)維網(wǎng)的應(yīng)用層使用了HTTP協(xié)議,并且用瀏覽器作為入口訪問網(wǎng)絡(luò)上的資源。用戶在使用瀏覽器訪問一個(gè)網(wǎng)站時(shí)需...
    SylvanasSun閱讀 2,240評(píng)論 1 12
  • 我們都想做一個(gè)成功的人,既有錢,又成功。 那么,成功的人怎么定義呢?怎樣才能被定位為成功的人? 1、有能力實(shí)現(xiàn)自己...
    夢(mèng)想搬磚者閱讀 529評(píng)論 0 2

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