# 重绘和回流

TIP

浏览器渲染过程

  • 处理HTML标记,构建DOM树
  • 处理CSS标记,构建CSSOM树
  • 将DOM和CSSDOM合并成渲染树
  • 根据渲染树完成布局,并计算每个节点的集合信息
  • 将节点绘制到屏幕上

过程

# 重绘

页面元素样式改变,并不影响在文本中的位置,浏览器将样式赋予元素,并重新绘制,这个过程称为重绘,例如visibility,color,bgcolor,outline 等。

# 回流(reflow)

前面我们通过构造渲染树,我们将可见DOM节点以及它对应的样式结合起来,可是我们还需要计算它们在设备视口(viewport)内的确切位置和大小,这个计算的阶段就是回流。

  • 页面初次渲染
  • 改变font-size,font-family
  • 改变元素内外边距
  • 通过JS改变CSS样式
  • 通过JS获取DOM元素的位置相关属性
  • 改变窗口、文本大小
  • 激活伪类

# 优化

  • 减少重绘和回流,或者使用重绘代替回流
  • 批量修改(先脱离文档流,然后操作,再恢复)
  • css3硬件加速(transform、opacity、filters这些动画不会引起回流重绘)
  • 避免使用table
  • 避免使用CSS表达式
  • 频繁操作样式,可以将样式一次性赋值
  • DOM缓存

# 应用

  • 拖拽实现,通常可以使用postition: absolute实现,可以使用transform: translate进行优化。