重绘和回流

重排/回流 reflow

页面生成过程

渲染

重排比重绘大

重绘 repaint

发生重排的情况

  • 页面初始渲染,这是开销最大的一次重排
  • 添加/删除可见的DOM元素
  • 改变元素位置
  • 改变元素尺寸,比如边距、填充、边框、宽度和高度等
  • 改变元素内容,比如文字数量,图片大小等
  • 改变元素字体大小
  • 改变浏览器窗口尺寸,比如resize事件发生时
  • 激活CSS伪类(例如::hover)
  • 设置 style 属性的值,因为通过设置style属性改变结点样式的话,每一次设置都会触发一次reflow
  • 查询某些属性或调用某些计算方法:offsetWidth、offsetHeight等,除此之外,当我们调用 getComputedStyle方法,或者IE里的 currentStyle 时,也会触发重排,原理是一样的,都为求一个“即时性”和“准确性”。

重排优化建议

减少重排范围

减少重排次数

总结

  • 渲染的三个阶段 Layout,Paint,Composite Layers。
    • Layout:重排,又叫回流。
    • Paint:重绘,重排重绘这些步骤都是在 CPU 中发生的。
    • Composite Layers:CPU 把生成的 BitMap(位图)传输到 GPU,渲染到屏幕。 -CSS3 就是在 GPU 发生的:Transform Opacity。在 GPU 发生的属性比较高效。所以 CSS3 性能比较高。