網(wǎng)頁的渲染機(jī)制

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

  1. CSS最好放入header中,即放在網(wǎng)頁內(nèi)容(html標(biāo)簽中包含的文字和圖片等)和js腳本之前
    <link href="index.css" rel="stylesheet">
  2. js因?yàn)镴S會(huì)阻塞HTML滓鸠、CSS和圖片的加載雁乡,并且可能修改DOM,所以JS需要放到最后加載糜俗,有四種方式:
  • 放在html中</body>前 <script src='index.js'></script>
  • 放在head標(biāo)簽內(nèi)踱稍,同時(shí)在script標(biāo)簽內(nèi)添加"defer"或"async"來延遲或異步加載js。
//延遲加載defer:腳本延遲到文檔解析和顯示后執(zhí)行悠抹,有順序
<script defer src='index1.js'></script>
//異步加載async:不保證順序
<script async src='index2.js'></script>
  • 用createElement來動(dòng)態(tài)生成珠月,這個(gè)要注意加載順序
  • 用ajax加載

解釋白屏和FOUC

白屏的發(fā)生情形:

  1. 將css文件放在html文檔的最后;
  2. 使用@import引入css(因?yàn)橥ㄟ^@import引入的css文件會(huì)被最后加載,因此也會(huì)導(dǎo)致白屏);
  3. 將js文件放在頭部楔敌,而未使用defer或async延遲或異步加載js文件啤挎,導(dǎo)致js阻塞html和css的加載

原因:對于-webkit內(nèi)核的瀏覽器(IE也會(huì)產(chǎn)生),在進(jìn)行網(wǎng)頁渲染時(shí)卵凑,會(huì)同時(shí)加載html和css分別構(gòu)建DOM樹和CSSOM庆聘,等兩者都構(gòu)建完成后,再繪制渲染樹勺卢,然后將頁面顯示出來掏觉。如果在html中將css文件放置在文檔最后,那么將會(huì)導(dǎo)致CSSOM晚于DOM樹的建立值漫,瀏覽器需要等待CSSOM建立澳腹,然后才進(jìn)行網(wǎng)頁內(nèi)容的繪制,這個(gè)等待的過程杨何,沒有內(nèi)容顯示酱塔,就導(dǎo)致了白屏的產(chǎn)生,因此在開發(fā)中危虱,需要將CSS放在head標(biāo)簽內(nèi)羊娃,讓其與html內(nèi)容同時(shí)被加載。js也是同理埃跷,阻塞了CSSO和DOM樹的創(chuàng)建蕊玷。

FOUC:仍是由于瀏覽器的解析造成的邮利,由于瀏覽器先顯示已加載的html內(nèi)容,逐步加載無樣式的內(nèi)容垃帅,等css加載后頁面突然展現(xiàn)樣式延届。主要發(fā)生瀏覽器是火狐瀏覽器。

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

async:讓script.js和其他元素異步加載和執(zhí)行
defer:讓script.js的執(zhí)行再所有元素解析完成之后
相同點(diǎn):

  1. 在加載腳本時(shí)方庭,不阻塞頁面的渲染
  2. 對于inline script無效
  3. 使用這兩個(gè)屬性的腳本中不能調(diào)用document.write
  4. 有腳本的onload事件回調(diào)

區(qū)別:

  • 執(zhí)行時(shí)刻
  1. async屬性會(huì)在腳本下載完成之后異步執(zhí)行,同時(shí)是在window的load事件之前執(zhí)行酱固,因此可能會(huì)出現(xiàn)打亂腳本執(zhí)行順序的情況械念;(無順序)
  2. defer屬性的腳本是在頁面被解析完成之后才會(huì)被執(zhí)行,按照腳本排列順序執(zhí)行运悲,同時(shí)是在document的DOMcontentLoader之前執(zhí)行(有順序)
  • 使用這兩個(gè)屬性會(huì)有的三種情況:
  1. 如果async為true龄减,那么腳本在加載完成后立刻執(zhí)行
  2. 如果async為false,defer為true班眯,則腳本在頁面解析完成后執(zhí)行
  3. 如果async為false欺殿、defer也為false,那么腳本會(huì)阻塞頁面解析鳖敷,轉(zhuǎn)而下載腳本脖苏,并立即執(zhí)行

建議:無論是使用async還是defer,都需要對js文件進(jìn)行整理定踱,哪些文件有依賴棍潘,哪些需要延遲加載,做好js代碼的合并和拆分崖媚,然后再根據(jù)頁面需要合理使用這兩個(gè)屬性

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

  1. HTML代碼轉(zhuǎn)化成DOM
  2. CSS代碼轉(zhuǎn)化成CSSOM(CSS Object Model)
  3. 結(jié)合DOM和CSSOM亦歉,生成一棵渲染樹(包含每個(gè)節(jié)點(diǎn)的視覺信息)
  4. 生成布局(layout),即將所有渲染樹的所有節(jié)點(diǎn)進(jìn)行平面合成
  5. 將布局繪制(paint)在屏幕上

