浏览器工作原理之重绘回流

重绘回流

  重绘和回流是在页面渲染过程中非常重要的两个概念。页面生成以后,脚本操作、样式表变更,以及用户操作都可能触发重绘和回流

1⃣️ 回流

  回流reflow是firefox里的术语,在chrome中称为重排relayout

  回流是指窗口尺寸被修改、发生滚动操作,或者元素位置相关属性被更新时会触发布局过程,在布局过程中要计算所有元素的位置信息。由于HTML使用的是流式布局,如果页面中的一个元素的尺寸发生了变化,则其后续的元素位置都要跟着发生变化,也就是重新进行流式布局的过程,所以被称之为回流

  前面介绍过渲染引擎生成的3个树:DOM树、Render树、Render Layer树。回流发生在Render树上。常说的脱离文档流,就是指脱离渲染树Render Tree

  触发回流包括如下操作:

  1、DOM元素的几何属性变化

  2、DOM树的结构变化

  3、获取下列属性

offsetTop\offsetLeft\offsetWidth\offsetHeight\scrollTop\scrollLeft\scrollWidth\scrollHeight\clientTop\clientLeft\clientWidth\clientHeight\getComputedStyle()\currentStyle()

 4、改变元素的一些样式

  5、调整浏览器窗口大小

扫描二维码关注公众号,回复: 9413514 查看本文章

  触发回流一定会触发后续的重绘操作,而且对一个元素的回流,可能会影响到父级元素。比如子元素浮动后,父元素会出现高度塌陷的情况。所以,性能优化的重点在于尽量只触发小规模的重绘,尽量不触发回流

2⃣️ 重绘

  重绘是指当与视觉相关的样式属性值被更新时会触发绘制过程,在绘制过程中要重新计算元素的视觉信息,使元素呈现新的外观

  由于元素的重绘repaint只发生在渲染层 render layer上。所以,如果要改变元素的视觉属性,最好让该元素成为一个独立的渲染层render layer

  下面以元素显示为例,进行说明。实现元素显示隐藏的方式有很多

  display: none/block,会引起回流,从而引起重绘,性能较差

  visibility: visibile/hidden,只引起重绘,但由于没有成为一个独立的渲染层,会引起整个页面(或当前渲染层)的重绘,性能较好

  opacity: 0/1,opacity小于1时,会产生render layer。所以opacity在0、1的变化中,引起了render layer的生成和销毁,因此,也会引起回流,从而引起重绘,性能较差。如果opacity: 0/0.9,则只会引起重绘

  如果对一个元素使用硬件加速渲染,如具有CSS 3D属性,则不会进行重绘和回流。但如果使用硬件渲染的元素过多,会造成GPU的传输压力

3⃣️性能优化

  下面列举一些减少回流次数的方法

  1、不要一条一条地修改DOM样式,而是修改className或者修改style.cssText

  2、在内存中多次操作节点,完成后再添加到文档中去

  3、对于一个元素进行复杂的操作时,可以先隐藏它,操作完成后再显示

  4、在需要经常获取那些引起浏览器回流的属性值时,要缓存到变量中

  5、不要使用table布局,因为一个小改动可能会造成整个table重新布局。而且table渲染通常要3倍于同等元素时间

  此外,将需要多次重绘的元素独立为render layer渲染层,如设置absolute,可以减少重绘范围;对于一些进行动画的元素,可以进行硬件渲染,从而避免重绘和回流

发布了22 篇原创文章 · 获赞 2 · 访问量 3339

猜你喜欢

转载自blog.csdn.net/Geezer_007/article/details/100398762