浏览器中的重绘和重排

文章类型:Javascript

发布者:admin

发布时间:2023-02-22

DOM节点和CSS节点的改动都可能会造成渲染树的重新构建。渲染树的改动就会造成页面的重排或者重绘

重排一定触发重绘,但重绘不一定触发重排

一:重排(Reflow)

DOM树结构,尺寸,排版的变化(改变元素的大小、位置、布局方式等),渲染树里有改动的节点和它影响的节点都要重新计算。这个过程就叫做重排,也称为回流,需要重新渲染页面

1:添加或者删除可见的DOM元素

2:元素的字体大小发生变化

3:查询某些属性或者调用某些方法,比如offsetLeft/Top/Height/Width

4:元素的尺寸或者位置发生变化

5:元素的内容发生变化

6:激活CSS伪类

7:浏览器窗口大小发生变化

8:页面首次渲染

浏览器渲染页面是基于流式布局,会导致周围DOM元素重新排列

1:全局范围:对整个渲染树进行重新布局

2:局部范围:对渲染树的某一部分或者一个渲染重新布局,不会影响到外界元素

二:重绘(Repaints)

DOM 的修改导致了样式的变化,没有影响到几何属性,浏览器不需要重新计算几何属性,简单来说,重绘是对元素绘制属性的修改引发的

注意以下会导致重排

1:color、background 相关属性

2:outline 相关属性

3:border-radius、visibility、box-shadow

三:优化重排方案 ,尽量减少重排,最简单的方式是:1.减少重排次数;2.缩小重排范围

1:尽量减少DOM节点操作

2:不要使用table布局

3:使用css表达式,

4:不要频繁操作样式,避免设置多层内联样式,更改类名而不是修改样式

5:使用 absolute 或者 fixed,使元素脱离文档流

6:离线操作元素,将元素先设置display: none,操作结束后再把它显示出来

7:分离读写操作,DOM的多个读操作放一起,浏览器有渲染队列机制,可以让多次回流重绘变成一次

8:使用css3动画,可以调用 GPU 执行渲染