回流与重绘 以及 如何避免发生从而达到前端性能优化的目的

回流与重绘是浏览器渲染页面时的重要过程,涉及元素尺寸、样式变化导致的重新布局和绘制。回流影响文档流,重绘仅更新样式。频繁的回流和重绘会影响页面性能。避免策略包括:集中操作DOM、避免table布局、使用CSS表达式、减少样式修改、使用display:none等。浏览器通过渲染队列来批量处理回流和重绘,以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文内容:

  1. 回流
  2. 重绘
  3. 如何避免回流和重绘

1. 回流

当渲染树中部分或者全部元素的尺寸、结构或者属性发生变化时,浏览器会重新渲染部分或者全部文档的过程就称为回流

下面这些操作会导致回流:
● 页面的首次渲染
● 浏览器的窗口大小发生变化
● 元素的内容发生变化
● 元素的尺寸或者位置发生变化
● 元素的字体大小发生变化
● 激活CSS伪类
● 查询某些属性或者调用某些方法
● 添加或者删除可见的DOM元素
在触发回流(重排)的时候,由于浏览器渲染页面是基于流式布局的,所以当触发回流时,会导致周围的DOM元素重新排列,它的影响范围有两种:
● 全局范围:从根节点开始,对整个渲染树进行重新布局
● 局部范围:对渲染树的某部分或者一个渲染对象进行重新布局

2. 重绘

当页面中某些元素的样式发生变化,但是不会影响其在文档流中的位置时,浏览器就会对元素进行重新绘制,这个过程就是重绘。
下面这些操作会导致回流
● color、background 相关属性:background-color、background-image 等
● outline 相关属性:outline-color、outline-width 、text-decoration
● border-radius、visibility、box-shadow
注意: 当触发回流时,一定会触发重绘,但是重绘不一定会引发回流。

3. 如何避免回流和重绘

如果对页面经常进行回流和重绘,那么网页的性能肯定是要收到影响的。

减少回流与重绘的措施
● 操作DOM时,尽量在低层级的DOM节点进行操作
不要使用table布局, 一个小的改动可能会使整个table进行重新布局
● 使用CSS的表达式
● 不要频繁操作元素的样式,对于静态页面,可以修改类名,而不是样式。
使用absolute或者fixed,使元素脱离文档流,这样他们发生变化就不会影响其他元素
避免频繁操作DOM,可以创建一个文档片段documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中
● 将**元素先设置display: none,操作结束后再把它显示出来。**因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。
● 将DOM的多个读操作(或者写操作)放在一起,而不是读写操作穿插着写。这得益于浏览器的渲染队列机制。

浏览器针对页面的回流与重绘,进行了自身的优化——渲染队列
浏览器会将所有的回流、重绘的操作放在一个队列中,当队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会对队列进行批处理。这样就会让多次的回流、重绘变成一次回流重绘。
上面,将多个读操作(或者写操作)放在一起,就会等所有的读操作进入队列之后执行,这样,原本应该是触发多次回流,变成了只触发一次回流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值