首先,重绘不一定引发重排,重排一定引发重绘
引发重绘
某些元素的外观被改变所触发的浏览器行为,会触发重绘
例如:修改元素的填充颜色,会触发重绘
引发重排
重新生成布局,重新排列元素,会触发重排
触发重排的事件有:改元素的宽高,对CSS钟能影响布局的元素的像素大小进行修改
重绘和重排的影响
首先进行重排的话,会对整个HTML根节点进行一定的内存消耗,对浏览器的性能开支有非常大的要求
同时重绘和重排有两种影响范围:
局部影响
对渲染树的某部分或某一个渲染对象进行重新布局
全局影响
从根节点html开始对整个渲染树进行重新布局
如何减少重绘和重排
原则:能重绘就不要重排
解决办法:
- 对需要同时进行重绘和重排的元素,尽可能的使用
样式集来进行修改,只进行一次重绘和重排,将多余的重绘和重排全部集中在一次重绘重排中 - 将需要修改的元素节点设置为
display:none,在修改完成之后再次修改为display:block,将元素隐藏,再进行修改,这样可以将元素离线,只进行两次的重排操作 - 将需要修改的元素节点设置为
position:fixed或者display:absolute将其脱离文档流,进行局部的修改,减少重排的范围 - 利用缓存:比如说,使用Ajax获取后端的数据,将其渲染到页面里面,此时如果一个个进行渲染,势必造成多次大面积的重排,但是将其合并为一次操作,就可以一次性减少大量的重排