Virtual List
当我们在浏览器上浏览一个很大的列表时,会渲染出很多标签,但是用户能看到的就只有可视区那些而已,真的有必要把所有的都渲染出来吗?如果不是的话,那有什么好的办法呢?这就轮到 virtual list 出马了,virtual list 的原则就是只渲染特定数量的元素,当用户上下滚动时,替换掉这些元素里面的内容。
实现方式
页面结构
1 | <div className="container"> |
这里,container 是可视区,需要设定高度。content
下面就是我们要渲染的列表。但是这个 holder
是啥玩意呢?
前面说过了我们的列表数量是特定的,可以根据列表元素和可视区的高度可以计算出来,那么我们怎么滚动起来呢?holder
就是用来做这个的,holder
的高度是列表所有元素的高度和,这样我们就用它模拟出了所有元素都渲染出来的时候的一个滚动效果。
当我们往上滚动的时候,content
会随着父元素一起往上滚,我们就看不到内容了,所以我们还需要实时得到往上滚动的距离,并设置 translate3D(0, ${scrollTop}px, 0)
, 这样 content
就可以一直保持在可视区了,然后我们将 content
下的内容替换成当前应该显示的元素,这样就大功告成了。
代码实现
最后放上 react 版本的代码:
1 | import React from 'react' |