什么是浏览器的回流和重绘,以及如何减少回流和重绘

浏览器渲染原理

  • 解析HTML,生成DOM树,解析CSS,生成CSSOM树
  • 将DOM树和CSSOM树结合,生成渲染树(Render Tree)

回流:

  • 回流是布局或者几何属性需要改变就称为回流。回流是影响浏览器性能的关键因素,因为其变化涉及到部分页面(或是整个页面)的布局更新。一个元素的回流可能会导致了其所有子元素以及DOM中紧随其后的节点、祖先节点元素的随后的回流。

重绘:

  • 重绘是由于节点的几何属性发生改变或者由于样式发生改变但不会影响布局。例如outline, visibility, color、background-color等,重绘的代价是高昂的,因为浏览器必须验证DOM树上其他节点元素的可见性。
什么时候会发生回流

1、添加或删除可见的DOM元素

2、元素的位置发生变化

3、元素的尺寸发生变化(包括外边距、内边框、边框大小、高度和宽度等)

4、内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代。

5、页面一开始渲染的时候(这肯定避免不了)

6、浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)

而重绘是指在布局和几何大小都不变得情况下,比如次改一下background-color,或者改动一下字体颜色的color等。

注意:回流一定会触发重绘,而重绘不一定会回流

如何减少回流和重绘
1、CSS优化法

(1)使用 transform 替代 top

(2)使用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(改变了布局

(3)避免使用table布局,可能很小的一个小改动会造成整个 table 的重新布局。

(4)尽可能在DOM树的最末端改变class,回流是不可避免的,但可以减少其影响。尽可能在DOM树的最末端改变class,可以限制了回流的范围,使其影响尽可能少的节点。

(5)避免设置多层内联样式,CSS 选择符从右往左匹配查找,避免节点层级过多。

(6)将动画效果应用到position属性为absolute或fixed的元素上,避免影响其他元素的布局,这样只是一个重绘,而不是回流,同时,控制动画速度可以选择 requestAnimationFrame,详见探讨 requestAnimationFrame。

(7)避免使用CSS表达式,可能会引发回流。

(8)将频繁重绘或者回流的节点设置为图层,图层能够阻止该节点的渲染行为影响别的节点,例如will-change、video、iframe等标签,浏览器会自动将该节点变为图层。

(9)CSS3 硬件加速(GPU加速),使用css3硬件加速,可以让transform、opacity、filters这些动画不会引起回流重绘 。但是对于动画的其它属性,比如background-color这些,还是会引起回流重绘的,不过它还是可以提升这些动画的性能。

2、JavaScript优化法

(1)避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。

(2)避免频繁操作DOM,创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中。

(3)避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。

原文博客链接地址:https://www.cnblogs.com/wwwxxjsyy/p/12559272.html

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回流(reflow)和重绘(repaint)是浏览器渲染页面时的两个重要概念。 回流是指当 DOM 的变化影响了元素的布局,需要重新计算元素的位置和大小,然后重新构建渲染树,最后进行绘制的过程。回流可能会导致一些性能问题,因为它需要计算布局,这是一项非常耗费资源的操作。触发回流的操作包括: - 添加、删除或修改 DOM 元素 - 改变元素的位置、大小 - 改变元素的内容、文字 - 改变窗口大小或滚动 - 修改样式(尤其是影响元素盒模型的样式,例如 width、height、padding、margin 等) 重绘是指当渲染树中的元素样式改变,但没有影响它们的布局时,浏览器只需要重新绘制这些元素的内容,而不需要重新计算它们的位置和大小。重绘回流的开销要小一些,但也需要花费一定的时间。触发重绘的操作包括: - 改变元素的颜色、背景色、边框颜色等 - 改变元素的文本颜色、字体大小等 - 添加、删除、改变元素的阴影、透明度等 因此,为了提高页面性能,我们应该尽可能地减少回流重绘的次数。可以采取的措施包括: - 避免频繁读取和修改 DOM 元素的样式和属性,可以使用缓存或批量修改的方式来优化 - 使用 CSS3 动画代替 JavaScript 实现动画效果,因为 CSS3 动画可以利用硬件加速,而 JavaScript 实现的动画会导致频繁的回流重绘 - 将元素的 position 属性设置为 fixed 或 absolute,因为这些元素不会影响其他元素的布局,可以减少回流的次数 - 将元素的 opacity 属性设置为 0 或 1,而不是使用 visibility:hidden 或 display:none,因为前者只会触发重绘,而后者会触发回流

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值