写在前面
在讨论今天的主角之前,我们要先了解一下浏览器的渲染机制。以Google
,Firefox
,Safari
为例,Firefox
使用Geoko——Mozilla
自主研发的渲染引擎,Safari
和Chrome
都使用 webkit
。
我们主要以 Webkit
的主流程为例
- 浏览器使用流式布局模型 (Flow Based Layout)
- 解析
HTML
生成DOM
树 - 解析
CSS
生成CSSOM
规则树 - 将
DOM
树与CSSOM
规则树合并在一起生成渲染树Render Tree
- 根据渲染树遍历拿到每个节点开始布局,计算每个节点的位置大小信息
- 将渲染树每个节点绘制到屏幕
回流(Reflow)
上面我们知道,我们会根据 Render Tree
去遍历渲染,所以当我们的节点发生改变时,浏览器重新渲染部分节点或者全部文档,我们称这个过程为回流
大致整理会导致回流的一些操作
- 页面首次渲染
- 浏览器窗口大小发生改变
- 元素尺寸或位置发生改变
- 元素内容变化(文字数量或图片大小等等)
- 元素字体大小变化
- 添加或者删除可见的DOM元素
- 激活CSS伪类(例如: