事关我对于虚拟列表的那些事

253 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

写在前面: 记录总结一下关于前端渲染长列表的各种方案,以及虚拟列表的实现方式.

事关我对于虚拟列表的那些事

业务中经常遇到渲染长列表的需求,而我们使用的优化方式通常是分页加载,懒加载,以及虚拟列表,那就这几个方案来展开说说

分页加载

前端分页

  • 多惨呀前端分页,后端一股脑把数据全传给前端,前端按步长把数据切成多份.

后端分页

  • 后端数据库分页,接口告诉你总共有多少页,当前在多少页,请求数据的时候告诉后端你要第几页的数据.

使用场景通常在表格中,搭配分页器使用效果更加.

懒加载其一

手机端常用一些,通过监听上拉的动作,请求接口获取下一页的数据,但数据会越来越多,列表越来越长,影响流畅度造成页面卡顿

懒加载其二

css的新属性: content-visibility

content-visibility:属性控制一个元素是否渲染其内容,它允许用户代理(浏览器)潜在地省略大量布局和渲染工作,直到需要它为止。

简单来说就是,添加content-visibility属性之后,容器内的内容只会渲染用户能看见的那部分,其他 部分只要还没显示,就暂时不会渲染,天生的懒加载.

常用属性值

  • content-visibility: visible:默认值,没有任何效果,相当于没有添加 content-visibility,元素的渲染与往常一致。
  • content-visibility: hidden:与 display: none 类似,用户代理将跳过其内容的渲染。(这里需要注意的是,跳过的是内容的渲染)
  • content-visibility: auto:如果该元素不在屏幕上,并且与用户无关,则不会渲染其后代元素。

虚拟列表

实现思路

  • 虚拟列表每次只加载当前区域以及区域外一部分数据内容,不会全部加载.
  • 移除浏览器滚动条,自己模拟滚动条然后监听鼠标滚动事件,通过修改transform的值来模拟滚动效果,同时在内容增加的时候,加大容器的padding-top值来让滚动条变短.
  • 通过设置可见区域来遮挡可见区域外的内容和空白,在滚动的时候去动态加载内容,类似js无缝轮播的视觉戏法.

具体步骤

参考文章:

  • 怕误人子弟,自己的总结后面补,给大家看一下超详细的两篇大佬文章.

虚拟列表,我真的会了!!!

高性能渲染十万条数据(虚拟列表)

End