当前位置: 首页 > news >正文

渲染十万条数据就把你难住了?不存在的!

虚拟列表的使用场景

如果我想要在网页中放大量的列表项,纯渲染的话,对于浏览器性能将会是个极大的挑战,会造成滚动卡顿,整体体验非常不好,主要有以下问题:

  • 页面等待时间极长,用户体验差

  • CPU计算能力不够,滑动会卡顿

  • GPU渲染能力不够,页面会跳屏

  • RAM内存容量不够,浏览器崩溃

1. 传统做法

对于长列表渲染,传统的方法是使用懒加载的方式,下拉到底部获取新的内容加载进来,其实就相当于是在垂直方向上的分页叠加功能,但随着加载数据越来越多,浏览器的回流和重绘的开销将会越来越大,整个滑动也会造成卡顿,这个时候我们就可以考虑使用虚拟列表来解决问题

2. 虚拟列表

其核心思想就是在处理用户滚动时,只改变列表在可视区域的渲染部分,具体步骤为:

先计算可见区域起始数据的索引值startIndex和当前可见区域结束数据的索引值endIndex,假如元素的高度是固定的,那么startIndex的算法很简单,即startIndex = Math.floor(scrollTop/itemHeight),endIndex = startIndex + (clientHeight/itemHeight) - 1,再根据startIndex 和endIndex取相应范围的数据,渲染到可视区域,然后再计算startOffset(上滚动空白区域)和endOffset(下滚动空白区域),这两个偏移量的作用就是来撑开容器元素的内容,从而起到缓冲的作用,使得滚动条保持平滑滚动,并使滚动条处于一个正确的位置

上述的操作可以总结成五步:

  • 不把长列表数据一次性全部直接渲染在页面上

  • 截取长列表一部分数据用来填充可视区域

  • 长列表数据不可视部分使用空白占位填充(下图中的startOffset和endOffset区域)

  • 监听滚动事件根据滚动位置动态改变可视列表

  • 监听滚动事件根据滚动位置动态改变空白填充

http://www.lryc.cn/news/37669.html

相关文章:

  • 编程学习的心路历程和困惑回顾
  • 请介绍类加载过程,什么是双亲委派模型?
  • Navisworks编辑材质和Revit快速切换材质问题
  • Object对象键值的输出循序到底如何排列的?
  • 气泡式水位计的安装方法详解
  • 求“二维随机变量的期望E(X)与方差D(X)”例题(一)
  • MySQL 搞定行转列,列转行
  • 正点原子裸机开发之C语言点灯程序
  • cv::阈值分割OTUS原理+代码
  • Postgresql-12.5 visual studio-2022 windows 添加pg工程并调试
  • 长沙学院2023 第一次蓝桥训练题解
  • 云端Docker搭建ABY库以及本地CLion使用
  • ES6-箭头函数、解构赋值、对象简写
  • 【CSS】CSS 背景设置 ② ( 背景位置 | 背景位置-方位值设置 )
  • HTML 扫盲
  • 项目中用到的责任链模式
  • C++复习笔记--STL的string容器和vector容器
  • 第一章 软件项目管理概述
  • 【Linux系统编程】06:共享内存
  • 【专项】112. 路径总和
  • 【数据结构】堆排序
  • 论文阅读笔记《GAMnet: Robust Feature Matching via Graph Adversarial-Matching Network》
  • 数据安全—数据完整性校验
  • Java 最小路径和
  • Flask+VUE前后端分离的登入注册系统实现
  • 【Go】用Go在命令行输出好看的表格
  • 怎么处理消息重发的问题?
  • JVM 运行时数据区(数据区组成表述,程序计数器,java虚拟机栈,本地方法栈)
  • Oracle ASM磁盘组配置、日常运维、故障处理等操作资料汇总
  • java对象的创建与内存分配机制