前端 回流与重绘

176 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

回流

什么是回流?

回流就是因为元素的规模尺寸、布局、隐藏/显示等改变,需要重新构建页面,这就叫做回流。每个页面至少需要一次回流,因为页面在第一次加载的时候要渲染元素,必然会引起回流。

重绘

什么是重绘?

重绘就是一些元素需要更新属性,而这些属性只影响元素的外观、风格,而不会影响布局调整的,比如color,background-color等这些,就称为重绘。

区别

  1. 回流一定会引起重绘,重绘不一定会引起回流 比如,只改变颜色的时候只会发生重绘,而不会发生回流
  2. 当页面布局属性改变时,会引起回流 比如dom元素的宽高大小改变,或者显示隐藏元素

总结

回流比冲毁的代价更高,对性能影响很大。

怎么减少回流

减少回流的方式有很多种,这里主要介绍一下几种:

减少DOM的增删行为

比如你要删除某个节点,给某个父元素增加子元素,这类操作都会引起回流。如果要加多个子元素,最好使用documentfragment。

几何属性的变化

比如元素宽高变了,border变了,字体大小变了,这种直接会引起页面布局变化的操作也会引起回流。如果你要改变多个属性,最好将这些属性定义在一个class中,直接修改class名,这样只用引起一次回流。

元素位置的改变

修改一个元素的左右margin,padding之类的操作,所以在做元素位移的动画,不要更改margin之类的属性,使用定位脱离文档流后改变位置会更好。

获取元素的偏移量属性

例如获取一个元素的scrollTop、scrollLeft、scrollWidth、offsetTop、offsetLeft、offsetWidth、offsetHeight之类的属性,浏览器为了保证值的正确也会回流取得最新的值,所以如果你要多次操作,最取完做个缓存

浏览器窗口尺寸改变

esize事件发生也会引起回流。