回流(reflow)和重绘(repaint)

回流(reflow)和重绘(repaint)

一、粗略了解浏览器渲染机制

  1. 浏览器采用的是流式布局: 流式布局:块级元素独占一行,行内元素在一行中从左到右依次排列。
  2. 浏览器会将html解析成DOM树,将css解析成CSSOM树。把DOM树和CSSOM树结合,生成render树。
  3. 有了render树,浏览器就可以根据render树来计算每个节点的几何信息(位置和大小),最后把元素渲染到页面上。

二、回流(reflow)

概述:回流也叫重排,回流就是当render树中的一部分因为元素的尺寸、位置或内容的变化而需要重新构建。
  • 页面首页渲染
  • 浏览器窗口大小变化
  • 内容变化导致大小尺寸变化
  • 添加或删除节点
  • 激活css伪类(例如:hover)
  • 改变元素位置,例如:margin、padding、border等

三、重绘(repaint)

概述:当render树中的一部分因为元素的样式变化而需要重新构建,但元素的位置和尺寸没有变化。
  • 改变元素外观属性,例如:color、background-color、visibility、outline等

四、性能影响

  • 渲染速度变慢:回流和重绘操作都需要消耗一定的计算资源。尤其是回流,由于涉及到页面布局的重新计算,其开销相对较大。因此,当页面频繁触发回流和重绘时,会导致页面的渲染速度变慢,从而影响用户的体验。
  • 页面闪烁和卡顿:当浏览器进行回流和重绘操作时,页面可能会出现闪烁或卡顿的现象。这是因为浏览器在重新渲染页面时,会先清空原有的内容,然后再重新绘制。这个过程可能导致用户看到页面的短暂变化或停顿,尤其是在性能较低的设备或复杂的页面上。
  • 资源消耗:频繁的回流和重绘操作不仅会导致CPU和内存的消耗增加,还可能引发其他资源的过度使用,如电池续航时间的减少等。

五、优化措施

  • 减少DOM操作:避免不必要的DOM读写操作,可以缓存常用DOM对象到变量中,以减少直接访问DOM的次数。
  • 利用CSS优化:尽量使用CSS动画代替JavaScript动画,因为CSS动画在浏览器层面进行优化,通常比JavaScript动画性能更好。同时,通过优化CSS选择器的性能,减少样式计算的开销。
  • 批量修改:如果需要对多个元素进行样式修改或DOM操作,尽量将其合并成一次操作,以减少回流和重绘的次数。
  • 使用请求动画帧(requestAnimationFrame):这个函数可以在浏览器的下一次重绘之前执行代码,从而确保动画的流畅性,并减少不必要的回流和重绘。
    通过以上优化措施,可以有效地减轻回流和重绘对网页性能的影响,提升用户体验。

总结:回流一定会引起重绘,重绘不一定引起回流。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重绘和重排是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、付费专栏及课程。

余额充值