回流 和 重绘

回流

就是页面布局发生变化。

 

重绘

就是节点需要更改外观而不会影响布局。

 

和 Event Loop 的关系

1. 回流 和 重绘 发生在 Event Loop 执行完微任务后,因为浏览器是 60Hz 的刷新率,每 16.6ms 才会更新一次。

2. 然后判断是否有 resize 或者 scroll 事件,有的话会去触发事件,所以 resize 和 scroll 事件也是至少 16ms 才会触发一次,并且自带节流功能

3. 更新css动画并触发对应事件

4. 判断是否触发了 media query

5. 判断是否有全屏操作事件

6. 执行 requestAnimationFrame 回调

7. 执行 IntersectionObserver 回调,该方法用于判断元素是否可见,可以用于懒加载上

8. 更新界面

9. 如果在一帧中有空闲时间,就会去执行 requestIdleCallback 回调。

 

IntersectionObserver

例如这样写,每次滚动到可以看到这个 img 元素时候,就会触发一次回调

let ob = new IntersectionObserver(e => {
    console.log(e)
})
ob.observe(document.querySelectorAll('img')[0])

observe 可以多次,回调的 e 是一个数组,根据 observe 的顺序返回对应的信息

 

RequestIdleCallback

例如这样写,调用 a() 后,浏览器会在空闲的时候 log 1

function a() {
    console.log(1)
    requestIdleCallback(a)
}

 

优化渲染速度

1. 用 transform 代替 top

2. 用 visibility: hidden 代替 display:none

3. 不要在循环里操作dom

4. 不要使用 table 布局, 可能很小的一个小改动会造成整个 table 的重新布局

5. JS动画实现的速度的选择,动画速度越快,回流次数越多,也可以选择使用 requestAnimationFrame

6. CSS 选择符从右往左匹配查找,避免节点层级过多

7. 将频繁重绘或者回流的节点设置为图层 ( will-change属性 和 video、iframe 标签)

 

如何判断渲染性能

查看 DOMContentLoaded 时间触发的时机。这个事件触发越早,说明渲染速度越快。

 

转载于:https://www.cnblogs.com/amiezhang/p/11450822.html

### 浏览器渲染中的回流 #### 回流(Reflow) 回流是指当 DOM 的结构或元素的几何属性(如大小、位置等)发生变化时,浏览器需要新计算这些元素的位置尺寸,并更新整个页面布局的过程。这一过程通常涉及多个节点的新计算以及可能引发后续子树的调整[^1]。 例如,如果动态改变了某个元素的高度或者宽度,或者是隐藏了一个可见的元素,则会触发回流操作。每次回流都会带来一定的性能开销,尤其是复杂的布局场景下更为显著[^5]。 #### (Repaint) 相比之下,指的是由于某些视觉样式的更改而不需要改变文档流的情况下发生的制行为。比如颜色的变化、背景图片替换等情况只会导致像素级别的刷新而不影响整体布局结构[^3]。 需要注意的是,尽管单独来看似乎比回流轻量级一些,但如果频繁发生也可能累积成较大的性能瓶颈[^2]。 #### 主要区别 | 特性 | 回流 | | |--------------|-------------------------------|-------------------------| | **定义** | 布局变化引起的新计算 | 只有外观上的变动 | | **触发条件** | 修改了影响布局的因素 | 改变了不影响布局的样式 | | **范围** | 影响较大 | 较小 | | **频率控制** | 应尽量减少 | 同理需加以管理 | 为了提升网页加载速度并改善用户体验,在开发过程中应当采取措施来降低不必要的回流事件的发生几率。可以通过批量处理DOM变更动作、使用虚拟dom技术等方式实现优化目的;另外还可以考虑采用GPU加速特性明显的 CSS 属性如 `transform` `opacity`, 这些不会引起常规意义上的reflow/repaint流程而是交由更高效的图形处理器完成相应工作[^4]。 ```javascript // 减少回流的一个例子:先移除元素再做多次修改最后放回去 let parentElement = document.getElementById('parent'); let childToModify = document.createElement('div'); childToModify.style.width = '200px'; childToModify.style.height = '200px'; childToModify.style.backgroundColor = '#ff0000'; parentElement.appendChild(childToModify); ``` 上述代码展示了如何通过创建新节点而非直接操作现有DOM节点的方式来避免连续性的回流问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值