浏览器渲染页面原理-重排重绘

本文详细介绍了浏览器的构成及其渲染过程,重点解析了从HTML文档到DOM树的构建过程,以及CSS规则与DOM树如何生成渲染树并最终显示在屏幕上。

本文参考以色列开发人员塔利·加希尔的研究成果。这是原文

我只是提炼一下文章中对我有用的知识点。

浏览器的构成

       1. 用户界面 - 包括地址栏、后退/前进按钮、书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分。
  2. 浏览器引擎 - 用来查询及操作渲染引擎的接口。
  3. 渲染引擎 - 用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来。
  4. 网络 - 用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作。
  5. UI后端 - 用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口。
  6. JS解释器 - 用来解释执行JS代码。

  7. 数据存储 - 属于持久层,浏览器需要在硬盘中保存类似cookie的各种数据,HTML5定义了web database技术,这是一种轻量级完整的客户端存储技术


这篇博客主要是第三部分,渲染引擎。

浏览器在解析html文档时,是从上到下解析,把html中的标签全部转换为dom树中的节点。通过解析html创建出了dom树。

dom树的根是document对象。dom树的节点与html文档中的标签是一一对应关系。如下代码:

<html>
<body>
<p>
Hello DOM
</p>
<div><img src=”example.png” /></div>
</body>
</html>

会被转化为下面的dom树


dom树的构建原理

解析html采用的是符号识别算法,简单说来,就是把html中的每个标签都识别为一个符号,规范中给每个符号定义了相对应的dom元素,所以这些符号被树构造器处理成,对应的dom元素。最后这些元素会被添加到dom树上。


对css文件解析会生成css规则,css规则与dom树结合之后生成渲染树。构建好渲染树之后是布局渲染树。最后是绘制渲染树。


这一系列过程是解析完一部分内容,就在浏览器上将其渲染出来。也就是说,浏览器并不会等html都解析完了后再去构建和布局render树。渲染引擎将会尽可能早的将内容呈现到屏幕上。

渲染树的定义

渲染树中的每个渲染对象用一个和该节点的css盒模型对应的矩形区域来表示(被称为帧或盒),包含宽高位置之类的几何信息。但是渲染对象和dom元素并不是一一对应的,比如display属性为none的dom元素,不会出现在渲染树中。

当DOM的变化影响了元素的几何属性(宽或高),比如以下这些情况:

1.添加或者删除可见的DOM元素
2.元素位置改变
3.元素尺寸改变
4.元素内容改变(例如:一个文本被另一个不同尺寸的图片替代)
5.页面渲染初始化(这个无法避免)
6.浏览器窗口尺寸改变

浏览器需要重新计算元素的几何属性,同样其他元素的几何属性和位置也会因此受到影响。浏览器会使渲染树中受到影响的部分失效,并重新构造渲染树。这个过程称为重排。

完成重排后,浏览器会重新绘制受影响的部分到屏幕,该过程称为重绘。

注意还有一些时候会触发重排重绘,就是获取布局信息的时候

比如:

  1. offsetTop, offsetLeft, offsetWidth, offsetHeight
  2. scrollTop, scrollLeft, scrollWidth, scrollHeight
  3. clientTop, clientLeft, clientWidth, clientHeight
  4. getComputedStyle() (currentStyle in IE)

以上属性和方法需要返回最新的布局信息,因此浏览器不得不执行渲染队列中的“待处理变化”并触发重排以返回正确的值。







