Isotope — это мощная JavaScript-библиотека для фильтрации, сортировки и динамической расстановки элементов сетки. Одной из продвинутых техник оптимизации работы с большим количеством элементов является виртуализация. Виртуализация позволяет рендерить только видимую часть элементов в DOM, уменьшая нагрузку на браузер и повышая производительность при работе с сотнями или тысячами карточек.
Ограничение DOM-дерева Вместо того чтобы держать все элементы на странице, Isotope хранит полный набор данных в памяти, а в DOM отображает лишь видимые элементы. Это снижает нагрузку на рендеринг, ускоряет пересчёт layout и уменьшает использование памяти.
Динамическая подгрузка и удаление элементов При прокрутке контейнера библиотека добавляет новые элементы в DOM, когда они становятся видимыми, и удаляет те, что ушли за пределы области просмотра. Такой подход напоминает виртуализацию списков в React или Angular.
Кеширование размеров и позиций Для поддержания корректной сетки Isotope хранит размеры элементов и их координаты. Это позволяет быстро перестраивать layout при фильтрации или сортировке, не вызывая перерасчёт всех элементов каждый раз.
В стандартном Isotope нет встроенной полной виртуализации «из коробки», но её можно реализовать через комбинацию API:
Свойство itemSelector Определяет,
какие элементы сетки участвуют в layout. При виртуализации это может
быть динамический селектор, который подставляется в зависимости от
видимой области.
Методы appended, prepended,
remove Позволяют добавлять и удалять элементы из
DOM, что используется для подгрузки и очистки невидимых
элементов.
Метод layout После обновления
видимых элементов необходимо вызвать layout, чтобы
пересчитать позиции карточек и сохранить корректность сетки.
Создание контейнера и массива данных Все данные хранятся в массиве JavaScript, а не в DOM. Элементы создаются динамически при необходимости.
const itemsData = [...Array(1000).keys()].map(i => ({
id: i,
title: `Элемент ${i}`,
category: i % 2 === 0 ? 'even' : 'odd'
}));
const container = document.querySelector('.grid');Отрисовка видимой части Выбирается диапазон элементов, которые помещаются в видимую область, и создаются соответствующие DOM-узлы.
function renderVisibleItems(start, end) {
container.innerHTML = '';
const fragment = document.createDocumentFragment();
for (let i = start; i < end; i++) {
const div = document.createElement('div');
div.className = 'grid-item';
div.textContent = itemsData[i].title;
fragment.appendChild(div);
}
container.appendChild(fragment);
}Инициализация Isotope После создания элементов вызывается стандартная инициализация Isotope.
const iso = new Isotope(container, {
itemSelector: '.grid-item',
layoutMode: 'masonry',
masonry: {
columnWidth: 200,
gutter: 10
}
});Обработка скролла для виртуализации При
прокрутке вычисляется новый диапазон видимых элементов, отрисовываются
новые карточки, старые удаляются. После этого вызывается
iso.layout().
window.addEventListener('scroll', () => {
const scrollTop = window.scrollY;
const viewportHeight = window.innerHeight;
const start = Math.floor(scrollTop / 220) * 3; // 220px высота + margin
const end = start + Math.ceil(viewportHeight / 220) * 3;
renderVisibleItems(start, end);
iso.reloadItems();
iso.layout();
});Плавность анимации Isotope позволяет анимировать
перестановку элементов, что делает виртуализированную сетку визуально
цельной. Важно вызвать iso.layout() после добавления или
удаления элементов.
Фильтрация и сортировка При виртуализации нужно применять фильтры и сортировку к массиву данных, а не к DOM, и отрисовывать только видимую часть после применения условий.
Кэширование DOM-узлов Для ускорения повторного отображения элементов можно хранить заранее созданные DOM-элементы в объекте или Map, чтобы не создавать их заново при каждом скролле.
Поддержка responsive При изменении ширины окна необходимо пересчитать количество видимых элементов по горизонтали и обновить диапазон отображения.
Виртуализация превращает Isotope из удобного инструмента для небольших сеток в высокопроизводительный движок для отображения массивов данных, сохраняя визуальную целостность и интерактивность.