CSS和JS在网页中的放置顺序是怎样的
CSS通过link标签引入,放置在<head>
标签内。
JS放置在页面底部,通过<script>
标签引入,放置在body的闭合标签之前。
解释白屏和FOUC
- 白屏:
对于chrome、IE等浏览器,页面渲染需要等到HTML页面DOM树和CSS的CSSOM树构建完毕后,两者结合形成render tree后,才对页面进行渲染绘制。
当CSS文件放于页面底部,会影响CSS的加载时间,因此在CSS没有全部加载并形成render tree之前,页面都处于空白状态,会导致白屏;如果使用@import标签,即使CSS放于头部,也可能出现白屏现象。
当JavaScript文件放于页面头部时,JavaScript会禁用并发加载,阻塞JavaScript后面内容的呈现及后面组件的下载,等到JavaScript文件全部加载完成后才会继续执行之后的代码,因此JavaScript文件放于头部也会导致页面白屏现象。 - FOUC:
对于Firefox浏览器,DOM树的构建与CSS的渲染时同步进行的。所以当CSS样式置于页面底部时,首先浏览器会对HTML的元素进行展示,当CSS全部加载完成后对样式进行修改,出现FOUS现象。
如果把CSS样式放在底部,对于IE浏览器,在某些场景下(点击链接,输入URL,使用书签进入等),也会出现 FOUC 现象。
async和defer的作用是什么?有什么区别
async和defer是异步加载脚本的的属性。
<script async src="script.js"></script>
加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。同时出现几个具有async属性的js文件,async属性不保证按照它们的先后顺序执行。
<script deferc src="script.js"></script>
加载script.js文件后面的文档元素过程将和script.js的加载异步进行,但 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。
简述网页的渲染机制
- 解析 HTML 标签, 构建 DOM 树
- 解析 CSS 标签, 构建 CSSOM 树
- 把 DOM 和 CSSOM 组合成 渲染树 (render tree)
- 在渲染树的基础上进行布局, 计算每个节点的几何结构
- 把每个节点绘制到屏幕上 (painting)