看面试题查漏补缺中,不太熟悉的点重新学习,输出文章,备战秋招。 这篇文章是讲浏览器怎么渲染出页面的。
顺带一提:本文有一些很好的过程图,是从参考文章里引用过来的,并且参考文章的图好像又是极客时间的李兵老师的视频里的。(😅)
HTML
,生成DOM树
CSS
,生成CSSOM树
Layout
)
DOM树
和CSSOM树
,生成渲染树
Layer
)
Paint
)
DOM树
为什么要生成DOM
树?
因为浏览器不理解和使用HTML
,所以需要解析HTML
,转换成浏览器能够理解的结构。
上面的HTML
中获取某个节点,以及属性等都非常不方便。
生成DOM树
之后就很方便了。根节点是document
,比如我们想要访问span
标签的时候只需要document.body.children[0].firstElementChild
就可以了。如果没有生成DOM树
,那获取起来就超级复杂了,仔细想想都会觉得麻烦。
从上面的那张图,我们也可以看出来,有一个HTML解析器
的模块,将输入的HTML
解析、转换成DOM树
输出。那么它是怎么解析的呢?
Token
。Token
分为Tag token
和文本Token
。Tag Token
又能分成Start Tag
和End Tag
。如<div>
和</div>
。
Token
列表解析为DOM节点
。可以使用栈结构来实现,遇到开始标签就入栈,遇到结束标签就出栈。(这一部分详细的知识应该是AST
抽象语法树那一块的,后续研究完再写博客)
CSSOM树
生成CSSOM树
和生成DOM树
的目的一样,都是转换为浏览器能够理解的结构。
通过document.styleSheets
可以查看最后的结构。CSSOM
结构主要是给JavaScript提供操作样式表的能力,以及提供基础的样式信息。
上面生成DOM树
就OK了,但是这里生成CSSOM树
之后,还需要进行两步操作:
px
、em
等
red
、rgb(255, 0, 0)
等
bold
、700
等
很明显,我们能根据习惯来随意选择,但是渲染引擎理解起来就很麻烦,所以需要将所有值转换为渲染引擎容易理解、标准化的计算值。
渲染树
生成渲染树
的实现其实就是上两步生成的DOM树
、CSSOM树
结合起来。
注意:\color{red}display为none的节点不会上树,而visibility为hidden的节点还是会上树。
因为display
为none
就是指将节点从DOM树
上移出去,也就是说如果这个时候上树,之后还得把它移出去。所以就在生成渲染树
的阶段直接不让它上树。而visibility
为hidden
只是让该节点隐藏起来而已,只是看不见,其他样式都还在。
生成渲染树的示例图:
生成渲染树
之后,需要计算渲染树
每个节点的大小和位置。
后续请看下一篇