JavaScript DOM的性能优化详解

本文深入探讨了JavaScript操作DOM时的性能问题,解释了重排(回流)和重绘的概念,并提供了4种优化DOM操作的方法:合并样式修改、缓存DOM查询、一次性操作和使用事件代理。通过实例展示了优化前后性能的差异,旨在减少DOM操作对页面渲染的影响,提升前端应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本身JS操作DOM就比较消耗性能,你可以理解为JS和dom是独立的小岛,用桥实现两者的联系,但桥很窄,要过路费,所以我们要尽最大可能减少过桥的次数。

再加上每次操作DOM都会触发布局的改变、DOM树的修改和渲染。也就是说操作DOM会引发重排(回流)与重绘,这个过程也是非常消耗资源的。所以要尽量避免重复操作DOM元素。

DOM性能优化的本质:

就是减少对DOM查询及减少DOM操作(增、删、改)引起的重排(回流)和重绘的次数

DOM性能优化方法:

  1. 合并多次对css样式的修改,改为一次处理
  2. 对DOM查询做缓存
  3. 将频繁DOM操作改为一次性操作
  4. 操作DOM前,先把DOM节点删除或隐藏
  5. 采用事件代理处理事件

在讲解5种优化方法之前,我们需要先了解什么是重排(回流)和重绘,要了解重排(回流)和重绘,就需要先了浏览器的渲染机制,所以我们先从浏览器的渲染机制开始讲起。

一、浏览器的渲染机制

浏览器的整个渲染过程(下图)

  • 解析 HTML,构建 DOM 树
  • 解析 CSS,生成 CSS 规则树
  • 合并 DOM 树和 CSS 规则树,生成 render(渲染)树。
  • 布局 render 树(回流 / 重排),负责各元素尺寸、位置的计算。
  • 绘制 render 树(painting 重绘),绘制页面像素信息
  • 浏览器会将各层的信息发送给 GPU,GPU 会将各层合成(composite),显示在屏幕上。

构建渲染树时,浏览器主要完成以下工作

  • 从 DOM 树的根节点开始遍历每个可见节点
  • 对每个可见节点,找到 CSS 规则树中对应的规则,并应用它们
  • 根据每个可见节点以及其对应的样式,组合生成渲染树

不可见节点(也就是不会出现在渲染树中的节点)

  • 一些不会渲染输出的节点(如:script、meta、link 等)
  • 一些通过 css 进行隐藏的节点(如:display: none)

注意点:

  • 样式为display:none;的节点会在DOM树中而不在渲染树中
  • visiblity 和 opacity 隐藏的节点在DOM和渲染树中同时存在。
  • 浏览器绘制之后便开始解析js文件,根据js对DOM的操作来确定是否会再次发生重排(回流)和重绘。

二、什么是重排(回流)和 重绘

重排(回流)

当渲染树(render tree)中的一部分或全部因为元素的规模尺寸、大小等改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾编程前端技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值