Lazy rendering — это метод оптимизации производительности при работе с большим количеством элементов в сетке Masonry. Основная идея заключается в том, чтобы загружать и отображать элементы только по мере необходимости, например, когда они становятся видимыми в области просмотра пользователя. Это снижает нагрузку на браузер, ускоряет первоначальную отрисовку страницы и уменьшает потребление памяти.
Masonry рассчитывает положение каждого элемента на основе предыдущих блоков, поэтому стандартная отрисовка всех элементов сразу может быть ресурсоёмкой. Lazy rendering позволяет:
Для реализации lazy rendering в Masonry важно учитывать несколько ключевых аспектов:
Инициализация Masonry с опцией
itemSelector Каждый элемент сетки должен иметь
уникальный селектор. Пример:
const masonry = new Masonry('.grid', {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10,
percentPosition: true
});Подготовка контейнера под динамическую подгрузку
Элементы можно заранее создавать как скрытые блоки с
display: none и постепенно включать их в Masonry:
const items = document.querySelectorAll('.grid-item');
items.forEach(item => item.style.display = 'none');Отслеживание видимости элементов Для определения
момента, когда элемент должен быть показан, используют
IntersectionObserver:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if(entry.isIntersecting) {
entry.target.style.display = 'block';
masonry.appended(entry.target);
observer.unobserve(entry.target);
}
});
}, { rootMargin: '0px 0px 200px 0px' });
items.forEach(item => observer.observe(item));
Здесь ключевой момент — добавление элемента через
masonry.appended, чтобы Masonry пересчитал позиции
сетки.
Lazy rendering часто комбинируют с асинхронной подгрузкой данных (например, через fetch или AJAX). Основные шаги:
display: none.IntersectionObserver для постепенного
отображения.Пример асинхронной подгрузки:
async function loadItems(url) {
const response = await fetch(url);
const data = await response.json();
const fragment = document.createDocumentFragment();
data.forEach(itemData => {
const item = document.createElement('div');
item.className = 'grid-item';
item.style.display = 'none';
item.innerHTML = `<img src="${itemData.image}" alt="${itemData.title}">`;
fragment.appendChild(item);
observer.observe(item);
});
document.querySelector('.grid').appendChild(fragment);
}
rootMargin в
IntersectionObserver, чтобы элементы подгружались заранее и
не создавалось ощущение задержки.Для сеток с изображениями важно учитывать размер изображения до его полной загрузки, иначе Masonry может неправильно рассчитать позиции. Подходы:
imagesLoaded библиотеку:imagesLoaded('.grid', () => {
masonry.layout();
});
width и height для картинок.Lazy rendering в Masonry позволяет:
Эффективная комбинация IntersectionObserver,
асинхронной загрузки данных и методов Masonry
(appended, layout) обеспечивает динамическую и
отзывчивую сетку без потери производительности.