什么是重排(回流)和重绘?如何避免他们?

重排(reflow)和重绘(repaint)是浏览器渲染的一个过程,并且十分影响性能,让我们先来看看浏览器网页渲染的全过程

浏览器如何渲染网页


浏览器渲染网页主要分为以下五步

1.浏览器将获取的HTML文档解析成DOM树。

2.处理CSS标记,构成层叠样式表模型CSSOM(CSS Object Model)。

3.将DOM和CSSOM合并为渲染树(rendering tree),代表一系列将被渲染的对象。

4.渲染树的每个元素包含的内容都是计算过的,它被称之为布局layout。浏览器使用一种流式处理的方法,只需要一次绘制操作就可以布局所有的元素。

5.将渲染树的各个节点绘制到屏幕上,这一步被称为绘制painting

 我们都知道HTML默认是流式布局的,但CSS和JS会打破这种布局,改变DOM的外观样式以及大小和位置。因此就出现了重绘和重排

重排 | 回流(reflow)


触发条件

当浏览器发现布局发生了变化,这个时候就需要倒回去重新渲染,这个回退的过程叫reflow

简单来说就是渲染树中的节点大小、位置等信息发生了改变,需要重新计算,重新渲染。

会引起重排的条件:

1.页面第一次渲染(初始化)

2.DOM树节点增删移动

3.一个 DOM 元素的几何属性变化,常见的几何属性有widthheightpaddingmarginlefttopborder

4.浏览器窗口resize

5.获取元素的某些属性,比如offset族、scroll族和client族属性

 reflow几乎是无法避免的,因为只要用户进行交互操作,就势必会发生页面的一部分的重新渲染,且通常我们也无法预估浏览器到底会reflow哪一部分的代码,因为他们会相互影响。

重排过程

reflow会从html这个root frame开始递归往下,依次计算所有的结点几何尺寸和位置,以确认是渲染树的一部分发生变化还是整个渲染树。

相当于是将解析和合成的过程重新走了一遍,开销很大。

重绘(repaint)


触发条件

repaint是当我们改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸和位置没有发生改变。

1.reflow回流必定引起repaint重绘,重绘可以单独触发。
2.背景色、颜色、字体改变(注意:字体大小发生变化时,会触发回流)

重绘过程

由于没有导致 DOM 几何属性的变化,因此元素的位置信息不需要更新,从而省去布局的过程。流程如下:

避免重排、重绘


1.用transform做形变和位移可以减少reflow

2.避免逐个修改节点样式,尽量一次性修改

3.使用DocumentFragment将需要多次修改的DOM元素缓存,最后一次性append到真实DOM中渲染

4.可以将需要多次修改的DOM元素设置display:none,操作完再显示。(因为隐藏元素不在render树内,因此修改隐藏元素不会触发回流重绘)

5.避免多次读取某些属性

6.通过绝对位移将复杂的节点元素脱离文档流,形成新的Render Layer,降低回流成本

参考:讲清楚重排或回流、重绘 - 知乎

重排CSS渲染过程中的两个要概念。 (Repaint)指的是当元素的样式发生变化,但不影响其布局时,浏览器会将新样式应用到元素上,制元素的外观。的开销相对较小,不会引起布局的变化。 而重排(Reflow)指的是当页面布局发生变化时,例如修改了元素的尺寸、位置、内容等,浏览器会新计算并更新元素的几何属性(如大小、位置),然后新布局页面。重排的开销相对较大,因为它涉及到整个页面或部分页面的新渲染。 重排的区别在于是否引起布局的变化。只会制元素的外观,而不会影响其周围元素的布局;而重排会导致整个渲染树的新构建布局。 在性能优化方面,我们通常要尽量减少重排的次数,因为它们会消耗大量的计算资源。一些常见的优化方法包括: 1. 使用 CSS3 动画或过渡代替 JavaScript 实现的动画效果,因为后者可能会导致频繁的重排; 2. 使用类似 flexbox grid 等布局技术,可以减少页面布局的复杂性,降低重排的次数; 3. 避免频繁访问会引起重排的属性,例如 offsetTop、offsetLeft、scrollTop、clientWidth 等; 4. 批量更新样式或布局,可以使用 CSS 类名的方式一次性修改多个元素的样式,而不是逐个修改; 5. 将需要执行多次重排的 DOM 操作尽量合并为一次,使用文档片段(DocumentFragment)进行缓存。 通过合理优化减少重排的次数,可以提升页面的性能响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值