Masonry — это библиотека для динамического позиционирования элементов сетки, которая часто используется для галерей изображений, карточек товаров или блогов с разным размером контента. Одной из ключевых задач при работе с Masonry является корректная обработка ошибок загрузки изображений и других медиа-ресурсов, чтобы сетка не ломалась и элементы не перекрывались.
Masonry вычисляет размеры и расположение элементов на основе их
реальных размеров. Если изображение или медиа-контент ещё не загружены,
библиотека может неправильно рассчитать положение соседних элементов,
что приведёт к пустым зонам или наложению карточек. Ошибки загрузки
изображений усугубляют проблему: браузер может вернуть 404,
ресурс может быть недоступен, либо время загрузки слишком велико.
load и errorДля контроля загрузки изображений необходимо отслеживать события
load и error.
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
const images = grid.querySelectorAll('img');
images.forEach(img => {
img.addEventListener('load', () => {
msnry.layout(); // пересчитываем сетку после успешной загрузки
});
img.addEventListener('error', () => {
img.src = 'placeholder.jpg'; // подставляем резервное изображение
msnry.layout(); // пересчитываем сетку после замены
});
});
load — срабатывает при успешной загрузке
изображения.error — срабатывает, если загрузка не удалась.Использование этих событий гарантирует, что Masonry всегда имеет актуальные размеры элементов перед перерасчетом сетки.
Для крупных галерей удобно использовать библиотеку
imagesLoaded, которая работает в связке с Masonry и
автоматически отслеживает загрузку всех изображений внутри
контейнера.
imagesLoaded(grid, { background: true }, () => {
msnry.layout();
});
{ background: true } позволяет отслеживать
фоновые изображения CSS.Использование imagesLoaded позволяет избежать
многократных пересчетов Masonry при последовательной загрузке отдельных
изображений.
Если изображение не загрузилось, есть несколько стратегий:
img.addEventListener('error', () => {
const parent = img.closest('.grid-item');
parent.remove();
msnry.layout();
});
Удаление элемента корректно перерассчитывает сетку и предотвращает появление пустых мест.
При динамическом добавлении элементов через AJAX важно обрабатывать ошибки сразу после вставки в DOM:
fetch('/api/images')
.then(res => res.json())
.then(data => {
data.forEach(url => {
const item = document.createElement('div');
item.className = 'grid-item';
const img = document.createElement('img');
img.src = url;
img.addEventListener('load', () => msnry.appended(item));
img.addEventListener('error', () => {
img.src = 'placeholder.jpg';
msnry.appended(item);
});
item.appendChild(img);
grid.appendChild(item);
});
});
msnry.appended(item) — сообщает Masonry о новом
элементе, после чего пересчитывается сетка.Для крупных проектов полезно логировать ошибки загрузки в консоль или отправлять на сервер, чтобы отслеживать недоступные ресурсы:
img.addEventListener('error', (e) => {
console.warn('Ошибка загрузки изображения:', e.target.src);
});
Такой подход позволяет быстро выявлять проблемы с ресурсами и корректировать контент.
Эффективная обработка ошибок загрузки в Masonry включает:
load и error на всех
изображениях.imagesLoaded для упрощения работы с
галереями.Соблюдение этих принципов обеспечивает корректное отображение сетки Masonry даже при проблемах с загрузкой медиа-ресурсов.