最新要闻
- 每日热门:河洛肉鸽卡牌《天外武林》上架Steam 明年1月发售
- 别急换机!本月还有6场发布会:劝你先等等再买
- 世界微动态丨《阿凡达:水之道》预测票房仅25.11亿!远不到《长津湖》一半
- 【环球新要闻】Epic大促开启 连续15天免费送游戏!75折套娃优惠券来了
- 【天天播资讯】RTX 4070 Ti跑分首曝:猛升46%、超越RX 7900 XTX
- 速度飞起!全球首款232层闪存SSD细节公布:TLC颗粒、拒绝PCIe 5.0
- 快资讯:一图看懂moto新机:二代骁龙8 3699元!价格屠夫简直了
- 天天热议:微软2025年目标:确保非洲再增加1亿人访问互联网
- 焦点信息:火球坠入浙江 警方带走疑似陨石碎片:现场砸出六七厘米深坑
- 环球观热点:不调好不上市 moto X40驯服二代骁龙8:1小时王者温度仅42度
- Nature年度十大人物出炉:猪心移植手术团队负责人等入选
- 饱满如水滴!联想moto X40开箱图赏
- 5000mAh大电池+120Hz屏 899元联想moto G53图赏
- 109度大电池能跑730KM!岚图追光预售:32.29万元起
- 视焦点讯!努比亚Z50散热堆料离谱:散热总面积达到36462m㎡
- 中国光纤之父赵梓森逝世 享年91岁:拉出了我国第一根光纤
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天微动态丨JavaScript DOM的性能优化详解
本身JS操作DOM就比较消耗性能,你可以理解为JS和dom是独立的小岛,用桥实现两者的联系,但桥很窄,要过路费,所以我们要尽最大可能减少过桥的次数。
再加上每次操作DOM都会触发布局的改变、DOM树的修改和渲染。也就是说操作DOM会引发重排(回流)与重绘,这个过程也是非常消耗资源的。所以要尽量避免重复操作DOM元素。
(相关资料图)
DOM性能优化的本质:
就是减少对DOM查询及减少DOM操作(增、删、改)引起的重排(回流)和重绘的次数
DOM性能优化方法:
- 合并多次对css样式的修改,改为一次处理
- 对DOM查询做缓存
- 将频繁DOM操作改为一次性操作
- 操作DOM前,先把DOM节点删除或隐藏
- 采用事件代理处理事件
在讲解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)中的一部分或全部因为元素的规模尺寸、大小等改变时,浏览器需要重新计算元素在设备视口(viewport)内的确切位置和大小,需要重新布局render树,这个过程为回流(重排)。
重绘
当页面元素样式改变(如 color、background-color、visibility),但不影响元素在文档流中的的位置时,浏览器只需将新样式赋予元素并进行重新绘制render树操作,这个过程为重绘。
回流必将引起重绘,但重绘不一定会引起回流
什么情况会发生重排(回流)
- 添加或删除可见的 DOM 元素
- 元素的位置发生变化
- 元素的尺寸发生变化(外边距、内边距、边框大小、高度和宽度等)
- 内容发生变化,(比如文本变化或图片被尺寸大小发生变化)
- 页面渲染初始化(必然要首次重排)
- 浏览器的窗口 resize 尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)
- 获取元素位置和大小相关的属性和方法,因为都需要返回最新的布局信息,因此浏览器不得不触发回流重绘来返回正确的值
- offset(Top / Left / Width / Height)
- scroll(Top / Left / Width / Height)
- client(Top / Left / Width / Height)
- width、height
- 调用了 getComputeStyle() 或者 IE 的 currentStyle
三、DOM性能优化的4种方法
① 合并多次对css样式的修改,改为一次处理
优化前样式代码
oLi.style.width="100px";oLi.style.height="20px";oLi.style.background="pink";
方法一:用cssText一次性处理
oLi.style.cssText = "width:100px;height:20px;background:pink";
方法二:用className一次性处理
.item{width:100px;height:20px; padding: 0px; border: 0px; color: rgb(197, 134, 192); --tt-darkmode-color: #C586C0;">pink;}/*定义类样式*/oLi.className="item"//js添加类样式
三种情况下,消耗时间对比
方法一:优化前方法二:cssText处理后方法三:className处理后370.9970703125 ms243.667236328125 ms147.678955078125 ms
<script>console.time("优化前");//测试执行时间代码varoUl=document.getElementById("list");for(vari=0;i<50000;i++) {varoLi=document.createElement("li");//方法一oLi.style.width="100px";oLi.style.height="20px";oLi.style.background="pink";//方法二:// oLi.style.cssText = "width:100px;height:20px;background:pink";//方法三:/* oLi.className = "item";oUl.appendChild(oLi);*/}console.timeEnd("优化前");//测试执行时间代码</script>
② 对DOM查询做缓存
不要频繁的去查询DOM,把查询到的内容保存在变量中,后面直接通过变量来操作就好。
未优化前,要频繁的查询DOM
for(vari=0;i
优化后,只需要查询一次DOM
varn=document.querySelectorAll("li").length;for(vari=0;i
优化后与优化前耗时对比未优化前耗时优化后耗时206.722900390625 ms154.436767578125 ms<script>window.onload=function() {//优化前代码console.time("时间记录");//测试执行时间代码for(vari=0;i