日本xxxx18视频在线观看-日本xxxx1819-日本xxxwww在线观看-日本xxx-日本xx-日本www在线视频

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

原生JS實現(xiàn)虛擬列表(不使用Vue,React等前端框架)

freeflydom
2025年3月20日 9:22 本文熱度 554

1. 什么是虛擬列表

虛擬列表(Virtual List)是一種優(yōu)化長列表渲染性能的技術(shù)。當(dāng)我們需要展示成千上萬條數(shù)據(jù)時,如果一次性將所有數(shù)據(jù)渲染到DOM中,會導(dǎo)致頁面卡頓甚至崩潰。虛擬列表的核心思想是:只渲染可視區(qū)域內(nèi)的數(shù)據(jù),而不是渲染所有數(shù)據(jù)

 

2. 使用場景

虛擬列表適用于以下場景:

  • 大數(shù)據(jù)量展示:如聊天記錄、新聞列表、商品列表等需要展示大量數(shù)據(jù)的場景
  • 無限滾動:需要支持用戶持續(xù)滾動加載更多內(nèi)容的場景
  • 性能敏感:在低性能設(shè)備上運行的應(yīng)用,需要盡可能減少DOM操作
  • 實時數(shù)據(jù)更新:頻繁更新的數(shù)據(jù)列表,如股票行情、實時監(jiān)控數(shù)據(jù)等

(我覺得實際場景中,分頁會用到更多,用戶要看的數(shù)據(jù),永遠(yuǎn)只是一小部分,就那么幾條,找不到就用搜索

但總要學(xué)學(xué))

 

3. 虛擬列表原理

一句話:

 

要看了,再渲染

 

對,就這么簡單,下面,進行分步

  • 計算可視區(qū)域:確定用戶當(dāng)前可以看到的視口范圍
  • 計算可見項:根據(jù)視口位置、每項高度,計算出當(dāng)前應(yīng)該顯示哪些數(shù)據(jù)項
  • 渲染可見項:只渲染計算出的可見項到DOM中
  • 位置偏移:通過CSS定位,確保可見項在正確的位置顯示
  • 監(jiān)聽滾動:當(dāng)用戶滾動時,重新計算可見項并更新DOM

這里幾個難點:
我怎么知道哪些數(shù)據(jù)進入了可視區(qū)域?
答:監(jiān)聽滾動距離,滾到哪,就從哪里開始

 

 

4. 實現(xiàn)虛擬列表

Demo.html代碼如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原生JavaScript虛擬列表實現(xiàn)</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        .list-container {
            position: relative;
            height: 400px;
            overflow: auto;
            border: 1px solid #ccc;
            margin: 20px auto;
            width: 80%;
        }
        
        .list-phantom {
            position: absolute;
            left: 0;
            top: 0;
            right: 0;
            z-index: -1;
        }
        
        .list-content {
            position: absolute;
            left: 0;
            right: 0;
            top: 0;
            overflow: hidden;
        }
        
        .list-item {
            padding: 10px;
            border-bottom: 1px solid #eee;
            color: #666;
        }
        
        .list-item:hover {
            background-color: #f5f5f5;
        }
    </style>
