chuiliu/dev-notes

浏览器的回流与重绘

Opened this issue · 0 comments

回流(Reflow):

当Render Tree中部分或全部元素的尺寸、结构、或者某些属性发生改变时,浏览器重新渲染部分或者全部文档的过程称为回流。

  • 页面首次渲染
  • 浏览器窗口大小发生改变
  • 元素尺寸或者位置发生改变
  • 元素内容变化
  • 元素字体大小变化
  • 添加或删除可见的DOM元素(必须是可见的元素。display: none;的元素不会触发回流)
  • 激活 CSS 伪类(:hover)
  • 查询某些属性或者调用某些方法
clientWidth、clientHeight、clientTop、clientLeft
offsetWidth、offsetHeight、offsetTop、offsetLeft
scrollWidth、scrollHeight、scrollTop、scrollLeft
scrollIntoView()、scrollIntoViewIfNeeded()
getComputedStyle()
getBoundingClientRect()
scrollTo()

重绘(Repaint):

元素样式的改变,并且这个改变不影响到元素的位置时
例如:background-color, color, visibility

回流必将引起重绘

避免频繁操作样式,一般通过修改class来一次性修改,以减少回流次数
避免频繁操作DOM,使用documentFragment,
在position为fixed或者absolute的元素上使用动画,以减避免导致其它元素的回流
避免使用table布局
避免使用css表达式
尽可能在DOM树的最末端改变class

参考:https://juejin.im/post/5a9923e9518825558251c96a