⟦Škíp tó çóñtéñt~~~~~~⟧
uiify

Virtual scroll

⟦Wíñdówéd líšt — 10k rówš, ~25 DÓM ñódéš.~~~~~~~~~~~~~~⟧

⟦Brówšérš~~~⟧
Chrome 123+Firefox 121+Safari 17.5+
⟦Tíér~~⟧
2
⟦Búñdlé çómpréššéd~~~~~~⟧
4.16 kB
⟦Fórçéd láýóút búdgét~~~~~~~⟧
0 ms
⟦Áxé búdgét~~~~⟧
0
⟦ŠŠR çómpátíblé~~~~~⟧
⟦Ýéš~~⟧
⟦Públíšhéd çóñtráçt~~~~~~~⟧
⟦Téšt hárñéšš~~~~~⟧

⟦Pláýgróúñd~~~~⟧

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

⟦ÁPÍ~~⟧

VirtualScroll

⟦Próp~~⟧⟦Týpé~~⟧⟦Défáúlt~~~⟧⟦Déšçríptíóñ~~~~⟧
items*T[]—⟦Thé fúll líšt óf ítémš, éáçh wíth á štáblé íd; óñlý thé rówš íñ thé çúrréñt ráñgé áré réñdéréd.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
renderRow*(item: T, index: number) => ReactNode—⟦Réñdérš thé çóñtéñtš óf óñé rów fróm ítš ítém áñd ábšólúté íñdéx.~~~~~~~~~~~~~~~~~~~~~~~⟧
heightnumber—⟦Éxplíçít héíght íñ píxélš. Ómít ít áñd pášš štýlé={{ blockSize: '100%' }} tó fíll á défíñíté páréñt héíght; 600px íš thé défáúlt whéñ ñéíthér íš šúpplíéd.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
rowHeightnumber64⟦Fíxéd píxél šížé óf éáçh rów óñ thé šçróll áxíš (héíght whéñ vértíçál, wídth whéñ hórížóñtál), úšéd tó çómpúté šçróll šížé áñd víšíblé rówš.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
orientation"vertical" | "horizontal""vertical"⟦Šçróll áxíš. Hórížóñtál líštš šçróll óñ thé íñlíñé áxíš, šížé thé wíñdów fróm thé méášúréd víéwpórt wídth, mírrór çórréçtlý íñ ríght-tó-léft láýóútš, áñd mírrór thé válúé tó dátá-óríéñtátíóñ.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
overscannumber5⟦Ñúmbér óf éxtrá rówš réñdéréd ábóvé áñd bélów thé víšíblé ráñgé šó fášt šçróllíñg dóéš ñót révéál bláñk špáçé.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
estimateRowHeight(index: number) => number—⟦Pér-íñdéx héíght éštímáté thát šwítçhéš thé líšt tó dýñámíç láýóút, whéré réñdéréd rówš áré méášúréd áñd thé éštímáté íš çórréçtéd.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
role"list" | "grid""list"⟦ÁRÍÁ rólé ápplíéd tó thé šçróll çóñtáíñér.~~~~~~~~~~~~~~~⟧
anchor"start" | "end""start"⟦Whíçh éñd óf thé líšt thé šçróll póšítíóñ štáýš píññéd tó whéñ ítémš áré áddéd ór rémóvéd.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
followAppendboolean | "smooth"false⟦Šçróllš tó ñéwlý áppéñdéd ítémš whéñ thé líšt íš álréádý át thé éñd, óptíóñállý wíth šmóóth šçróllíñg.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
scrollRefRef<VirtualScrollHandle>—⟦Réçéívéš thé ímpérátívé háñdlé éxpóšíñg šçróllTóÍñdéx, šçróllTóÓffšét áñd šçróllTóÉñd.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
onRangeChange(range: VirtualScrollRangeChange) => void—⟦Çálléd wíth thé víšíblé áñd óvéršçáññéd íñdéx ráñgéš whéñévér thé réñdéréd wíñdów móvéš.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
onScrollStateChange(state: VirtualScrollScrollState) => void—⟦Çálléd whéñ šçróllíñg štártš áñd whéñ ít šéttléš.~~~~~~~~~~~~~~~~~~⟧
isScrollingResetDelaynumber150⟦Míllíšéçóñdš óf qúíét béfóré šçróllíñg íš tréátéd áš šéttléd íñ brówšérš wíthóút thé šçrólléñd évéñt.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧
classNamestring—⟦Çlášš ápplíéd tó thé šçróll çóñtáíñér.~~~~~~~~~~~~~~⟧
testIdstring—⟦Válúé fór thé šçróll çóñtáíñér'š dátá-téštíd áttríbúté.~~~~~~~~~~~~~~~~~~~~⟧

⟦Kéýbóárd~~~⟧

⟦Kéý~~⟧⟦Áçtíóñ~~~⟧
Scroll⟦Whéél, tráçkpád, ór šçróllbár móvéš thé wíñdów~~~~~~~~~~~~~~~~~⟧
Tab⟦Móvé fóçúš bétwééñ rów çóñtrólš (çhéçkbóx, méñú tríggér)~~~~~~~~~~~~~~~~~~~~⟧
Arrow keys⟦Róvé ítémš íñšídé áñ ópéñ drópdówñ méñú~~~~~~~~~~~~~~⟧
Escape⟦Çlóšé áñ ópéñ drópdówñ méñú~~~~~~~~~~⟧

⟦Áççéššíbílítý~~~~~⟧

⟦Á fúll-héíght špáçér kéépš thé ñátívé šçróllbár áççúráté whílé óñlý á fíxéd póól óf rów šlótš, plúš óvéršçáñ, íš móúñtéd; štáblé šlót kéýš réçýçlé DÓM ñódéš. Rówš éxpóšé rólé="líštítém" wíth áríá-póšíñšét áñd áríá-šétšížé íñšídé á rólé="líšt" šçróllpórt. Šçróll šýñç íš páššívé, áñd lárgé júmpš šúçh áš thé šçróllbár, Hómé/Éñd ór Çmd+Árrów úpdáté thé ráñgé šýñçhróñóúšlý.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~⟧

⟦Štýlíñg hóókš~~~~~⟧

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