每天一个前端小知识 Day 33 - 虚拟列表与长列表性能优化实践(Virtual Scroll)

虚拟列表与长列表性能优化实践(Virtual Scroll)


🎯 一、背景:为何需要虚拟列表?

在实际业务中,我们经常需要渲染大量数据项,比如:

  • 聊天记录滚动展示
  • 电商商品长列表
  • 数据中心表格(DataGrid)

如果直接将上千条 DOM 节点一次性渲染,会引起:

问题 说明
卡顿/掉帧 浏览器 DOM 渲染耗时过大,UI thread 被堵塞
内存暴涨 节点数量越多,内存占用越高,GC 压力大
页面响应慢 任何交互都有延迟,影响用户体验

🧠 二、什么是虚拟滚动(Virtual Scroll)?

虚拟列表是一种“按需渲染”的技术:

只渲染当前可视区域内的少量 DOM 节点,其余的用空白占位撑起滚动高度,从而模拟完整列表滚动。

通过“视口裁剪 + 滚动同步”,将 10000 项渲染的压力降到几十项以内。


🧩 三、虚拟滚动原理简述

📦 示例:

  • 假设每一项高度为 50px
  • 列表有 10000 项,总高度为 500,000px
  • 实际可视区域只能显示 20 项

👉 只渲染这 20 项 DOM 元素
👉 设置容器滚动高度为总高度
👉 根据滚动位置动态更新“可视区域数据 + offset”


📈 可视区域公式计算:

const visibleCount = Math.ceil(containerHeight / itemHeight);
const startIndex = Math.floor(scrollTop / itemHeight);
const endIndex = startIndex + visibleCount;

🛠 四、手写简易虚拟列表(原生 JS 示例)

<div id="container" style="height
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝婷儿

码字烧脑,求投喂鸡腿续命!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值