跳至正文

Virtual scroll

窗口化列表——1万行,约25个DOM节点。

浏览器
Chrome 123+Firefox 121+Safari 17.5+
层级
2
压缩后大小
4.16 kB
强制布局预算
0 ms
axe 预算
0
支持 SSR
是
公开契约
测试环境

交互示例

Virtual scroll

10,000 team members with checkbox, avatar, and dropdown actions. Only visible rows (+ buffer) mount in the DOM — open DevTools and count [data-uiify-virtual-scroll] [data-part="row"] nodes while scrolling.

User 1
Admin
User 2
Viewer
User 3
Editor
User 4
Admin
User 5
Editor
User 6
Viewer
User 7
Admin
User 8
Viewer
User 9
Editor
User 10
Admin
User 11
Editor
User 12
Viewer
User 13
Admin
User 14
Viewer
User 15
Editor
User 16
Admin
User 17
Editor
User 18
Viewer

Horizontal

The same users as a horizontal strip with orientation="horizontal". rowHeight sets each card's width; the window follows the viewport width.

User 1
Admin
User 2
Viewer
User 3
Editor
User 4
Admin
User 5
Editor
User 6
Viewer
User 7
Admin
User 8
Viewer
User 9
Editor
User 10
Admin
User 11
Editor
User 12
Viewer

API

VirtualScroll

属性类型默认值说明
items*T[]—完整的项目列表,每项都有稳定id;只渲染当前范围内的行。
renderRow*(item: T, index: number) => ReactNode—根据项目及其绝对索引渲染单行内容。
heightnumber—以像素为单位的显式高度。省略并传入style={{ blockSize: '100%' }}可填满高度确定的父元素;两者均未提供时默认为600px。
rowHeightnumber64每行在滚动轴上的固定像素尺寸(纵向为高度,横向为宽度),用于计算滚动尺寸和可见行。
orientation"vertical" | "horizontal""vertical"滚动轴。横向列表沿行内轴滚动,根据实测视口宽度确定渲染窗口大小,在从右向左的布局中正确镜像,并将值同步到data-orientation。
overscannumber5在可见范围上方和下方额外渲染的行数,避免快速滚动时出现空白。
estimateRowHeight(index: number) => number—按索引估算高度,使列表切换为动态布局;渲染后的行会被测量,并据此修正估算。
role"list" | "grid""list"应用于滚动容器的ARIA角色。
anchor"start" | "end""start"添加或移除项目时,滚动位置固定在列表的哪一端。
followAppendboolean | "smooth"false列表已滚动到底部时,滚动到新追加的项目,可选择平滑滚动。
scrollRefRef<VirtualScrollHandle>—接收命令式句柄,暴露scrollToIndex、scrollToOffset和scrollToEnd。
onRangeChange(range: VirtualScrollRangeChange) => void—渲染窗口移动时,使用可见及额外预渲染的索引范围调用。
onScrollStateChange(state: VirtualScrollScrollState) => void—开始滚动和滚动停止时调用。
isScrollingResetDelaynumber150浏览器不支持scrollend事件时,判定滚动停止所需的无活动时长,单位为毫秒。
classNamestring—应用于滚动容器的类名。
testIdstring—滚动容器data-testid属性的值。

键盘

按键操作
Scroll通过滚轮、触控板或滚动条移动渲染窗口
Tab在行控件之间移动焦点(复选框、菜单触发器)
Arrow keys在已打开的下拉菜单内移动焦点
Escape关闭已打开的下拉菜单

无障碍

全高占位元素保证原生滚动条准确,同时只挂载固定数量的行槽及额外预渲染行;稳定的槽位key用于复用DOM节点。行在role="list"滚动区域内暴露role="listitem"、aria-posinset和aria-setsize。滚动同步使用被动监听;滚动条、Home/End或Cmd+Arrow等大幅跳转会同步更新范围。

样式钩子

data-uiify-virtual-scrolldata-part="spacer"data-part="row"