回流(重排)(reflow)和重绘(repaint)

当我们请求一个地址,获取返回的html时。浏览器会进行如下的操作
1、浏览器将html代码解析成一个DOM树(包含dispaly: none, 以及js动态添加的dom)
2、浏览器将css解析成样式结构体
3、浏览器根据DOM树和css结构体结合生成render tree(不包含隐藏的DOM,render tree 每一个DOM都有自己的style)
4、浏览器会根据render tree去绘制页面
回流
1、当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)。每个页面都至少进行一次回流,就是页面第一次加载的时候。在回流的时候,浏览器会是渲染树中受到影响的部分失效,重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分在屏幕中,该过程叫做重绘。
2、如果只更改一些元素样式不改变结构,则重绘。
注:回流必定引起重绘,重绘不一定会引起回流。
发生回流
- 添加删除dom
- 元素位置改变
- 元素尺寸改变
- 内容改变
- 页面渲染初始化
- resize
减少回流、重绘
尽量减少对render tree的操作。