Skip to content

网页被解析的过程

服务器下载资源的过程,先下载 index.html,遇到 JavaScript、CSS 再下载它们:

示意图

浏览器的内核

  • 常见的浏览器内核有
    • Trident(三叉戟): IE、早期的 360 安全浏览器、早期的搜狗高速浏览器、早期的百度浏览器、早期的 UC 浏览器;(微软已经放弃);
    • Gecko( 壁虎): Mozilla Firefox;
    • Presto(急板乐曲)-> Blink (眨眼): Opera;
    • Webkit: Safari、移动端浏览器(Android、iOS);
    • Webkit -> Blink: Google Chrome,Edge,360 极速浏览器,搜狗高速浏览器等国内浏览器;

DNS解析

  • 我们经常说的浏览器内核指的是浏览器的排版引擎:
    • 排版引擎(layout engine),也称为浏览器引擎(browser engine)、页面渲染引擎(rendering engine)或样版引擎。

也就是一个网页下载下来后,就是由渲染引擎来帮助我们解析的。

渲染引擎如何解析页面呢?

示意图

解析一: HTML 解析过程

因为默认情况下服务器会给浏览器返回index.html文件,所以解析HTML是所有步骤的开始:

示意图示意图

解析二: 生成 CSS 规则

DNS解析

示意图

解析三: 构建 Render Tree

当有了DOM TreeCSSOM Tree后,就可以两个结合来构建Render Tree

示意图

注意一:link 元素不会阻塞 DOM Tree 的构建过程,但是会阻塞 Render Tree 的构建过程,这是因为Render Tree在构建时,需要对应的CSSOM Tree

注意二:Render Tree 和 DOM Tree 并不是一一对应的关系,比如对于displaynone的元素,压根不会出现在render tree中;

解析四 – 布局(layout)和绘制(Paint)

第四步是在渲染树(Render Tree)上运行**布局(Layout)**以计算每个节点的几何体。

  • 渲染树会表示显示哪些节点以及其他样式,但是不表示每个节点的尺寸、位置等信息;
  • 布局是确定呈现树中所有节点的宽度、高度和位置信息

第五步是将每个节点绘制(Paint)到屏幕上

  • 在绘制阶段,浏览器将布局阶段计算的每个 frame 转为屏幕上实际的像素点
  • 包括将元素的可见部分进行绘制,比如文本、颜色、边框、阴影、替换元素(比如 img)

示意图

Match selectors: 浏览器遍历 CSSOM,将选择器与 DOM 树中的元素匹配。这个过程决定了哪些 CSS 规则应用于哪些 DOM 元素。

Compute style: 在选择器匹配后,浏览器计算每个元素的最终样式。这包括计算具体的样式值,处理继承的样式以及解析因层叠产生的任何冲突。

Construct frames: 这通常是指生成布局树,它是渲染树的一部分,仅包含要布局和绘制的元素。这一步骤涉及确定文档的结构层次包含块

TIP

包含块: 指一个元素在哪个区域里面排列。

一个元素会生成四个盒子:margin、border、padding、content,如果这个元素有一个子元素,那这个子元素的包含块就是父元素的内容盒(content),而不能说是父元素。

如果一个元素是固定定位,那就要看它的祖先元素中有没有变形元素(transform),如果有,那它的包含块就是这个变形元素,如果没有,那包含块就是视口。

布局树和渲染树是有微小的差异,布局树是渲染树的子集,不包含渲染树中元素的颜色、背景、阴影等信息