4、插⼊⼏万个 dom ,如何实现⻚⾯不卡顿?

当需要插入几万个 DOM 元素时,如果直接操作 DOM,会触发浏览器的重排和重绘,导致页面卡顿甚至失去响应。为了避免这种情况,可以采用以下几种策略:

1. 使用文档片段(DocumentFragment)

文档片段是一种轻量级的 DOM 对象,它存在于内存中,不会插入到实际的 DOM 树中。因此,在文档片段上进行 DOM 操作不会触发重排和重绘,操作完成后再将文档片段一次性插入到实际的 DOM 中,这样只会触发一次重排和重绘。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="container"></div>
    <script>
        const container = document.getElementById('container');
        const fragment = document.createDocumentFragment();

        // 模拟插入几万个 DOM 元素
        for (let i = 0; i < 50000; i++) {
            const div = document.createElement('div');
            div.textContent = `Item ${i}`;
            fragment.appendChild(div);
        }

        // 将文档片段一次性插入到实际的 DOM 中
        container.appendChild(fragment);
    </script>
</body>

</html>

2. 分批插入

将大量的 DOM 插入操作分成多个小批次,每次插入一小部分元素,然后使用 requestAnimationFrame 或 setTimeout 来控制插入的时间间隔,让浏览器有时间进行渲染,避免一次性插入过多元素导致卡顿。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="container"></div>
    <script>
        const container = document.getElementById('container');
        const totalItems = 50000;
        const batchSize = 100;
        let currentIndex = 0;

        function insertBatch() {
            const fragment = document.createDocumentFragment();
            for (let i = 0; i < batchSize && currentIndex < totalItems; i++) {
                const div = document.createElement('div');
                div.textContent = `Item ${currentIndex}`;
                fragment.appendChild(div);
                currentIndex++;
            }
            container.appendChild(fragment);

            if (currentIndex < totalItems) {
                requestAnimationFrame(insertBatch);
            }
        }

        insertBatch();
    </script>
</body>

</html>

3. 虚拟列表

如果插入的 DOM 元素是用于展示列表数据,且列表数据量非常大,可以使用虚拟列表技术。虚拟列表只渲染当前可见区域内的元素,当用户滚动列表时,动态更新可见区域内的元素,从而减少 DOM 元素的数量,提高页面性能。

以下是一个简单的虚拟列表示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Virtual List</title>
    <style>
        #list-container {
            height: 300px;
            overflow-y: auto;
            border: 1px solid #ccc;
        }

        .list-item {
            height: 30px;
            line-height: 30px;
            padding: 0 10px;
            border-bottom: 1px solid #eee;
        }
    </style>
</head>

<body>
    <div id="list-container"></div>
    <script>
        const container = document.getElementById('list-container');
        const itemHeight = 30;
        const totalItems = 50000;
        const visibleItems = Math.floor(container.offsetHeight / itemHeight);

        function renderList(startIndex) {
            container.innerHTML = '';
            for (let i = startIndex; i < startIndex + visibleItems; i++) {
                if (i < totalItems) {
                    const div = document.createElement('div');
                    div.classList.add('list-item');
                    div.textContent = `Item ${i}`;
                    container.appendChild(div);
                }
            }
        }

        container.addEventListener('scroll', function () {
            const scrollTop = this.scrollTop;
            const startIndex = Math.floor(scrollTop / itemHeight);
            renderList(startIndex);
        });

        renderList(0);
    </script>
</body>

</html>

通过以上方法,可以有效避免在插入大量 DOM 元素时导致页面卡顿的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982264.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪

2025年3月5日&#xff0c;机器人行业龙头宇树科技&#xff08;Unitree&#xff09;在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司&#xff0c;聚焦智能机器人研发与销售&#xff0c;标志着宇树科技在华南市场的战…

AI-Ollama本地大语言模型运行框架与Ollama javascript接入

1.Ollama Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;平台&#xff0c;旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型&#xff0c;支持文本生成、翻译、代码编写、问答等多种…

SQLAlchemy系列教程:基本数据类型及自定义类型

在SQLAlchemy、Python SQL工具包和ORM中定义模型时&#xff0c;理解基本数据类型至关重要。本教程提供了在SQLAlchemy模型中有效使用内置基本类型的指南。 SQLAlchemy中的基本类型 SQLAlchemy支持一组与SQL数据库类型一致的基本数据类型。SQLAlchemy中的每种类型都为各种SQL类…

K8s The connection to the server 192.168.56.120:6443 was refused报错解决

虚拟机获取不到其他node节点的信息&#xff0c;通过使用docker ps -a 排查看到k8s的组件都是exited的状态&#xff0c;通过手动拉起docker 镜像id 起来之后&#xff0c;又变为exited的状态&#xff01;&#xff01;&#xff01; 解决方法&#xff1a;重置k8s集群 使用 kubeadm…

随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)

