Библиотека Masonry предоставляет возможность динамически размещать элементы сетки так, чтобы пространство использовалось максимально эффективно. Одним из ключевых аспектов работы с Masonry является обработка изменения размеров контейнера и элементов сетки. Без корректной настройки поведение сетки при изменении размеров может быть непредсказуемым.
Masonry не отслеживает автоматически изменение размеров элементов,
если только не используется встроенная опция
resize: true.
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10,
resize: true
});
resize: true — позволяет Masonry
автоматически вызывать пересчет макета при изменении размеров окна
браузера.Masonry использует событие window.resize для
отслеживания изменения ширины контейнера. При каждом вызове
происходит:
columnWidth и ширины контейнера.gutter.Иногда элементы сетки изменяются динамически (например, при загрузке
изображений или изменении контента). В таких случаях автоматическое
отслеживание resize может не сработать, и требуется ручной вызов
метода layout():
msnry.layout();
layout() пересчитывает позиции всех элементов без
удаления или добавления новых.imagesLoaded.imagesLoaded(grid, function() {
msnry.layout();
});
Для больших сеток постоянный пересчет при каждом событии
resize может снижать производительность. Рекомендуется
использовать debounce, чтобы ограничить частоту вызовов
layout():
function debounce(fn, delay) {
let timeout;
return function() {
clearTimeout(timeout);
timeout = setTimeout(() => fn.apply(this, arguments), delay);
};
}
window.addEventListener('resize', debounce(function() {
msnry.layout();
}, 200));
delay) подбирается в зависимости от
требований к отзывчивости сетки.Если элементы сетки могут изменять свои размеры динамически (например, текстовый блок увеличился по высоте), Masonry не отслеживает эти изменения автоматически. В этом случае нужно:
msnry.elementSize() — в новых версиях
Masonry это реализуется через пересчет ширины и высоты контейнера
элемента.layout() для
перераспределения:var item = document.querySelector('.grid-item');
item.style.height = '300px'; // динамическое изменение
msnry.layout();
columnWidth для адаптивных сетокДля корректной работы при изменении размеров окна важно грамотно
задать columnWidth:
columnWidth для адаптивного расчета:var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
gutter: 10,
percentPosition: true
});
.grid-sizer служит эталонной шириной колонки.percentPosition: true позволяет Masonry использовать
проценты вместо пикселей, что улучшает адаптивность.Изменение размеров изображений после загрузки — частая причина неправильного позиционирования элементов. Для корректного пересчета используют библиотеку imagesLoaded:
imagesLoaded(grid, function() {
msnry.layout();
});
resize: true обеспечивает базовый
автоматический пересчет при изменении окна.layout().resize.columnWidth и
percentPosition.Эти инструменты позволяют Masonry оставаться гибкой и отзывчивой, корректно перераспределяя элементы при любых изменениях размеров окна и содержимого.