生成布局"(flow)和"繪制"(paint)這兩步畅哑,合稱為"渲染"


網(wǎng)頁生成的時(shí)候肴楷,至少會(huì)渲染一次。用戶訪問的過程中荠呐,還會(huì)不斷重新渲染赛蔫。
以下三種情況,會(huì)導(dǎo)致網(wǎng)頁重新渲染泥张。

  1. 修改DOM
  2. 修改樣式表
  3. 用戶事件(比如鼠標(biāo)懸停呵恢、頁面滾動(dòng)、輸入框鍵入文字媚创、改變窗口大小等等)

重新渲染渗钉,就需要重新生成布局和重新繪制。前者叫做"重排"(reflow)钞钙,后者叫做"重繪"(repaint)鳄橘。
需要注意的是声离,"重繪"不一定需要"重排",比如改變某個(gè)網(wǎng)頁元素的顏色瘫怜,就只會(huì)觸發(fā)"重繪"术徊,不會(huì)觸發(fā)"重排",因?yàn)椴季譀]有改變宝磨。但是弧关,"重排"必然導(dǎo)致"重繪"盅安,比如改變一個(gè)網(wǎng)頁元素的位置唤锉,就會(huì)同時(shí)觸發(fā)"重排"和"重繪",因?yàn)椴季指淖兞恕?/p>

參考鏈接:阮一峰
若想自己動(dòng)手測試一下瀏覽器的渲染機(jī)制别瞭,可看這一篇文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窿祥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蝙寨,更是在濱河造成了極大的恐慌晒衩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墙歪,死亡現(xiàn)場離奇詭異听系,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)虹菲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門靠胜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毕源,你說我怎么就攤上這事浪漠。” “怎么了霎褐?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵址愿,是天一觀的道長。 經(jīng)常有香客問我冻璃,道長响谓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任省艳,我火速辦了婚禮歌粥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拍埠。我一直安慰自己失驶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布枣购。 她就那樣靜靜地躺著嬉探,像睡著了一般擦耀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涩堤,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天眷蜓,我揣著相機(jī)與錄音,去河邊找鬼胎围。 笑死吁系,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的白魂。 我是一名探鬼主播汽纤,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼福荸!你這毒婦竟也來了蕴坪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤敬锐,失蹤者是張志新(化名)和其女友劉穎背传,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台夺,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡径玖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颤介。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梳星。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖买窟,靈堂內(nèi)的尸體忽然破棺而出丰泊,到底是詐尸還是另有隱情,我是刑警寧澤始绍,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布瞳购,位于F島的核電站,受9級特大地震影響亏推,放射性物質(zhì)發(fā)生泄漏学赛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一吞杭、第九天 我趴在偏房一處隱蔽的房頂上張望盏浇。 院中可真熱鬧,春花似錦芽狗、人聲如沸绢掰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滴劲。三九已至攻晒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間班挖,已是汗流浹背鲁捏。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萧芙,地道東北人给梅。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像双揪,于是被迫代替她去往敵國和親动羽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 渲染機(jī)制概述 解析 HTML 標(biāo)簽, 構(gòu)建 DOM 樹解析 CSS 標(biāo)簽, 構(gòu)建 CSSOM 樹把 DOM 和 C...
    柚丶稚橙熟時(shí)閱讀 425評論 0 0
  • 網(wǎng)頁的基本組成結(jié)構(gòu) 網(wǎng)頁 = HTML + CSS + JavaScriptHTML:網(wǎng)頁元素內(nèi)容CSS: 控制網(wǎng)...
    Vincent_永閱讀 405評論 0 0
  • 1.CSS和JS在網(wǎng)頁中的放置順序 CSS需要放在head內(nèi)盟榴,一般用link標(biāo)簽引入外部樣式曹质,或者直接將CSS寫在...
    l_meng閱讀 245評論 0 0
  • 瀏覽器的渲染機(jī)制解析 解析HTML標(biāo)簽婴噩,構(gòu)建DOM樹 解析CSS標(biāo)簽擎场,構(gòu)建CSSOM樹 把DOM和CSSOM組合成...
    蛋黃肉閱讀 384評論 0 0
  • 正如大家都所知道的童話故事那樣,公主們都是由騎士來守候的几莽。 然而坊間一直流傳著迅办,西緹爾公主拒絕了所有騎...
    serenato閱讀 287評論 0 0