按照渲染的时间顺序,可分为以下几个阶段:构建DOM树、样式计算、布局阶段、分层、绘制、光栅化和合成。
- 浏览器不能直接理解HTML数据,所以第一步是需要将其转化为浏览器能够理解的DOM树结构。
- 生成DOM树之后,还有根据CSS样式表,来计算出DOM树所有节点的样式。
- 最后计算DOM元素的布局信息,使其都保存在布局树中。
如果下载 CSS 文件阻塞了,会阻塞 DOM 树的合成吗? 会阻塞页面的显示吗?
在我自己理解的是,不会阻塞DOM树的合成,因为在DOM树合成之后才会根据DOM树计算其所有节点的样式。而且我们经常看见css文件加载不出来,就会显示出没有样式的页面。但是事实好像没有那么简单。
以下的内容是作者的回答,真的我是第一次发现评论区会有答案,之前一直以为文后的问题是让我们思考用的。
第一种情况
当从服务器接收HTML页面的第一批数据时,DOM解析器就开始工作了,在解析过程中,如果遇到了JS脚本,如下所示:
<html><body>极客时间<script>document.write("--foo")</script></body></html>
那么DOM解析器会先执行JavaScript脚本,执行完成之后,再继续往下解析。
那么第二种情况复杂点了,我们内联的脚本替换成js外部文件,如下所示:
<html><body>极客时间<script type="text/javascript" src="foo.js"></script></body></html>
这种情况下,当解析到JavaScript的时候,会先暂停DOM解析,并下载foo.js文件,下载完成之后执行该段JS文件,然后再继续往下解析DOM。这就是JavaScript文件为什么会阻塞DOM渲染。
我们再看第三种情况,还是看下面代码:
<html><head><style type="text/css" src = "theme.css" /></head><body><p>极客时间</p><script>let e = document.getElementsByTagName('p')[0]e.style.color = 'blue'</script></body></html>
当我在JavaScript中访问了某个元素的样式,那么这时候就需要等待这个样式被下载完成才能继续往下执行,所以在这种情况下,CSS也会阻塞DOM的解析。
