一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
回流
什么是回流?
回流就是因为元素的规模尺寸、布局、隐藏/显示等改变,需要重新构建页面,这就叫做回流。每个页面至少需要一次回流,因为页面在第一次加载的时候要渲染元素,必然会引起回流。
重绘
什么是重绘?
重绘就是一些元素需要更新属性,而这些属性只影响元素的外观、风格,而不会影响布局调整的,比如color,background-color等这些,就称为重绘。
区别
- 回流一定会引起重绘,重绘不一定会引起回流 比如,只改变颜色的时候只会发生重绘,而不会发生回流
- 当页面布局属性改变时,会引起回流 比如dom元素的宽高大小改变,或者显示隐藏元素
总结
回流比冲毁的代价更高,对性能影响很大。
怎么减少回流
减少回流的方式有很多种,这里主要介绍一下几种:
减少DOM的增删行为
比如你要删除某个节点,给某个父元素增加子元素,这类操作都会引起回流。如果要加多个子元素,最好使用documentfragment。
几何属性的变化
比如元素宽高变了,border变了,字体大小变了,这种直接会引起页面布局变化的操作也会引起回流。如果你要改变多个属性,最好将这些属性定义在一个class中,直接修改class名,这样只用引起一次回流。
元素位置的改变
修改一个元素的左右margin,padding之类的操作,所以在做元素位移的动画,不要更改margin之类的属性,使用定位脱离文档流后改变位置会更好。
获取元素的偏移量属性
例如获取一个元素的scrollTop、scrollLeft、scrollWidth、offsetTop、offsetLeft、offsetWidth、offsetHeight之类的属性,浏览器为了保证值的正确也会回流取得最新的值,所以如果你要多次操作,最取完做个缓存
浏览器窗口尺寸改变
esize事件发生也会引起回流。