CSS和JS在網(wǎng)頁(yè)中的放置順序是怎樣的
CSS通過(guò)link標(biāo)簽引入胁后,放置在<head>
標(biāo)簽內(nèi)。
JS放置在頁(yè)面底部,通過(guò)<script>
標(biāo)簽引入阅悍,放置在body的閉合標(biāo)簽之前好渠。
解釋白屏和FOUC
- 白屏:
對(duì)于chrome、IE等瀏覽器节视,頁(yè)面渲染需要等到HTML頁(yè)面DOM樹(shù)和CSS的CSSOM樹(shù)構(gòu)建完畢后拳锚,兩者結(jié)合形成render tree后,才對(duì)頁(yè)面進(jìn)行渲染繪制寻行。
當(dāng)CSS文件放于頁(yè)面底部霍掺,會(huì)影響CSS的加載時(shí)間,因此在CSS沒(méi)有全部加載并形成render tree之前,頁(yè)面都處于空白狀態(tài)杆烁,會(huì)導(dǎo)致白屏牙丽;如果使用@import標(biāo)簽,即使CSS放于頭部兔魂,也可能出現(xiàn)白屏現(xiàn)象烤芦。
當(dāng)JavaScript文件放于頁(yè)面頭部時(shí),JavaScript會(huì)禁用并發(fā)加載析校,阻塞JavaScript后面內(nèi)容的呈現(xiàn)及后面組件的下載构罗,等到JavaScript文件全部加載完成后才會(huì)繼續(xù)執(zhí)行之后的代碼,因此JavaScript文件放于頭部也會(huì)導(dǎo)致頁(yè)面白屏現(xiàn)象智玻。 - FOUC:
對(duì)于Firefox瀏覽器遂唧,DOM樹(shù)的構(gòu)建與CSS的渲染時(shí)同步進(jìn)行的。所以當(dāng)CSS樣式置于頁(yè)面底部時(shí)吊奢,首先瀏覽器會(huì)對(duì)HTML的元素進(jìn)行展示盖彭,當(dāng)CSS全部加載完成后對(duì)樣式進(jìn)行修改,出現(xiàn)FOUS現(xiàn)象事甜。
如果把CSS樣式放在底部,對(duì)于IE瀏覽器,在某些場(chǎng)景下(點(diǎn)擊鏈接,輸入U(xiǎn)RL,使用書(shū)簽進(jìn)入等),也會(huì)出現(xiàn) FOUC 現(xiàn)象谬泌。
async和defer的作用是什么?有什么區(qū)別
async和defer是異步加載腳本的的屬性逻谦。
<script async src="script.js"></script>
加載和渲染后續(xù)文檔元素的過(guò)程將和 script.js 的加載與執(zhí)行并行進(jìn)行(異步)掌实。同時(shí)出現(xiàn)幾個(gè)具有async屬性的js文件,async屬性不保證按照它們的先后順序執(zhí)行邦马。
<script deferc src="script.js"></script>
加載script.js文件后面的文檔元素過(guò)程將和script.js的加載異步進(jìn)行贱鼻,但 script.js 的執(zhí)行要在所有元素解析完成之后,DOMContentLoaded 事件觸發(fā)之前完成滋将。
簡(jiǎn)述網(wǎng)頁(yè)的渲染機(jī)制
- 解析 HTML 標(biāo)簽, 構(gòu)建 DOM 樹(shù)
- 解析 CSS 標(biāo)簽, 構(gòu)建 CSSOM 樹(shù)
- 把 DOM 和 CSSOM 組合成 渲染樹(shù) (render tree)
- 在渲染樹(shù)的基礎(chǔ)上進(jìn)行布局, 計(jì)算每個(gè)節(jié)點(diǎn)的幾何結(jié)構(gòu)
- 把每個(gè)節(jié)點(diǎn)繪制到屏幕上 (painting)