虚拟长列表

<style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            list-style: none;
        }

        .list-container {
            height: 400px;
            overflow-y: auto;
            border: 1px solid #ccc;
        }
    </style>
<div class="list-container">
        <div id="list" style="position: relative">
        </div>

    </div>
 <script>
        const totalItems = 1000; // 定义总项目数
        const itemHeight = 50;  // 每个列表项的高度

        // 获取列表容器元素
        const container = document.querySelector('.list-container');
        const list = document.getElementById('list');

        list.style.height = `${totalItems * itemHeight}px`; // 计算并设置列表总高度

        function renderList(start, end) { // 渲染列表的函数
            list.innerHTML = ''; // 清空列表内容

            for (let i = start; i <= end; i++) { // 循环创建可见范围内的项目
                // 对于每个列表项
                const item = document.createElement("div");
                item.style.position = "absolute"; // 设置为绝对定位
                item.style.top = `${i * itemHeight}px`; // 设置顶部位置
                item.style.height = `${itemHeight}px`; // 设置高度
                item.style.width = "100%"; // 设置宽度
                item.textContent = `Item ${i + 1}`; // 设置文本内容
                list.appendChild(item); // 添加到列表中
            }
        }

        function handleScroll() { // 处理滚动事件的函数

            const scrollTop = container.scrollTop; // 获取容器的垂直滚动位置

            const start = Math.floor(scrollTop / itemHeight); // 计算起始索引
            const end = Math.min(
                start + Math.ceil(container.clientHeight / itemHeight), // 计算结束索引
                totalItems - 1
            );
            renderList(start, end); // 渲染列表
        }

        handleScroll(); // 初始渲染列表

        document.querySelector('.list-container').addEventListener('scroll', handleScroll); // 为列表容器添加滚动事件监听

    </script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值