CSS和JS在网页中的放置顺序是怎样的
- CSS应该放在页面顶部的<head>标签中
- 由于Render tree是由DOM树和CSSOM树组成的,HTML页面需要等到CSS解析完后才能完成渲染,所以CSS应放在<head>标签内,优先下载解析,以避免网页元素由于样式缺失造成的瞬间白页或者给用户带来闪烁感
- JS应该放在<body>的底部
- 因为浏览器需要一个稳定的DOM树结构,而且JS中很有可能代码直接改变了DOM树结构,浏览器为了防止出现JS修改DOM树,需要重新构建DOM树的情况,所以就会阻塞其它的下载和呈现
- 对于图片和CSS,在加载时会并发加载,但在加载JS时会禁用并发,并且阻止其他内容的下载,所以把JS放在页面顶部会造成白屏现象
- 如果CSS和JS都在head标签内,则应将JS放在所有CSS的后面JS的执行有可能依赖最新样式。比如,可能会有var width=$('#id').width,这意味着,JS代码在执行前,浏览器必须保证在此JS之前的所有CSS(无论外链还是内嵌)都已下载和解析完成
解释白屏和FOUC
- 白屏
- 如果把样式放在底部,对于IE浏览器,在某些场景下(新窗口打开,刷新等)页面会出现白屏,而不是内容逐步展现
- 如果使用 @import 标签,即使 CSS 放入 link, 并且放在头部,也可能出现白屏。因为脚本会阻塞后面内容的呈现和其后组件的下载
- 对于图片和CSS,在加载时会并发加载(如一个域名下同时加载两个文件)。但在加载JavaScript 时,会禁用并发,并且阻止其他内容的下载。所以把JavaScript放入页面顶部也会导致白屏现象
- FOUC(无样式内容闪烁)
- 对于IE浏览器,在某些场景下(点击链接,输入URL,使用书签进入等),会出现FOUC(Flash of Unstyled Content)无样式内容闪烁现象(逐步加载无样式的内容,等CSS加载后页面突然展现样式)。由于浏览器渲染机制不同,Firefox会一直表现出FOUC
async和defer的作用是什么?有什么区别
- 作用:可以让html文档和js并行进行(异步)加载;
- 区别:区别主要在于对于加载完成的JS执行的时间;
- defer:在js加载完成后,它的执行要在所有元素解析完成后才能执行;(有先后顺序)
- async:加载和渲染后续文档的过程和js的加载、执行并行进行;(没有顺序可言)
蓝色代表网络读取,红色代表执行时间,绿色代表HTML解析;
参考
简述网页的渲染机制
- 解析 HTML 标签, 构建 DOM 树
- 解析 CSS 标签, 构建 CSSOM 树
- 把 DOM 和 CSSOM 组合成 渲染树 (render tree)
- 在渲染树的基础上进行布局, 计算每个节点的几何结构
- 把每个节点绘制到屏幕上 (painting)