渲染树的构建、回流、重绘、布局抖动

一、渲染树的构建、布局和绘制

DOM 和 CSSOM 树组合成一个渲染树(render tree),然后用于计算每个可见元素的布局(layout),并用作将像素渲染到屏幕的绘制(paint)过程的输入。 优化每个步骤对于实现最佳渲染性能至关重要。

构建渲染树(可见的节点及样式)—>布局也称回流(位置和大小)—>绘制(像素)

DOM 和 CSSOM 这两个都是独立的对象,它们捕获文档的不同方面:一个描述内容,另一个描述需要应用于文档的样式规则。 我们如何合并两者并让浏览器在屏幕上渲染像素?

要点:

  • DOM 和 CSSOM 树组合在一起形成渲染树。
  • 渲染树仅包含渲染页面所需的节点。
  • 布局计算每个对象的确切位置和大小
  • 最后一步是绘制,它采用最终的渲染树并将像素渲染到屏幕上。

1. 渲染树的构建

首先,浏览器将 DOM 和 CSSOM 组合成一个渲染树,它捕获页面上所有可见的 DOM 内容以及每个节点的所有 CSSOM 样式信息。
在这里插入图片描述
为了构建渲染树,浏览器大致执行以下操作:

第一步:从 DOM 树的根开始,遍历每个可见节点。

  • 一些节点是不可见的(例如,脚本标签、元标签等),并且被省略,因为它们不会反映在渲染的output中。

  • 一些通过CSS隐藏的节点,也从渲染树中省略。 例如,上面示例中的一个span节点从渲染树中丢失了,因为它被设置了“display:none”属性。

第二步:对于每个可见节点,找到适当的匹配 CSSOM 规则并应用它们。

第三步:发出带有内容及其计算样式的可见节点。

注意:
visibility:hidden 使元素不可见,但该元素仍然占据布局中的空间(即它被渲染为一个empty box)。
display:none 将元素从渲染树中完全删除,使得该元素不可见并且不是布局的一部分。

最终的output是一个包含屏幕上所有可见内容的内容和样式信息的渲染树。到目前为止,我们已经计算了哪些节点应该可见以及它们的计算样式。

有了渲染树,我们就可以进入“布局”阶段。

2. 布局

计算可见节点在设备视口中的确切位置和大小——这就是布局阶段,也称为回流

为了确定页面上每个节点的确切大小和位置,浏览器从渲染树的根开始并遍历它。

示例解说:

<!DOCTYPE html>
<html>
  <head>
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 JavaScript 中,(repaint)和回流(reflow)是与浏览器渲染相关的两个概念。 指的是当元素样式发生改变,但不影响其布局时,浏览器会根据新的样式制这个元素的过程。并不会引起页面的布局,只是改变了元素的外观。 回流指的是当 DOM 结构发生改变或者元素的布局属性发生改变时,浏览器需要新计算元素的几何属性(位置、大小等),然后构建渲染,这个过程就叫做回流回流会导致页面的布局,比如改变元素的宽高、位置、添加或删除元素等操作都会引起回流。 由于回流涉及到新计算元素的几何属性以及构建渲染,所以比的代价要高。频繁的回流操作会导致页面性能下降,因此在编写 JavaScript 代码时需要尽量避免频繁的回流操作。 为了减少回流,可以采取以下措施: 1. 使用 CSS3 的 transform 属性来替代 top/left 来进行位置调整,因为 transform 不会引起回流。 2. 对需要多次的元素,使用绝对定位(position: absolute)进行脱离文档流操作,然后再进行修改。 3. 批量修改样式时,可以先将元素的 display 属性设置为 none,然后再进行修改,最后再将 display 属性还原,这样可以减少回流次数。 4. 将需要多次操作的 DOM 元素缓存起来,减少对 DOM 的访问次数。 通过了解回流的概念,并采取相应的优化措施,可以提高页面的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值