05 | 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?
05 | 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?
讲述:李兵
时长13:11大小10.57M
构建 DOM 树
样式计算(Recalculate Style)
1. 把 CSS 转换为浏览器能够理解的结构
2. 转换样式表中的属性值,使其标准化
3. 计算出 DOM 树中每个节点的具体样式
布局阶段
1. 创建布局树
2. 布局计算
总结
思考时间
赞 67
提建议
精选留言(73)
- mfist2019-08-15关于下载css文件阻塞的问题,我理解 1 不会阻塞dom树的构建,原因Html转化为dom树的过程,发现文件请求会交给网络进程去请求对应文件,渲染进程继续解析Html。 2 会阻塞页面的显示,当计算样式的时候需要等待css文件的资源进行层叠样式。资源阻塞了,会进行等待,直到网络超时,network直接报出相应错误,渲染进程继续层叠样式计算展开
作者回复: 借这里解答下留的题目: 当从服务器接收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的解析。 所以JS和CSS都有可能会阻塞DOM解析,关于详细信息我们会在后面的章节中详细介绍。
共 28 条评论264 - Angus2019-08-15这节讲的有些过于省略了,好多东西没有深入去讲。我记得是DOM树和CSSOM树并行构建合成渲染树。从这个角度来说,不会阻塞DOM树的构建,但是会阻塞页面显示,因为页面显示需要完整的渲染树去完成布局计算。
作者回复: 和DOM不一样,在源码里面并没有CSSOM这个词,你说的CSSOM 应该是就是styleSheets,这个styleSheets是能直观感受的到的。 所将输入结构和输出结构分开,后续就可以更好地重构渲染模块的代码了! 这也是Chrome渲染团队目前在做的一件事。
共 7 条评论16 - 袋袋2019-08-15不阻塞dom合成,也不阻塞页面渲染,页面还是会生成,只不过没有样式而已,别忘了标签是有语义化的共 3 条评论7
- Aaaaaaaaaaayou2019-08-20css继承中应该不是所有的属性都会继承吧共 4 条评论6
- man-moonth2019-08-16我打开chrome面板的performance,记录了页面的加载过程。想请教一个问题。 首先确认一下几个概念: 1. recalculatestyle过程是指生成computedStyle过程吗? 2. DOMContentLoaded事件标识浏览器已经完全加载了 HTML,DOM 树已经构建完毕。 我发现在DOMContentLoaded之前,生成computedStyle和构建DOM的过程是并行的。我之前的想法是,计算DOM节点的样式(computedStyle)的前置条件是构建DOM、CSS生成StyleSheets并完成属性值标准化,这样才能保证DOM节点样式的计算有条不紊。我的问题是:浏览器是如何并行处理构建DOM、生成computedStyle的流程的?展开6
- 悬炫2019-08-28DOM树的构建和样式计算都是在渲染进程的主线程上执行的,他们可以并行执行吗?如果可以的话,那他们是如何来实现并行的呢?是通过异步回调还是说用的是类似于Generator函数的协程呢?在css会阻塞dom树的构建的情况下,主线程是如何去暂停DOM树的构建,后期又是如何恢复DOM树的构建的呢?希望老师解答一下共 2 条评论5
- Hong2021-04-17提个建议哈,老师讲到专有名词的时候,如果能把对应的英文名标注一下就更好了,比如提到的渲染树LayoutTree,否则可能容易造成困扰;上面内容如果再能详细深入一些就更好了。 觉得前端开发如何按上面的内容来回答,面试官可能不会很满意,最后还是推荐一片经典详文 https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/展开共 1 条评论4
- 许童童2019-08-15如果下载 CSS 文件阻塞了,会阻塞 DOM 树的合成吗?会阻塞页面的显示吗? 不会阻塞DOM 树的合成,但会阻塞页面的显示。 DOM 树和CSSOM树是并行生成的,两个都完成后才进行布局树的生成,但如果期间有JS文件,那就需要等待JS文件加载并执行完成,JS也需要等待CSSOM树生成,因为JS可能操作DOM树和CSSOM树。4
- William2019-08-15思考题。不会,CSS阻塞了,DOM树照样能正常解析和渲染。猜测浏览器机制,会优先渲染DOM到页面上。平时网络不好时遇到过。4
- abson2020-04-01老师你好,我特意试了一下在HTML文件分别写了link、style和内联样式的形式引入css代码,然后在谷歌浏览器控制台上输出styleSheets的时候发现styleSheetList数组就只有两个,分别是link和style,内联样式是没有的。您本文说styleSheet会把三种css引入方式都显示出来这里是否是有别的依据支持呢?共 2 条评论3
- why.2019-08-25dom 树解析在前,合成在后,既然解析阶段都阻塞了,合成那就更不用说了啊,阻塞,可以这样理解吗?
作者回复: 是的,理解的没问题
3 - Geek_4c51722022-05-02Chrome 版本:Version 103.0.5034.0 (Official Build) canary (arm64)。 通过一系列的试验,得出一些规律: 1. html解析渲染顺序是,对dom树进行深度遍历,依次解析渲染;例如:html -> head -> link(head) -> script(head) -> body -> ... 2. 当html渲染遇到css或js时,会阻塞html渲染;当css或js下载、解析、执行完毕之后,html将继续渲染。 3. js的下载和执行会阻塞css的解析。展开2
- 基础平台部-学习账号2021-07-22document.styleSheets接口只会返回引入和嵌入文档的样式表吧,不会返回内联样式,mdn有说明:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/stylesheets2
- Neil2021-06-25布局树构造过程示意图误导性太强了。计算样式阶段并不会生成"ComputedStyle"树,而是遍历styleSheets里的规则和DOM树,计算出每个DOM节点样式,放在每个DOM节点的ComputedStyle属性里。 参考: https://www.youtube.com/watch?v=m-J-tbAlFic https://www.youtube.com/watch?v=PwYxv-43iM4&list=PL9ioqAuyl6ULtk9hyUKX__VH1EBE5r4me&index=1展开共 2 条评论2
- tomision2020-02-10老师,有个问题: 前端优化中总是告诉我们将 <script> 标签放在 </body> 的前面,即页面的最底部; 除了放在顶部执行的时候可能获取不到想要的 dom 元素之外,放在底部其实也会阻塞 DOM 解析? 所以 DOM 解析是一点点渲染出来的还是一次性渲染出来的?如果是等待全部解析完成,再提交进入后续的流程,那其实 <script> 标签放在页面底部的价值呢?展开共 2 条评论2
- ytd2019-08-151,不会阻塞dom树生成,因为dom树只要把html下载下来后就可以生成了 2,会阻塞页面显示,浏览器需要等待下载样式表文件合成样式表,进行后面的样式计算。 但是实际观察chrome浏览器加载页面,即便某个样式文件因为网络错误不能下载,页面最终也会显示,是不是样式计算和后续的布局是一个反复的过程?即,先用浏览器默认样式和style标签内样式、内联样式合成并布局显示页面,等下载好外部样式表再次合成并布局。不知道这样理解对不对?另外,如果用户通过操作修改了样式,是不是合成和布局也需要重新进行?展开共 1 条评论2