К содержимому
uiify

Virtual scroll

Список с виртуализацией — 10 тыс. строк, около 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[]—Полный список элементов со стабильными идентификаторами; отображаются только строки текущего диапазона.
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Закрыть открытое выпадающее меню

Доступность

Распорка полной высоты сохраняет точность нативной полосы прокрутки, пока смонтирован лишь фиксированный пул ячеек строк с запасом; стабильные ключи ячеек позволяют переиспользовать узлы DOM. Строки имеют role="listitem" с aria-posinset и aria-setsize внутри области прокрутки с role="list". Синхронизация прокрутки пассивна, а большие переходы — полосой прокрутки, Home/End или Cmd+Arrow — обновляют диапазон синхронно.

Привязка стилей

data-uiify-virtual-scrolldata-part="spacer"data-part="row"
Эта страница переведена автоматически и ещё не проверена.