.container{宽度:100vw;高度:100%;溢出:自动;位置:相对;}.phantom{位置:绝对;左:0;顶部:0;右:0;z-index:-1;}.list{left:0;右:0;顶部:0;位置:绝对;text-align:center;}.list-item{padding:10px;-底部:1px纯黑色;背景:对于长列表的渲染,一般采用分页或者懒加载的方式,将数据下拉到底部再向后端请求。每次只加载一部分数据,但随着加载的数据越来越多。页面的Dom无限增加,会给浏览器带来负担,整个滑动也会出现卡顿。解决方案:虚拟列表虚拟列表实际上是一种按需展示的表现形式。只渲染可见区域,不渲染或部分渲染非可见区域数据,减轻浏览器负担,提高渲染性能。第一次渲染时,可见区域的高度÷单个列表项的高度=一屏需要渲染的列表个数。当发生滚动时,记录滚动距离。根据滚动距离和单个列表项的高度,可以知道当前可见区域的索引。同时,为了营造滚动效果,在列表区,将transform属性的translate的Y值设置为scrollTop-(scrollTop%itemSize)(当滚动到数据项中间时,y值oftransform不包含数据项)总结:虚拟列表的实现其实就是在首屏加载的时候只加载可见区域需要的列表项。当发生滚动时,通过计算动态获取可见区域的列表项,非可见区域内存中的列表项被移除。Dom不改变,数据改变。避免分页和懒加载会无限增加Dom的缺点。两种场景的具体实现:1.定高场景(1)首先确定DOM结构:第一层作为容器,作为容器层。功能:监听滚动并记录滚动位置。第二层scrollTop分为placeholder层和list层。列表层为可视化区域,渲染列表区域,使用translate3d显示动画滚动效果,其中y值与容器层记录的滚动位置相关。(2)父组件传入所有列表数据,以及每个列表项的高度。(3)可以计算出整个列表的长度,给占位层的高度赋值。数据长度*单个列表项的高度(4)计算可见区域的高度,计算一屏可以显示的列表数。定义两个变量start和end来控制可见区域的起始索引和结束索引。通过起始索引和结束索引更新可视区域列表数据。(5)监听容器滚动,记录滚动位置scrollTop,并更新列表区域scrollTop的开始、结束、偏移量-(scrollTop%单个列表项的高度)