回流: 当一个元素自身的宽高、布局、显示或隐藏、又或者元素内部的文字结构发生变化,导致需要重新构建页面的时候,就产生了回流。回流需要重新计算渲染树,成本高
重绘:当一个元素自身的宽高,布局及显示或隐藏没有改变,而只是改变了元素的的外观风格的时候,就产生了重绘。
回流必定会发生重绘,重绘不一定会引发回流。回流所需的成本比重绘高的多,改变父节点里的子节点很可能会导致父节点的一系列回流
什么时候会进行回流
- 添加或者删除可见的DOM元素
- 元素的位置发生改变
- 元素的尺寸发生改变
- 内容改变
- 页面第一次渲染时
什么时候会进行重绘
只改变自身样式,不会影响到其他元素; css样式改变 color、background-color、visibility、box-shadow等
如何减少回流和重绘
使用transfrom替代top
使用visibility替换display:none,因为前者只会引起重绘,后者会引发回流改变布局
避免使用table布局
尽可能在DOM树的末端改变class,回流不可避免,但可以减少其影响。尽可能在DOM树的末端改变class,可以限制回流范围,使其影响尽可能少的节点
避免设置多层内联样式
将动画效果应用到position属性为absolute或fixed的元素上,避免影响其他元素的布局
避免使用css表达式,会引发回流