<think>好的,用户想了解浏览器渲染原理,包括DOM树、CSS树的构建,以及重排的过程。我需要先整理这些概念,确保信息准确且符合用户需求。首先,DOM树的构建。根据引用[1]和[2],浏览器解析HTML生成DOM树,遇到script标签会暂停,直到脚本执行完毕。DOM树由节点组成,每个节点对应HTML元素,提供结构信息。这部分需要详细说明解析过程,比如字符转换为令牌,构建节点对象,形成树结构。 然后是CSSOM树的构建。引用[2]提到解析CSS生成CSSOM树,CSS的解析是逐步的,而且样式表会阻塞渲染,直到所有CSS解析完成。这里需要解释CSS规则如何叠加,以及为什么CSS会放在头部,比如避免FOUC(无样式内容闪烁)。接下来是渲染树的形成,即结合DOM和CSSOM生成渲染树。引用[1]指出渲染树只包含可见元素,比如排除display:none的元素。这里要强调渲染树的结构和如何应用样式计算。重排(回流)和的过程。引用[2]和[3]说明,重排是计算元素几何属性,导致位置变化,而是像素的制。需要举例说明哪些操作触发重排,比如修改宽度会触发重排,修改颜色只触发。优化部分,引用[3]和[4]提到减少重排的方法,比如使用类名批量修改样式,避免频繁读取布局属性。此外,script标签会阻塞DOM构建,建议将脚本放在底部或使用异步加载。可能用户的实际需求是优化网页性能,所以需要强调优化策略的要性。需要检查是否遗漏了关键点,比如合成层的概念,但根据引用,可能没有提到,所以暂时不加入。最后,生成相关问题,确保覆盖用户可能感兴趣的扩展内容,如优化技巧、具体例子、渲染树与DOM树的区别等。确保问题引导用户深入理解。</think>### 浏览器渲染原理详解 #### 一、DOM树与CSSOM树的构建 1. **DOM树构建** - 浏览器逐行解析HTML文档,将标签转换为**节点对象**并构建树状结构。 - 遇到`<script>`标签时会暂停解析,执行脚本后再继续[^4]。 - 示例:对于HTML片段`<div><p>text</p></div>`,会生成包含`div`和`p`节点的DOM树。 2. **CSSOM树构建** - 解析CSS规则(内联、外部、行内样式),生成**层叠样式表对象模型(CSSOM)**。 - CSS解析是逐步的,但浏览器会等待所有CSS加载完成后再构建CSSOM树[^2]。 - 示例:CSS规则`.class { color: red; }`会映射为CSSOM中的样式对象。 --- #### 二、渲染树(Render Tree)的生成 - 渲染树是DOM树和CSSOM树的结合体,仅包含**可见元素**(如排除`display: none`的节点)。 - 每个渲染对象(RenderObject)包含以下信息: ```plaintext 1. 节点几何属性(位置、尺寸) 2. 计算后的样式(RenderStyle) 3. 图层信息(RenderLayer) ``` 引用[^1]中提到的`RenderObject`类即描述这一结构。 --- #### 三、重排(Reflow)与(Repaint) 1. **重排**(布局阶段) - 触发条件:修改影响几何属性的操作(如宽度、高度、位置)。 - 过程:新计算渲染树中所有受影响节点的位置和大小[^3]。 - 示例:修改`width: 200px`会触发重排。 2. ****(制阶段) - 触发条件:修改不影响几何属性的视觉表现(如颜色、背景)。 - 过程:根据最新样式制像素到屏幕[^3]。 - 示例:修改`color: blue`仅触发--- #### 四、性能优化建议 1. **减少重排** - 使用`class`批量修改样式,而非逐行修改。 - 避免频繁读取布局属性(如`offsetHeight`),可先用变量缓存[^3]。 2. **异步加载脚本** - 将`<script>`标签放在页面底部,或添加`async/defer`属性以减少DOM构建阻塞[^4]。 3. **使用CSS动画替代JS动画** - 通过`transform`和`opacity`触发GPU加速,减少主线程压力[^3]。 --- #### 五、完整渲染流程总结 $$ \begin{aligned} &1.\ \text{解析HTML → 生成DOM树} \\ &2.\ \text{解析CSS → 生成CSSOM树} \\ &3.\ \text{合并DOM与CSSOM → 生成渲染树} \\ &4.\ \text{计算布局(重排)} \\ &5.\ \text{制像素()} \\ &6.\ \text{合成图层并显示} \end{aligned} $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值