repaint&reflow

关于重绘和回流以及如何避免

重绘(repaint):渲染树(Render Tree,由DOM树和CSSOM树合并而成)节点改变,但不影响该节点在页面当中的空间位置及大小。譬如某个div标签节点的背景颜色、字体颜色等等发生改变,但是该div标签节点的宽、高、内外边距并不发生变化,此时触发浏览器重绘。

回流,也叫做重排(reflow):和前者不同的是,在渲染树节点发生改变,影响了节点几何属性,导致节点位置发生变化,此时触发浏览器回流,重新生成渲染树。

如何避免

Reflow会导致子节点、父节点和兄弟节点的Reflow。追根溯源,还是从渲染树方面着手优化,减少对渲染树的操作,减少对信息的不断请求。

1.离线处理操作元素

用display:none 隐藏元素,然后对该元素进行所有的操作,最后再显示出来。利用display:none进行元素操作不影响回流和重绘。

2.使用absolute location(一个老概念了,不知道有没有新方法)

用绝对定位让它脱离文档流

3.避免触发同步布局事件

定义出嵌套在循环里的属性,通过跳出循环,减少浏览器的强制清空队列操作