Когда используется библиотека Masonry для создания сетки с динамическими элементами, часто возникает ситуация, когда изображения внутри элементов загружаются асинхронно. Поскольку Masonry рассчитывает расположение элементов исходя из их размеров, важно корректно обновлять сетку после того, как изображения полностью загрузились, чтобы избежать перекрытий и пустых пробелов.
Masonry ориентируется на размеры контейнера и элементов в момент инициализации. Если элемент содержит изображение, которое ещё не загрузилось, Masonry получает неверные размеры. В результате:
imagesLoadedДля корректной работы с изображениями рекомендуется применять библиотеку imagesLoaded, которая отслеживает загрузку всех изображений внутри контейнера.
Пример использования:
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
imagesLoaded(grid).on('progress', function() {
msnry.layout();
});
Объяснение:
imagesLoaded(grid) — отслеживает все изображения внутри
контейнера .grid.progress срабатывает каждый раз, когда одно из
изображений завершает загрузку.msnry.layout(), чтобы
Masonry пересчитал позиции элементов и скорректировал сетку.Если новые элементы добавляются динамически (например, при подгрузке
через AJAX), необходимо использовать метод
appended Masonry:
var newItems = document.querySelectorAll('.new-grid-item');
imagesLoaded(newItems).on('progress', function() {
msnry.appended(newItems);
});
Объяснение:
appended добавляет новые элементы в сетку Masonry
и пересчитывает их позиции.imagesLoaded гарантирует, что элементы с
изображениями будут корректно расположены.В случаях, когда структура элементов изменяется радикально (например,
меняется высота нескольких элементов одновременно), рекомендуется
вызвать метод layout() для полной
переработки сетки:
msnry.layout();
Этот метод пересчитывает все позиции элементов, учитывая новые размеры, и устраняет возможные пустые места или перекрытия.
При работе с большим количеством изображений важно избегать частого
вызова layout(), так как это ресурсоёмкая операция.
Рекомендуется:
imagesLoaded(...).on('done', ...) для
вызова однократного обновления сетки после загрузки
всех изображений.requestAnimationFrame.Пример оптимизированного подхода:
imagesLoaded(grid, function() {
msnry.layout();
});
В этом случае Masonry выполняет пересчёт только один раз после загрузки всех изображений, что значительно снижает нагрузку на браузер.
При использовании ленивой загрузки изображений важно
запускать обновление Masonry после каждой подгрузки изображения. Для
этого можно привязывать msnry.layout() к событиям
load каждого отдельного изображения:
var lazyImages = document.querySelectorAll('.lazy');
lazyImages.forEach(function(img) {
img.addEventListener('load', function() {
msnry.layout();
});
});
Такой подход обеспечивает корректное расположение элементов независимо от того, когда изображение стало доступно.
imagesLoaded является стандартным инструментом для
отслеживания загрузки изображений и синхронизации с Masonry.appended.layout(), а оптимизация достигается минимизацией частоты
вызова этого метода.Эти методы позволяют поддерживать сетку Masonry визуально стабильной и предотвращают пустые пространства и перекрытия, обеспечивая аккуратное отображение даже при динамической подгрузке изображений.