重排和重绘的区别与联系

一、基本概念

1.重排(重构/回流/reflow):

        当渲染树中一个或多个元素的规模尺寸,布局,隐藏等发生改变时,需要重新构建渲染树, 就会形成重排。

2.重绘(repaint或redraw):

        重绘是指一个元素外观的改变所触发的浏览器行为,浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。重绘发生在元素的可见的外观被改变,但并没有影响到布局的时候。例如,仅修改DOM元素的字体颜色、背景颜色等等

 二、触发重排的场景

任何页面布局和几何属性的改变都会触发重排:

  • 页面的初始化渲染(无法避免,故而每个页面至少会进行一次重排)
  • 添加或删除可见的DOM元素
  • 元素位置的改变,或者使用动画
  • 元素尺寸的改变——大小,外边距,边框
  • 浏览器窗口尺寸的变化
  • 填充内容的改变,比如文本的改变或图片大小改变而引起的计算值宽度和高度的改变

重排必定会引发重绘,但重绘不一定会引发重排

三、如何避免频繁的触发回流和重绘: 

  • 避免频繁使用 style,最好采用修改class类名的方式
  • 将动画效果应用到position属性为absolute或fixed的元素上
  • 可以先为元素设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘
  • 使用createDocumentFragment进行批量的 DOM 操作
  • 对于 resize、scroll 等进行防抖/节流处理。
  • 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来
  • 利用 CSS3 的transform、opacity、filter这些属性可以实现合成的效果,也就是GPU加速

猜你喜欢

转载自blog.csdn.net/gkx19898993699/article/details/130540113