【js】无限虚拟列表的原理及实现

warning: 这篇文章距离上次修改已过261天,其中的内容可能已经有所变动。



// 创建一个无限滚动的虚拟列表
function createInfiniteScrollList(options) {
  // 初始化参数
  const itemHeight = options.itemHeight || 20; // 每个条目的高度
  const start = options.start || 0; // 起始条目索引
  const total = options.total || 1000; // 总条目数
  const rowRenderer = options.rowRenderer; // 渲染函数
  const container = options.container; // 容器元素
 
  // 计算可视区域的高度
  const visibleHeight = container.offsetHeight;
 
  // 计算可以容纳的条目数
  const numItems = Math.ceil(visibleHeight / itemHeight);
 
  // 渲染函数,更新DOM
  function render() {
    for (let i = 0; i < numItems; i++) {
      const index = start + i;
      if (index < total) {
        rowRenderer(index, container);
      }
    }
  }
 
  // 初始渲染
  render();
 
  // 监听滚动事件
  container.addEventListener('scroll', () => {
    const scrollTop = container.scrollTop;
    const nextStart = Math.floor(scrollTop / itemHeight);
    if (nextStart !== start) {
      // 计算新的起始位置
      const newStart = Math.max(0, Math.min(nextStart, total - numItems));
      const diff = newStart - start;
 
      // 如果需要,移动所有条目来匹配新的起始位置
      const items = container.querySelectorAll('.list-item');
      for (let i = 0; i < items.length; i++) {
        items[i].style.transform = `translateY(${itemHeight * i + diff}px)`;
      }
 
      // 更新起始位置
      start = newStart;
    }
  });
}
 
// 使用示例
const listContainer = document.getElementById('list-container');
createInfiniteScrollList({
  container: listContainer,
  itemHeight: 50,
  total: 10000,
  rowRenderer: (index, container) => {
    const element = document.createElement('div');
    element.className = 'list-item';
    element.style.height = '50px';
    element.textContent = `Item ${index}`;
    container.appendChild(element);
  }
});

这段代码实现了一个无限滚动的虚拟列表。它通过监听滚动事件来动态渲染足够多的条目,以便在用户滚动时不会出现性能问题。每次滚动时,只需要移动容器内的条目来保持新的可视区域,而不是重新渲染整个列表。这种方法极大地提高了性能,并提供了流畅的滚动体验。

最后修改于:2024年08月18日 22:57

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日