</head>
<body>
    <h1 style="text-align: center; margin: 20px 0;">原生JavaScript虛擬列表</h1>
    <div id="virtualList" class="list-container">
        <div class="list-phantom"></div>
        <div class="list-content"></div>
    </div>
    <script>
        class VirtualList {
            constructor(options) {
                this.container = options.container;
                this.data = options.data || [];
                this.itemHeight = options.itemHeight || 50;
                this.bufferSize = options.bufferSize || 5;
                
                this.phantom = this.container.querySelector('.list-phantom');
                this.content = this.container.querySelector('.list-content');
                
                this.startIndex = 0;
                this.endIndex = 0;
                this.scrollTop = 0;
                
                this.init();
            }
            
            init() {
                // 設(shè)置占位容器的高度
                this.phantom.style.height = this.data.length * this.itemHeight + 'px';
                
                // 監(jiān)聽滾動事件
                this.container.addEventListener('scroll', this.handleScroll.bind(this));
                
                // 初始渲染
                this.updateVisibleItems();
            }
            
            handleScroll() {
                // 獲取當(dāng)前滾動位置
                this.scrollTop = this.container.scrollTop;
                
                // 更新可見項
                this.updateVisibleItems();
            }
            
            updateVisibleItems() {
                // 計算開始和結(jié)束索引
                this.startIndex = Math.floor(this.scrollTop / this.itemHeight);
                this.endIndex = this.startIndex + Math.ceil(this.container.clientHeight / this.itemHeight);
                
                // 添加緩沖區(qū)
                this.startIndex = Math.max(0, this.startIndex - this.bufferSize);
                this.endIndex = Math.min(this.data.length, this.endIndex + this.bufferSize);
                
                // 計算偏移量
                const offsetY = this.startIndex * this.itemHeight;
                
                // 設(shè)置內(nèi)容容器的偏移
                this.content.style.transform = `translateY(${offsetY}px)`;
                
                // 渲染可見項
                this.renderItems();
            }
            
            renderItems() {
                // 清空內(nèi)容容器
                this.content.innerHTML = '';
                
                // 渲染可見項
                for (let i = this.startIndex; i < this.endIndex; i++) {
                    const item = document.createElement('div');
                    item.className = 'list-item';
                    item.innerHTML = this.renderItemContent(this.data[i], i);
                    item.style.height = this.itemHeight + 'px';
                    this.content.appendChild(item);
                }
            }
            
            renderItemContent(item, index) {
                return `<div>索引: ${index}, 內(nèi)容: ${item}</div>`;
            }
        }
        
        // 生成測試數(shù)據(jù)
        const data = Array.from({ length: 10000 }, (_, i) => `列表項 ${i + 1}`);
        
        // 初始化虛擬列表
        const virtualList = new VirtualList({
            container: document.getElementById('virtualList'),
            data: data,
            itemHeight: 50,
            bufferSize: 10
        });
    </script>
</body>
</html>

 

5.最后總結(jié)

為什么滾動到指定位置后會將對應(yīng)區(qū)域數(shù)據(jù)渲染?

1.監(jiān)聽滾動事件

2.滾動觸發(fā)數(shù)據(jù)更新方法

3.根據(jù)滾動距離計算當(dāng)前數(shù)據(jù)索引

4.根據(jù)可視區(qū)域計算要渲染數(shù)據(jù)項

5.渲染數(shù)據(jù)

6.定位內(nèi)容

轉(zhuǎn)自https://www.cnblogs.com/FatTiger4399/p/18780549


該文章在 2025/3/20 9:22:34 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 九九99亚洲精品 | 成人怡红院视频在线观看 | 日韩中文字幕在线第一页 | 日韩第一页 | 国产真实伦在线播放 | 欧美精品一区二区三区在线观看 | 欧美亚洲国产日韩完全在线电影 | 日韩中文精品 | 日本欧美不卡一区二区三区在线 | 2025国产精品每日更新 | 日韩一区二紧身裤 | 日韩欧美国产第一页 | 2025国产激情视频在线观看 | 国产精品青青在线观看看 | 91国产精品午夜福利免费 | 日本黄页| 国产精品自产 | 国产精品网站不卡在 | 欧美一级日韩一级亚洲一级va | 欧美肉大捧一进一出免费视频 | 国精品产露脸偷拍视频 | 欧美午夜福利在 | 成人午夜免电影费观看 | 国产在线播放免费人成视频播放 | 韩国精品一区二区三区四区 | 男人在线天堂 | 国产一区日韩精品二区 | 日本视频在线免费 | 国产香蕉一人在线视频 | 国产精品高清一区二区三区不卡 | 成人a大片高清在线观看 | 岛国aaaa级午夜福利片 | 国产精品白丝喷水在线观看 | 国产福利91精品一区二区三 | 欧美系列国产系列一 | 国产剧情中文字幕一区二区 | 精品一区二区三区国产视频 | 欧美性xxxx狂欢老少配 | 国产福利一区二区三区四区 | 国产真实伦在线观看 | 日本护士视频欧美无砖专区 |