# JavaScript 虚拟滚动列表组件 **Repository Path**: brandon__leon/javascript_virtual_scrolling ## Basic Information - **Project Name**: JavaScript 虚拟滚动列表组件 - **Description**: 【造轮子系列】使用JavaScript实现的可配置虚拟列表组件,研究高性能的渲染十万级别及以上的数据。 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2020-08-16 - **Last Updated**: 2023-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JavaScript ES5虚拟滚动列表组件 #### 介绍 【造轮子系列】使用**原生ES5语法**JavaScript实现的可配置虚拟列表组件,致力于实现高性能的渲染十万级别的非媒体资源数据,使用简单方便,设计紧凑。基于Vue语法实现的plugin部分仍在开发当中... #### 软件架构 软件架构说明 1. demo.html/demo-vue.html:实例的demo。 2. JS/virtual-list.js:原生ES5语法实现的版本(可直接引入使用) 3. JS/virtual-list-vue.js: 基于Vue实现的插件版本(有缘开发中...) 4. fake-data 测试的用例数据,使用faker.js。 #### 使用说明 ***示例***: 1. 通过script标签的方式引入: ```html ``` 2. 所有的方法挂载在引入的VirtualList构造函数上,通过使用实例对象和来实现虚拟滚动列表。 我们来看一段HTML代码: ```html
``` 3. 我们给这个div标签写一些简单的样式: ```css .demo { width: 100%; height: 600px; border: 1px solid #ccc; } ``` 4. 我们`new`一个实例对象,并传入参数。 现在`
`元素就变成了一个支持万级别数据渲染的长虚拟列表。 ```javascript // 示例代码 var vl = new VirtualList('.demo', testData, (data) => { var li = document.createElement('li'); li.innerHTML = `

这是第${data.index + 1}项数据

${data.value}

`; // 需要显式返回dom元素 return li; }, { dynamicHeight: true, estimateListHeight: 40 }); ``` 5. 传入参数说明: |参数顺序|参数名称|数据类型|基本说明| |:---:|:---:|:---:|:---:| |1|el|String、HTMLElemenet|转换为虚拟列表的容器元素,格式为直接传入DOM元素或者字符串选择器,容器元素需要手动设定CSS样式| |2|dataList|Array|需要参与渲染的数据列表,传入表现一个数组格式| |3|HTML Generator|(data)=>HTMLElement|生成单项列表内容的HTML生成器,表现形式为一个回调函数,**VirtualList会显式的将对应索引的dataList元素作为第一个参数传入**,这意味着你可以在这个回调函数的内部做模板元素的组装工作,回调函数**必须**显式return dom元素。| |4|option(可选)|Object|一个可选的配置参数,详细见配置参数部分说明。| 6. **配置参数说明**: **通用配置** |名称|可选值|默认值|基本说明| |:---:|:---:|:---:|:---:| |throttleTime|Number|100|对列表scroll事件进行防抖的时间区间,默认为100ms| |bufferScale|Number|0.5|列表上下缓冲区的大小比例,默认为上下额外渲染 50% 展示的部分| |useFrameOptimize|Boolean|false|是否采取按帧派发滚动事件,**这个属性对性能敏感**,开启后VirtualList会对scroll事件基于requestAnimationFrame来进行派发,对性能较高的PC端设备来说可以获取无缝的渲染体验,**但对于性能较差的设备可能会导致渲染线程的阻塞**,默认为false| >VirtualList的内部维护了两套计算滚动距离与高度的方式,是基于配置对象的dynamicHeight属性的布尔值来决定的,通常指定了具体数值的固定高度模式拥有更好的渲染性能。 **固定高度模式配置** |名称|可选值|默认值|基本说明| |:---:|:---:|:---:|:---:| |listHeight|Number|100|每项渲染列表的高度,采取固定高度,默认为100px| **动态高度模式配置** |名称|可选值|默认值|基本说明| |:---:|:---:|:---:|:---:| |dynamicHeight|Boolean|false|决定每项是否开启动态高度的计算机制,默认为false| |estimateListHeight|Number|40|动态高度模式下初始每项列表渲染的高度,**这个属性对性能敏感**,高度值与首屏渲染的数量成反比,默认值为40px| #### API说明 ***Still Thinking...*** #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)