Вопрос проверяет понимание базовых принципов виртуализации и умение реализовать их вручную.
Виртуализация без библиотек реализуется через расчёт видимой области и рендер только нужных элементов. Используется контейнер со скроллом, вычисляется диапазон индексов, которые должны быть показаны. Остальное пространство компенсируется отступами. Такой подход требует аккуратных расчётов и оптимизации.
Самописная виртуализация — это управляемый компромисс между сложностью и контролем.
Нужно ответить на три вопроса:
какая часть списка видна
какие элементы туда попадают
где должен начинаться и заканчиваться контент
Известны:
высота контейнера
высота одного элемента
По scrollTop вычисляется:
startIndex
endIndex
Рендерятся элементы:
только в диапазоне [startIndex, endIndex]
Компенсация прокрутки:
padding-top = startIndex * itemHeight
padding-bottom = (total - endIndex) * itemHeight
const start = Math.floor(scrollTop / itemHeight)
const visibleCount = Math.ceil(containerHeight / itemHeight)
const end = start + visibleCount
разные высоты элементов
плавность скролла
частые пересчёты при scroll
поддержка resize
Из-за этих сложностей библиотеки и остаются популярными.
очень специфические требования
минимальный бандл
полный контроль над логикой
Виртуализация без библиотек строится на расчёте видимой области и управлении отступами. Это возможно, но требует аккуратной реализации и понимания внутренних механизмов браузера.