Masonry — это мощная библиотека для построения сеток с динамической компоновкой элементов. Одной из ключевых особенностей, с которой приходится работать на практике, является обновление расположения элементов после того, как их размеры изменились динамически. Это важно для поддержания визуальной согласованности и предотвращения наложений.
layout()Метод layout() используется для перерасчета и
перестроения сетки Masonry. Он перебирает все элементы контейнера и
пересчитывает их положение с учетом текущих размеров.
const msnry = new Masonry('.grid', {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
// Обновление расположения после изменения размеров
msnry.layout();
Особенности метода layout():
layoutComplete, которое может быть
использовано для дальнейших действий после перестройки.layoutCompleteMasonry предоставляет событие layoutComplete, которое
срабатывает после завершения перестройки сетки. Это полезно для
синхронизации анимаций или других действий после обновления.
msnry.on('layoutComplete', function(items) {
console.log('Сетка обновлена, элементов: ', items.length);
});
items — это массив элементов, которые были
перераспределены. Использование этого события позволяет точно
реагировать на окончание перерасчета.
Для динамически изменяющихся элементов, особенно при асинхронной
загрузке изображений или изменения контента, Masonry не всегда
автоматически узнает о новых размерах. Для этого используется метод
reloadItems().
// Перезагрузка элементов и обновление сетки
msnry.reloadItems();
msnry.layout();
Пояснения:
reloadItems() считывает все текущие элементы контейнера
заново.layout() перераспределяет элементы с учетом
новых размеров.imagesLoaded для динамического контентаЧасто размеры элементов зависят от загрузки изображений. В таких
случаях рекомендуется сочетать Masonry с библиотекой imagesLoaded:
imagesLoaded('.grid', function() {
msnry.layout();
});
Это гарантирует, что перестройка сетки произойдет только после полной загрузки всех изображений, предотвращая наложения и некорректное позиционирование.
Если внутри элемента сетки меняется высота, например текст увеличивается или уменьшается, можно воспользоваться следующим подходом:
const element = document.querySelector('.grid-item');
// После изменения высоты
element.style.height = '200px';
msnry.layout();
Для множества элементов, размер которых изменяется одновременно:
const elements = document.querySelectorAll('.grid-item');
elements.forEach(el => el.style.height = Math.random() * 200 + 100 + 'px');
msnry.layout();
Такой подход позволяет Masonry корректно перераспределять все элементы в сетке без наложений.
Если изменяется ширина контейнера (например, при изменении размера
окна), Masonry пересчитывает положение элементов с помощью
layout(). Для динамического реагирования можно использовать
обработчик события resize:
window.addEventListener('resize', () => {
msnry.layout();
});
Если требуется частое изменение размеров элементов, оптимально
сочетать это с requestAnimationFrame для минимизации
нагрузки на браузер:
function updateLayout() {
msnry.layout();
requestAnimationFrame(updateLayout);
}
requestAnimationFrame(updateLayout);
layout() после изменения
размеров — это основной способ обновления сетки.reloadItems() перед вызовом
layout().imagesLoaded или аналогичные события, чтобы
избежать сбоев компоновки.resize или кастомные
события изменения контента.layoutComplete полезно для
синхронизации с другими скриптами или запуском анимаций.Эти методы обеспечивают корректное и стабильное обновление сетки Masonry при любых изменениях размеров элементов и позволяют создавать адаптивные, динамичные интерфейсы.