1、回流概念
当对DOM的修改引起DOM位置和几何尺寸发生变化,会发生回流
2、触发条件
- 添加或删除可见的DOM元素(display:none)
- 元素的位置发生变化(left、top.....)
- 元素的尺寸发生变化(width、height、padding、margin、border)
- 内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代
- 页面一开始渲染的时候(这避免不了)
- 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的
- offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight
3、重绘概念
当对DOM的修改只是影响了样式,不影响几何属性时,会发生重绘(颜色, 背景色)
4、触发重绘的操作
- 背景色
- 文字色
- visibility:hidden(因为不改变DOM的位置和存在性,只是针对可见性)
- 文本方向的修改
- 阴影的修改
4、避免回流重绘的操作
- 将多次计算操作缓存起来,做一次操作
- 避免逐条改变样式,使用类别一次性操作
- 先设置成display:none;在设置完所有样式后,在设置display:block;
5、flush队列
现在的浏览器很聪明,对它来说每次操作DOM都发生回流或者重绘是不太可能的,所以他自己缓存了一个flush队列,当有回流或者重绘的时候,就放到队列中,当队列的任务多起来。或者到达一定的时候间隔,或者不得已的时候,就会将这些任务一口气出队。