1.CSS和JS在网页中的放置顺序是怎样的?
CSS代码放在head中
JS代码放在body标签的最后
2.解释白屏和FOUC
白屏问题:
如果把样式放在底部,对于IE浏览器,在某些场景下(新窗口打开,刷新等)页面会出现白屏,而不是内容逐步展现
如果使用 @import 标签,即使 CSS 放入 link, 并且放在头部,也可能出现白屏。
出现白屏的原因是因为浏览器在渲染的过程中需要DOM树和CSSOM树组合成渲染树,把CSS放在最后和使用@import标签引入CSS都会拖慢引入CSSOM树的速度,在没有获取到CSSOM树的时候浏览器无法进行渲染,就会导致白屏。
可以通过在head中使用link标签解决
FOUC:
如果把样式放在底部,对于IE浏览器,在某些场景下(点击链接,输入URL,使用书签进入等),会出现 FOUC 现象(逐步加载无样式的内容,等CSS加载后页面突然展现样式).对于 Firefox 会一直表现出 FOUC .
可以通过避免使用@import方法导入CSS,且将样式表链接都放在head来解决。
3.async和defer的作用是什么?有什么区别
<script src="script.js"></script>
没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。
<script defer src="script.js"></script>
这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,在<script>元素中设置defer属性,相当于告诉浏览器立即下载,但延迟执行。
HTML5规范要求脚本按照它们出现的先后顺序执行,因此第一个延迟脚本会先于第二个延迟脚本执行,而这两个脚本会先于DOMContentLoaded事件执行。在现实当中,延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoad时间触发前执行,因此最好只包含一个延迟脚本。
<script async src="script.js"></script>
这个属性与defer类似,都用于改变处理脚本的行为。同样与defer类似,async只适用于外部脚本文件,并告诉浏览器立即下载文件。但与defer不同的是,标记为async的脚本并不保证按照它们的先后顺序执行。
第二个脚本文件可能会在第一个脚本文件之前执行。因此确保两者之间互不依赖非常重要。指定async属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。
区别:
async:不保证顺序
defer:脚本延迟到文档解析和显示后执行,有顺序
4.简述网页的渲染机制
- 解析HTML标签,构建DOM树。
- 解析CSS标签,构建CSSOM树。
- 将DOM与CSSOM进行组合构建渲染树 Render Tree。
- 在渲染树的基础上进行布局,计算每个节点的几何结构。
- 把每个节点绘制到屏幕上 (painting)。