Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: virtual scroll, windowing, performance optimization, DOM recycling, React Virtualized

Работал ли с виртуальным скроллом? Как он устроен?

Вопрос проверяет понимание техники виртуального скролла для оптимизации производительности при отображении больших списков данных.

Короткий ответ

Виртуальный скролл — это техника, при которой рендерится только видимая часть списка, а не все элементы. Это достигается путем расчета позиции элементов на основе скролла и динамического создания/удаления DOM-узлов. Такой подход значительно снижает нагрузку на браузер при работе с тысячами записей.

Длинный ответ

Что такое виртуальный скролл?

Виртуальный скролл (или windowing) — это техника рендеринга, при которой в DOM присутствуют только те элементы списка, которые видны пользователю в данный момент. Остальные элементы заменяются пустыми блоками-заполнителями, сохраняющими общую высоту скролла. Это позволяет работать со списками из десятков тысяч элементов без потери производительности.

Как это работает?

Основная идея заключается в том, чтобы отслеживать позицию скролла и вычислять, какие элементы должны быть видны. Для этого используется контейнер с фиксированной высотой и overflow: auto. Внутри него находится прокручиваемый блок с общей высотой, равной высоте всех элементов. Видимые элементы рендерятся абсолютно позиционированными внутри этого блока.

Пример реализации на React

import { useRef, useState, useCallback } from 'react';

const ITEM_HEIGHT = 50;
const OVERSCAN = 3;

function VirtualList({ items }) {
  const containerRef = useRef(null);
  const [scrollTop, setScrollTop] = useState(0);

  const handleScroll = useCallback(() => {
    setScrollTop(containerRef.current.scrollTop);
  }, []);

  const totalHeight = items.length * ITEM_HEIGHT;
  const startIndex = Math.max(0, Math.floor(scrollTop / ITEM_HEIGHT) - OVERSCAN);
  const endIndex = Math.min(items.length, Math.ceil((scrollTop + containerRef.current?.clientHeight) / ITEM_HEIGHT) + OVERSCAN);

  const visibleItems = items.slice(startIndex, endIndex);

  return (
    <div ref={containerRef} onScroll={handleScroll} style={{ height: '400px', overflow: 'auto' }}>
      <div style={{ height: totalHeight, position: 'relative' }}>
        {visibleItems.map((item, index) => (
          <div key={item.id} style={{
            position: 'absolute',
            top: (startIndex + index) * ITEM_HEIGHT,
            height: ITEM_HEIGHT,
            width: '100%'
          }}>
            {item.text}
          </div>
        ))}
      </div>
    </div>
  );
}

Где применяется?

  • Чаты с тысячами сообщений
  • Таблицы с большим количеством строк
  • Ленты социальных сетей
  • Списки файлов или логов

Вывод: виртуальный скролл стоит применять, когда нужно отобразить более 1000 элементов в списке, чтобы избежать зависаний интерфейса и обеспечить плавную прокрутку.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#virtual scroll

#windowing

#performance optimization

#DOM recycling

#React Virtualized

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию