浏览器的重绘与重排
浏览器的重绘与重排
重绘与重排的概念与区别
重排
当DOM的变化影响了元素的几何信息,浏览器需要重新计算元素的几何属性,将其安放在界面中的正确位置,这个过程叫做重排。表现为重新生成布局,重新排列元素。
重绘
当一个元素的外观发生变化,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。表现为某些元素的外观变化。
单单改变元素的外观,肯定不会引起网页重新生成布局,但当浏览器完成重排之后,将会重新绘制受到此次重排影响的部分。
重排和重绘代价是高昂的,它们会破坏用户体验,并且让UI展示非常迟缓,而项目之下重排的性能影响更大,在两者无法避免的情况下,一般我们宁可选择代价更小的重绘。
重绘不一定会出现重排,重排必然会出现重绘
如何触发重排和重绘
任何改变用来构建渲染树的信息都会导致一次重排或重绘:
- 添加、删除、更新DOM节点
- 通过display:none;隐藏一个DOM节点——触发重排和重绘
- 通过visibility:hidden;隐藏一个DOM节点——只触发重绘,因为没有几何变化
- 移动或者给页面中的DOM节点添加动画
- 添加一个样式表,调整样式属性
- 用户行为,例如调整窗口大小,改变字号,或者滚动。
如何避免重绘或者重排
- 集中改变样式,不要一条一条地修改DOM样式。
- 不要把DOM节点的属性值放在循环里,当成循环里的变量
- 为动画的HTML节点使用 flex布局或者 position:absoult;那么修改他们的css是不会导致重排的。
- 不使用table布局,因为可能很小的一个改动会造成整个table的重新布局
- 避免循环添加DOM节点,可以把子元素添加到一个盒子里,最后再插入元素中