Библиотека Masonry предназначена для динамического расположения элементов сетки в стиле «кирпичной кладки». Она автоматически выравнивает блоки по колонкам, минимизируя вертикальные промежутки между ними, что позволяет создавать эстетичные и гибкие сетки для контента различной высоты. Ключевым аспектом является позиционирование элементов с помощью абсолютных координат, при этом Masonry управляет размерами контейнера, чтобы сохранить корректное отображение всего контента.
Основные параметры, влияющие на работу Masonry:
true,
Masonry центрирует сетку в контейнере с фиксированной шириной.const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10,
fitWidth: true
});
Masonry особенно эффективна в сочетании с динамическим контентом. При
добавлении новых элементов важно вызвать метод appended()
или layout(), чтобы Masonry пересчитала позиции всех
блоков:
const newItems = document.querySelectorAll('.grid-item-new');
grid.append(...newItems);
msnry.appended(newItems);
msnry.layout();
Метод appended() уведомляет Masonry о новых элементах, а
layout() гарантирует пересчёт всех позиций. При частых
обновлениях контента рекомендуется объединять эти вызовы, чтобы избежать
мерцания и лишних перерасчётов.
Поскольку Masonry рассчитывает позиции элементов исходя из их
размеров, загрузка изображений влияет на корректность
расположения блоков. Для устранения смещения рекомендуется
использовать плагин imagesLoaded:
imagesLoaded(grid, function() {
msnry.layout();
});
imagesLoaded позволяет дождаться полной загрузки
изображений в сетке перед финальным позиционированием. Без этого часто
возникает ситуация, когда блоки накладываются друг на друга или
появляются большие вертикальные промежутки.
Пример удаления элемента:
const itemToRemove = document.querySelector('.grid-item-remove');
msnry.remove(itemToRemove);
msnry.layout();
Masonry поддерживает CSS-анимацию через свойства
transition. Для плавного перемещения элементов можно
использовать следующий стиль:
.grid-item {
transition: transform 0.4s ease;
}
При вызове layout() блоки будут плавно перемещаться на
новые позиции. Комбинация Masonry с CSS-переходами позволяет создавать
визуально привлекательные эффекты без использования дополнительных
библиотек.
При работе с Masonry важно учитывать производительность, особенно при большом количестве элементов:
layout() — использовать
appended() для добавления групп элементов.columnWidth, чтобы Masonry не пересчитывала размеры
динамически для каждого элемента.Masonry легко интегрируется с:
Корректная интеграция предполагает вызов layout() после
любого изменения DOM, чтобы Masonry могла пересчитать позиции
блоков.
<div class="grid">
<div class="grid-item"><img src="img1.jpg" alt=""></div>
<div class="grid-item"><img src="img2.jpg" alt=""></div>
<div class="grid-item"><img src="img3.jpg" alt=""></div>
</div>
<script>
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
gutter: 20,
percentPosition: true
});
imagesLoaded(grid, function() {
msnry.layout();
});
</script>
В этом примере используется динамическая ширина колонок через
.grid-sizer, что позволяет Masonry автоматически
подстраивать сетку под размеры контейнера, обеспечивая адаптивность для
различных разрешений экрана.