国产高清在线免费观看-国产高清在线免费无码-国产高清在线男人的天堂-国产高清在线视频-国产高清在线视频精品视频-国产高清在线视频伊甸园

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

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

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

1. 什么是虛擬列表

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

 

2. 使用場景

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

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

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

但總要學學)

 

3. 虛擬列表原理

一句話:

 

要看了,再渲染

 

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

  • 計算可視區(qū)域:確定用戶當前可以看到的視口范圍
  • 計算可見項:根據(jù)視口位置、每項高度,計算出當前應該顯示哪些數(shù)據(jù)項
  • 渲染可見項:只渲染計算出的可見項到DOM中
  • 位置偏移:通過CSS定位,確保可見項在正確的位置顯示
  • 監(jiān)聽滾動:當用戶滾動時,重新計算可見項并更新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() {
                // 設置占位容器的高度
                this.phantom.style.height = this.data.length * this.itemHeight + 'px';
                
                // 監(jiān)聽滾動事件
                this.container.addEventListener('scroll', this.handleScroll.bind(this));
                
                // 初始渲染
                this.updateVisibleItems();
            }
            
            handleScroll() {
                // 獲取當前滾動位置
                this.scrollTop = this.container.scrollTop;
                
                // 更新可見項
                this.updateVisibleItems();
            }
            
            updateVisibleItems() {
                // 計算開始和結束索引
                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;
                
                // 設置內容容器的偏移
                this.content.style.transform = `translateY(${offsetY}px)`;
                
                // 渲染可見項
                this.renderItems();
            }
            
            renderItems() {
                // 清空內容容器
                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}, 內容: ${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.最后總結

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

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

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

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

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

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

6.定位內容

轉自https://www.cnblogs.com/FatTiger4399/p/18780549


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

主站蜘蛛池模板: 人妻春色欧美另类综合 | 亚洲精品无码不卡在 | 青春草视频在线 | 亚洲日韩欧美制服第一页 | 亚洲综合无码日韩国产加勒比 | 瑟瑟视频在线观看 | 精品人妻无码专区中文字幕 | 亚洲国产欧美另类18不卡一区免费free | 亚洲熟妇自拍无码区 | 亚洲国产成人精品一级毛片多色婷婷久久久 | av香港经典三级级 在线 | 日日草夜夜草 | 亚洲午夜无码片在线观看影院猛 | 97久久精品午夜一区二区 | 91青青国产在线观看免费 | 亚洲欧美日韩精品 | 亚洲av成人一区国产精品 | 久久久久人妻一区精品 | 嫖妓丰满肥熟妇在线精品 | 伊人影院永久入口 | 国产成人无码av在线观看乳水 | 亚洲av成人无码久久精品老人 | 国内精品乱码卡一卡2卡三卡网站中国在线播放三区无码 | 熟女电影国产狠狠免费视频人妻 | 国产无遮挡又黄又爽在线观看 | 成人av无码大片在线观看 | 精品人妻无码一区二区色欲产成 | 亚洲av片在线观 | 人妻αⅴ中文字幕 | 一本到三区高清视频 | 国产普通话对白刺激 | 日韩精品第1页 | 国产日韩久久久久精品 | 手机看片久久久久久久 | 欧美日韩免费播放一区二区 | 久久综合精品 | 字幕无码专区 | 麻豆画精品传媒2025一二三 | 伊人色综合视频一区二区三区 | 午夜性色福利视频免费网站 | 精品人妻无码专区视频网站 |