随着自动驾驶技术的蓬勃发展&#xff0c;安全、高效的路径规划成为核心挑战之一。快速探索随机树&#xff08;RRT&#xff09;算法作为一种强大的路径搜索策略&#xff0c;为自动驾驶汽车在复杂环境下绕过静态障碍物规划合理路径提供了有效解决方案。 RRT 算法基于随机采样思想…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.3.1 避免频繁更新(Update by Query的代价)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 Elasticsearch数据更新与删除深度解析&#xff1a;2.3.1 避免频繁更新&#xff08;Update by Query的代价&#xff09;案例背景1. Update by Query的内部机制解析1.1 文档更…

Baklib内容中台赋能企业智管

内容中台构建全场景智管 现代企业数字化运营中&#xff0c;全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构&#xff0c;企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例&#xff0c;其利用中台系统将分散在CRM、ERP及内部文档…

今天来介绍和讨论 AGI(通用人工智能)

首先介绍&#xff0c;AGI&#xff08;通用人工智能&#xff09;是什么&#xff1f; AGI&#xff08;Artificial General Intelligence&#xff0c;通用人工智能&#xff09;指的是能够像人类一样理解、学习、推理和解决广泛任务的人工智能系统。与目前的AI不同&#xff0c;AGI可…

计算机毕业设计SpringBoot+Vue.js乐享田园系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

navicat导出postgresql的数据库结构、字段名、备注等等

1、执行sql语句 SELECT A.attnum AS "序号",C.relname AS "表名",CAST ( obj_description ( relfilenode, pg_class ) AS VARCHAR ) AS "表名描述",A.attname AS "字段名称",A.attnotnull as "是否不为null",(case when A…

FPGA开发,使用Deepseek V3还是R1(9):FPGA的全流程(详细版)

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

DeepSeek、Grok 和 ChatGPT 对比分析:从技术与应用场景的角度深入探讨

文章目录 一、DeepSeek&#xff1a;知识图谱与高效信息检索1. 核心技术2. 主要特点3. 应用场景4. 实际案例 二、Grok&#xff1a;通用人工智能框架1. 核心技术2. 主要特点3. 应用场景4. 实际案例 三、ChatGPT&#xff1a;聊天机器人与通用对话系统1. 核心技术2. 主要特点3. 应用…

三、0-1搭建springboot+vue3前后端分离-idea新建springboot项目

一、ideal新建项目1 ideal新建项目2 至此父项目就创建好了&#xff0c;下面创建多模块&#xff1a; 填好之后点击create 不删了&#xff0c;直接改包名&#xff0c;看自己喜欢 修改包名和启动类名&#xff1a; 打开ServiceApplication启动类&#xff0c;修改如下&#xff1a; …

快速生成viso流程图图片形式

我们在写详细设计文档的过程中总会不可避免的涉及到时序图或者流程图的绘制&#xff0c;viso这个软件大部分技术人员都会使用&#xff0c;但是想要画的好看&#xff0c;画的科学还是比较难的&#xff0c;现在我总结一套比较好的方法可以生成好看科学的viso图(图片格式)。主要思…

【前端基础】Day 9 PC端品优购项目

目录 1. 品优购项目规划 1.1 网站制作流程 1.2 品优购项目整体介绍 1.3 学习目的 1.4 开发工具以及技术栈 1.5 项目搭建工作 1.6 网站favicon图标 1.7 网站TDK三大标签SEO优化 2. 品优购首页制作 2.1 常见模块类命名 2.2 快捷导航shortcut制作 2.3 header制作 2.4…

仿mudou库one thread oneloop式并发服务器

项目gitee&#xff1a;仿muduo: 仿muduo 一&#xff1a;项目目的 1.1项目简介 通过咱们实现的⾼并发服务器组件&#xff0c;可以简洁快速的完成⼀个⾼性能的服务器搭建。 并且&#xff0c;通过组件内提供的不同应⽤层协议⽀持&#xff0c;也可以快速完成⼀个⾼性能应⽤服务器…

一文学会Spring

一、Spring简介 Spring的优点 Spring是一个开源免费的框架、容器Spring是一个轻量级的框架&#xff0c;非侵入式的控制反转IOC、面向切面AOP支持事务 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器 二、IOC 2.1 IOC本质 控制反转IOC&#xff0c;是一种设计思想…

解决Spring Boot中LocalDateTime返回前端数据为数组结构的问题

在Spring Boot开发中&#xff0c;处理日期时间数据是一个常见的需求。Java 8 引入了新的日期时间API&#xff0c;如LocalDateTime&#xff0c;它提供了更强大的日期时间处理功能。然而&#xff0c;在将LocalDateTime对象序列化为JSON时&#xff0c;可能会遇到返回为数组结构的问…

【一个月备战蓝桥算法】递归与递推

字典序 在刷题和计算机科学领域&#xff0c;字典序&#xff08;Lexicographical order&#xff09;也称为词典序、字典顺序、字母序&#xff0c;是一种对序列元素进行排序的方式&#xff0c;它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序&#xff1a; …

CSDN 1024天 创作纪念日

机缘 还记得那是2022年5月&#xff0c;在上家公司工作时候&#xff0c;意外发现同事在通过CSDN记录一些日常遇到、解决的问题&#xff0c;也会更新一些他擅长领域的知识点&#xff0c;并且收获了不少的粉丝和阅读量&#xff0c;这不由得激起了我的兴趣。也在有空时候&#xff…