JS相关概念
1.CSS和JS在网页中的放置顺序是怎样的?
CSS放在head标签中
JS放在body标签最底部
为什么这样放置:
浏览器在解析文档时,当解析到<script>标签时,会解析其中的脚本(对于外链的JavaScript文件,需要先加载该文件内容,再进行解析),然后立即执行,这整个过程都会阻塞文档解析,直到脚本执行完才会继续解析文档。就是说由于脚本是同步加载和执行的,它会阻塞文档解析,这也解释了为什么现在通常建议将<script>标签放在</body>标签前面,而不是放在<head>标签里。
2.解释白屏和FOUC
白屏问题
如果把样式放在底部,对于IE浏览器或者chrome,在某些场景下(新窗口打开,刷新等)页面会出现白屏,而不是内容逐步展现。可以通过使用 link 标签将样式表放在顶部优先加载CSS,但是如果在CSS中使用 @import 标签,即使 CSS 放入link, 并且放在头部,也可能出现白屏。
FOUC (Flash of Unstyled Content) 无样式内容闪烁
如果把样式放在底部,对于IE浏览器,在某些场景下(点击链接,输入URL,使用书签进入等),会出现 FOUC 现象(逐步加载无样式的内容,等CSS加载后页面突然展现样式).对于 Firefox 会一直表现出 FOUC .
3.async和defer的作用是什么?有什么区别?
defer
这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,在
<script>
元素中设置defer
属性,相当于告诉浏览器立即下载,但延迟执行。
async
这个属性与
defer
类似,都用于改变处理脚本的行为。同样与defer类似,async
只适用于外部脚本文件,并告诉浏览器立即下载文件。但与defer不同的是,标记为async
的脚本并不保证按照它们的先后顺序执行。
区别
如果加了
async
属性就相当于单独开了一个进程去独立加载和执行,而defer
是和将<script>
放到<body>
底部一样的效果。
4.简述网页的渲染机制
- 解析 HTML 标签, 构建 DOM 树
- 解析 CSS 标签, 构建 CSSOM 树
- 把 DOM 和 CSSOM 组合成 渲染树 (render tree)
- 在渲染树的基础上进行布局, 计算每个节点的几何结构
- 把每个节点绘制到屏幕上 (painting)