简单理解重绘、回流(重排)

一、是什么?


重绘和回流经常被提起,但是我之前只知道它和性能优化有关,具体的不是很清楚,这段时间看了一些博客和资料,整理一下。(回流和重排是一个含义)
重绘和回流涉及到浏览器底层的渲染,所以我们先来了解一下浏览器的渲染过程。

  1. 解析html,生成dom树;解析css,生成css dom树
  2. dom树和css dom树结合生成渲染树
  3. 对渲染树进行布局
  4. 绘制渲染树

浏览器渲染过程
当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建就叫回流(reflow)。
当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的就叫重绘(repaint)。
简单来说,当我们删除增加节点,或者修改元素的宽高的时候,页面布局会发生变化,DOM树结构会发生变化,那么会重新构建DOM树,DOM树构建完后,又会重新构造渲染树,再去渲染界面,这个过程就叫做回流。
当我们改变元素的属性,只会影响外观不会影响到布局的时候,dom不需要重新构造,只会改变渲染树,然后重新渲染界面,这就叫重绘。
所以,回流一定会引起重绘,重绘不一定会引起回流。
因此,回流的开销要比重绘大,我们要尽量避免引起回流。
tips: display:none的节点是不会渲染的(脱离了文档流),但是visibility和opacity隐藏的几点还是会渲染的。script、meta、link这些节点也不会渲染。

二、哪些行为会产生回流?

  1. 添加或删除可见的DOM元素
  2. 元素的位置发生变化
  3. 元素的尺寸发生变化(包括外边距、内边框、边框大小、高度和宽度等)
  4. 内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代。
  5. 页面一开始渲染的时候(所有组件都要进行首次布局,这是开销最大的一次回流)
  6. 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)resize事件发生时

三、哪些行为会产生重绘?


元素的属性改变,只会影响外观不会影响布局的时候会产生重绘

四、怎么减少回流?

  1. 对于几何属性的变化,元素高度变化,字体大小变化这些,如果要修改多个属性,最好放到一个class中,直接修改class名称。
  2. 将position属性设置为absolute或fixed,设置为脱离文档流,它的改变不会影响到其他元素布局。
  3. 离线处理:当对 dom 节点有较大改动的时候,先将元素脱离文档流,然后对元素进行操作,最后再把操作后的元素放回文档流。只会在隐藏和展现的时候引发两次回流和重绘
    1)改变 display 属性,改为none,临时将某个元素从文档流中脱离,然后再block恢复它
var ul = document.getElementById('list');
ul.style.display = 'none';
// 对 ul 进行操作
ul.style.display = 'block'

2)createDocumentFragment,创建文档片段,操作后一次性把文档片段添加到文档流中(适用于需要添加很多节点的时候)

var fragment = document.createDocumentFragment()
// 在 fragment 上进行一系列操作
document.getElementById('list').appendChild(fragment)

3)通过在需要操作的节点上创建副本(cloneNode),然后在副本上进行操作,最后进行替换(replaceChild)

var ul = document.getElementById('list');
var clone = ul.cloneNode(true);
// 对 clone 节点进行操作
ul.parentNode.replaceChild(clone, ul);

参考于:
https://segmentfault.com/a/1190000017329980
https://www.cnblogs.com/echolun/p/10105223.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值