怎么减少重排和重绘

当页面布局和几何属性改变时就需要重排。下述情况会发生浏览器重排:

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

2、元素位置改变——display、float、position、overflow等等;

3、元素尺寸改变——边距、填充、边框、宽度和高度

4、内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变;

5、页面渲染初始化;

6、浏览器窗口尺寸改变——resize事件发生时;

**

减少重排重绘

**
Reflow 的成本比 Repaint 的成本高得多的多。一个节点的 Reflow 很有可能导致子节点,甚至父节点以及兄弟节点的 Reflow 。在一些高性能的电脑上也许还没什么,但是如果 Reflow 发生在手机上,那么这个过程是延慢加载和耗电的。----浏览器的渲染原理简介

  1. 直接改变className,如果动态改变样式,则使用cssText(考虑没有优化的浏览器);

  2. 让要操作的元素进行”离线处理”,处理完后一起更新;

(a) 使用DocumentFragment进行缓存操作,引发一次回流和重绘;
(b) 使用display:none技术,只引发两次回流和重绘;
© 使用cloneNode(true or false) 和 replaceChild 技术,引发一次回流和重绘;

3.不要经常访问会引起浏览器flush队列的属性,如果你确实要访问,利用缓存;

  1. 让元素脱离文档流,减少回流的Render Tree的规模;
  2. 使用transfrom代替 上面的 1 2 3 4 5 6 减少性能消耗
### 浏览器重排的概念 浏览器的重排(reflow)(repaint)是网页性能优化中的核心概念。重排是指当 DOM 树中元素的几何属性发生变化时,浏览器需要新计算布局的过程[^1]。而则是指当一个元素的外观发生改变但不影响布局时,浏览器仅制该元素的外观过程[^2]。 ### 重排的原因 重排通常由以下操作触发:DOM 结构的修改、样式表的变化、脚本对 DOM 元素的读写操作、窗口尺寸的变化等[^3]。例如,当添加或删除可见的 DOM 元素、更改元素的位置或大小时,都会引发重排则通常由不影响布局的样式变化引起,如颜色的变化、背景图像的切换等[^2]。 ### 减少重排的方法及原理 为了减少重排对性能的影响,可以采取以下方法: #### 1. 批量操作 DOM 将多次的 DOM 操作合并为一次操作,以减少触发重排的次数。例如,通过创建文档片段(DocumentFragment)来批量插入多个节点,而不是逐一插入每个节点[^3]。 ```javascript const fragment = document.createDocumentFragment(); for (let i = 0; i < 100; i++) { const div = document.createElement('div'); div.textContent = `Item ${i}`; fragment.appendChild(div); } document.body.appendChild(fragment); ``` #### 2. 避免频繁访问影响布局的属性 避免频繁访问如 `offsetWidth`、`offsetHeight` 等影响布局的属性,因为这些操作会强制浏览器进行同步重排。可以通过缓存这些值来减少不必要的重排[^3]。 ```javascript // 不推荐的做法 for (let i = 0; i < elements.length; i++) { console.log(elements[i].offsetWidth); // 每次访问都会触发重排 } // 推荐的做法 const widths = elements.map(el => el.offsetWidth); // 缓存宽度 for (let i = 0; i < elements.length; i++) { console.log(widths[i]); // 使用缓存值 } ``` #### 3. 使用 CSS 动画替代 JavaScript 动画 CSS 动画硬件加速层可以在独立的线程上运行,从而减少主线程的压力并避免频繁的重排。 ```css /* 使用 CSS 动画 */ .element { transition: transform 0.5s ease; } .element:hover { transform: scale(1.2); } ``` #### 4. 将复杂动画移出主文档流 通过使用 `position: fixed` 或 `transform` 属性,将动画元素移出文档流,从而避免影响其他元素的布局[^3]。 ```css /* 移出文档流 */ .element { position: absolute; transform: translateX(100px); } ``` #### 5. 减少表格布局的使用 表格布局在结构上容易导致大面积的重排,因此尽量使用更灵活的布局方式,如 Flexbox 或 Grid 布局[^2]。 ```css /* 使用 Flexbox 替代表格布局 */ .container { display: flex; flex-direction: row; } ``` ### 总结 通过批量操作 DOM、避免频繁访问影响布局的属性、使用 CSS 动画、将复杂动画移出主文档流以及减少表格布局的使用,可以显著减少重排的发生频率,从而提升网页性能[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值