在浏览器渲染页面时,会经历两个关键的步骤:回流(reflow)和重绘(repaint)。页面无论是回流还是重绘都是比较耗性能的,只是重绘开销相对较小,所以都要尽量避免。那么我们就需要了解和理解它们呢,才能更好地去减少这些性能消耗。那下面讲讲是回流与重绘的区别?
一、回流、重绘是什么?
1、什么叫回流?
当页面的布局和几何属性发生变化时,浏览器需要重新计算和调整页面元素的位置、大小以及布局关系,这个过程称为回流。回流是耗费性能的操作,因为需要重新计算整个或部分页面的布局。
2、什么叫重绘?
重绘是指当页面的外观发生改变时,浏览器会对元素的样式进行更新。重绘不会引起页面结构上的变化,只是更新元素的外观。相对于回流来说,重绘是一项开销较小的操作。
二、两者之间的关系是什么?
回流会导致重绘,但是重绘不一定会导致回流。当一个元素的样式发生改变时,浏览器会先进行重绘,然后根据新的样式计算元素的位置和大小,最后进行回流。但是只进行重绘时,不需要重新计算元素的位置和大小,因此可以减少性能的消耗
三、区别
1、回流会触发重绘,但重绘不一定会触发回流。因为回流是重绘的前提条件,所以回流比重绘更耗时。
2、回流会重新计算元素的位置和大小,会涉及到整个页面布局的计算。而重绘只会重新绘制元素的外观,不会影响元素的位置和大小。
3、回流操作比重绘操作更昂贵,因为它需要重新计算整个页面的布局。所以在编写代码时,应尽量避免频繁的回流操作,以提高页面性能。
三、如何避免不必要的回流
为了优化页面渲染性能,开发者应该尽量减少回流的次数,因为回流是较为昂贵的操作
1、使用 CSS3 的 transform 和 opacity 属性来替代使用 top、left 等位置和尺寸相关的属性,因为 transform 和 opacity 不会引起回流。
2、尽可能在DOM树的末端进行操作,避免对整个页面进行回流。
3、对需要多次重复操作的元素,先将其隐藏(display: none),然后进行多次操作,最后再显示。
4、避免频繁访问样式信息,可以将样式信息缓存起来,在需要时直接读取缓存,而不是每次都从 DOM 中获取。
5、如果有需要对多个元素进行样式修改的情况,可以先将它们的样式修改放到一个样式修改块中,然后一次性修改,以避免多次触发回流操作。
6、尽量使用css3动画来替代使用js实现的动画效果,因为css3动画是在浏览器的图形处理单元(GPU)中运行的,减少了对页面布局的影响,可以提高动画的性能。
总之,减少回流和重绘可以提高页面的性能和响应速度,有助于提升用户体验。因此,在开发前端页面时,需要注意避免频繁触发回流和重绘的操作,并采取相应的优化策略。