1、CSS和JS在網(wǎng)頁中的放置順序是怎樣的?
CSS 放在<header></header>里贪壳,
因?yàn)榫W(wǎng)頁的渲染機(jī)制是當(dāng)css和加載好的這部分HTML,組合成渲染樹的蚜退,這樣才開始
在屏幕上繪制闰靴。而如果放在底部的話彪笼,加載多內(nèi)容的HTML會(huì)耗費(fèi)很長的時(shí)間,會(huì)有白屏
現(xiàn)象蚂且。
JS 放在body標(biāo)簽的最底部
一個(gè)網(wǎng)頁是先要有HTML和CSS配猫,之后才需要JS。同時(shí)如果把JS放在頭部杏死,會(huì)阻塞后面內(nèi)容的加載泵肄。因而放在最底部。
2淑翼、解釋白屏和FOUC
白屏:
(1) 如果把樣式放在底部腐巢,對(duì)于IE瀏覽器,在某些場(chǎng)景下頁面會(huì)出現(xiàn)白屏玄括,而不是內(nèi)容逐步展示冯丙。
如果把樣式放在底部。因?yàn)橄燃虞dHTML遭京,需要等待時(shí)間胃惜,這個(gè)時(shí)候屏幕上是什么都看不到的,之后加載css也是需要時(shí)間的洁墙。于是就出現(xiàn)白屏蛹疯。HTML的內(nèi)容越多戒财,等待時(shí)間越長热监。
(2)如果使用@import標(biāo)簽,即使CSS放入link饮寞,并且放在頭部孝扛,也可能出現(xiàn)白屏。
使用@import 并不會(huì)立即加載到CSS幽崩,和樣式放在底部是一樣的效果
(3)如果將JS放在頭部也會(huì)導(dǎo)致白屏現(xiàn)象苦始。
JS會(huì)阻塞后面內(nèi)容的呈現(xiàn),會(huì)禁用并發(fā)慌申,阻止其他內(nèi)容的下載陌选。
FOUC:如果把樣式放在底部,對(duì)于IE瀏覽器蹄溉,在某些場(chǎng)景下(點(diǎn)擊鏈接咨油,輸入U(xiǎn)RL,使用書簽進(jìn)入等)會(huì)出現(xiàn)FOUC現(xiàn)象柒爵,(逐步加載無樣式的內(nèi)容役电,等CSS加載頁面突然展現(xiàn)樣式).對(duì)于Firefox會(huì)一直表現(xiàn)出FOUC。
3棉胀、async和defer的作用是什么法瑟?有什么區(qū)別冀膝?
async: 加載后續(xù)文檔元素的過程將和script.js的加載并行進(jìn)行(異步)
defer: 加載后續(xù)文檔元素的過程將和script.js的加載并行進(jìn)行(異步)但script.js的執(zhí)行要在所有元素解析完成之后,DOMContentLoaded事件觸發(fā)之前完成霎挟。
defer: 腳本延遲到文檔解析和顯示后執(zhí)行窝剖,有順序。
async: 不保證順序酥夭。
4枯芬、簡述網(wǎng)頁的渲染機(jī)制。
(1)解析HTML標(biāo)簽采郎,構(gòu)建DOM樹
(2)解析CSS標(biāo)簽千所,構(gòu)建CSSOM樹
(3)把DOM和CSSOM組合成 渲染樹 (render tree)
(4)在渲染的基礎(chǔ)上進(jìn)行布局,計(jì)算每個(gè)節(jié)點(diǎn)的幾何結(jié)構(gòu)把每個(gè)節(jié)點(diǎn)繪制到屏幕上