1. 当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(其实我觉得叫重新布局更简单明了些)。每个页面至少需要一次回流,就是在页面第一次加载的时候。
2. 当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color。则就叫称为重绘。
注:从上面可以看出,回流必将引起重绘,而重绘不一定会引起回流。
任何对render tree中元素的操作都会引起回流或者重绘,比如
1. 添加、删除元素(回流+重绘)
2. 隐藏元素,display:none(回流+重绘),visibility:hidden(只重绘,不回流)
3. 移动元素,比如改变top,left(jquery的animate方法就是,改变top,left不一定会影响回流),或者移动元素到另外1个父元素中。(重绘+回流)
4. 对style的操作(对不同的属性操作,影响不一样)
5. 还有一种是用户的操作,比如改变浏览器大小,改变浏览器的字体大小等(回流+重绘)
引起DOM树结构变化,页面布局变化的行为叫回流,且回流一定伴随重绘。只是样式的变化,不会引起DOM树变化,页面布局变化的行为叫重绘,且重绘不一定会便随回流。
1、改变字体
2、增加或者移除样式表
3、内容变化,比如用户在input框中输入文字
4、激活css伪类,比如 :hover
5、脚本操作DOM
6、计算offsetWidth和offsetHeight属性:在页面上的定位元素在滚动页面的时候会引起重绘
7、设置style属性的值
通过上图操作 后 我们在浏览页面的 时候如果发生了重绘 页面重绘的部分就会高亮绿色如下图
在HTML中,每个元素都可以理解成一个盒子,在浏览器解析过程中,会涉及到回流与重绘。回流 :布局引擎会根据各种样式计算每个盒子在页面上的大小与位置。
在页面初始渲染阶段,回流不可避免的触发,可以理解成页面一开始是空白的元素,后面添加了新的元素使页面布局发生改变。
当渲染树的一部分因为元素的规模尺寸、布局、隐藏等改变需要重新构建的操作,会影响布局的操作。
重绘 :当计算好盒模型的位置、大小及其他属性后,浏览器根据每个盒子特性进行绘制。
当渲染树的一些元素只需更新属性,而这些属性只会影响元素的外观,而不影响布局的操作。浏览器不需重新计算元素的几何属性、直接为该元素绘制新的样式,这里就仅仅触发了重绘。
回流 触发时机
任何会改变元素几何信息(元素的位置和尺寸大小)的操作,都会触发回流。
1)添加或者删除可见的 DOM 元素;
2)元素的位置发生变化,元素尺寸改变(边距、填充、边框、宽度和高度);
3)内容变化。比如文本变化(用户在 input 框中输入文字)、图片被另一个不同尺寸的图片所替代;
4)浏览器窗口尺寸改变。如resize事件发生时。
5)获取一些特定属性的值。offsetTop、offsetLeft、
offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeigh。这些属性有一个共性,就是需要通过即时计算得到。因此浏览器为了获取这些值,也会进行回流。
6)当你修改网页的默认字体时。
常见的回流:
重绘 触发时机
回流必定会发生重绘,重绘不一定会引发回流。
常见的重绘:
1)使用 transform 替代 top
2)不要把节点的属性值放在一个循环里当成循环里的变量。
3)避免使用 table 布局,可能table 中每个元素的大小以及内容的改动会造成整个 table 的重新布局。
4)对于那些复杂的动画,对其设置 position: fixed/absolute,尽可能地使元素脱离文档流,从而减少对其他元素的影响
5)把 DOM 离线后修改。如:使用 documentFragment 对象在内存里操作 DOM。我们还可以通过通过设置元素属性display: none,将其从页面上去掉,然后再进行后续操作,这些后续操作也不会触发回流与重绘,这个过程称为离线操作。
6)如果想设定元素的样式,通过改变元素的 class 类名。不要一条一条地修改 DOM 的样式。与其这样,还不如预先定义好 css 的 class,然后修改 DOM 的 className。
--end--