虚拟列表实现相关文章

165 阅读2分钟

虚拟列表是什么?

用高度撑开滚动容器,只在滚动容器的可视区域渲染dom节点,并在滚动时,动态计算可视区域需要展示的dom节点

什么情况下使用?

表格场景或列表场景,当数据量很大时,为了避免浏览器渲染过多的dom节点,导致的浏览器卡顿和卡死

虚拟列表需要了解的一些概念

滚动容器

当DOM元素内部的内容超过DOM元素本身的高度时,会出现滚动条的DOM元素

DOM元素的可视区高度

DOM节点可被人直接看到的区域,通过dom.offsetHeight获取, 这里注意与element.getBoundingClientRect().height的区别

所有数据集合

所有需要显示的数据。通过ajax获取

可视区数据集合

可视区域要显示的数据集合。通过dataList.slice(start,end)方式获取

项数据的高度

就是指每一项数据的高度

当前可视区可显示的记录数

知道了总的可视区高度和每一项的高度,就可以计算当前可视区可显示的记录数。Math.floor(scrollDom.offsetHeight/itemHeight)

缓冲数据

在滚动容器的不可见区域,多渲染一定量的数据,减少滚动过快,浏览器来不及渲染带来的白屏几率

显示数据的开始索引号,显示数据的结束索引号

开始索引计算: Math.floor(scrollDom.offsetTop/itemHeight)

结束索引计算: 开始索引+当前可视区可显示的记录数+缓冲区大小

这里的索引号,是指在所有数据集合中的索引位置

offsetTop

滚动容器顶部距离视口顶部的距离

通过图形来理解上面的名词

test.drawio (3).png

参考资料

三种虚拟列表原理与实现 - 掘金 (juejin.cn)

「前端进阶」高性能渲染十万条数据(虚拟列表)

剖析无限滚动虚拟列表的实现原理

用原生JS实现虚拟列表

浅说虚拟列表的实现原理

vue实现虚拟列表组件解决长列表性能问题

虚拟滚动列表(动态高)

element.getBoundingClientRect().width/height VS. …