虚拟列表是什么?
用高度撑开滚动容器,只在滚动容器的可视区域渲染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
滚动容器顶部距离视口顶部的距离