Библиотека Masonry представляет собой инструмент для построения сеток с нестандартной компоновкой элементов, позволяющий реализовать эффект “кирпичной кладки”. Элементы автоматически располагаются по вертикали с минимальными промежутками, что особенно удобно для динамических галерей изображений, карточек товаров или контента различной высоты.
Для создания сетки необходимо выбрать контейнер и вызвать конструктор
Masonry:
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
gutter: 20,
percentPosition: true
});
Ключевые параметры:
itemSelector — CSS-селектор элементов сетки. Masonry
использует их для расчёта расположения.columnWidth — ширина колонки. Может быть числом в
пикселях или элементом сетки, задающим базовую ширину.gutter — промежуток между элементами. Может быть числом
(пиксели) или CSS-значением.percentPosition — использование процентов для расчёта
позиций, полезно для адаптивных сеток.Для добавления новых элементов после инициализации используется метод
appended:
const newItems = document.querySelectorAll('.new-grid-item');
msnry.appended(newItems);
msnry.layout();
appended — добавляет элементы в сетку.layout — перерасчитывает расположение элементов после
изменений.При удалении элементов применяется метод remove:
const itemToRemove = document.querySelector('.grid-item-remove');
msnry.remove(itemToRemove);
msnry.layout();
Masonry корректно работает только после того, как размеры всех элементов известны. Для изображений рекомендуется использовать библиотеку imagesLoaded:
imagesLoaded(grid, function() {
msnry.layout();
});
Это предотвращает перескакивание элементов при загрузке картинок и обеспечивает ровную структуру сетки.
Использование процентов и динамических размеров колонок позволяет создавать адаптивные сетки:
.grid-sizer { width: 25%; }
.grid-item { width: 25%; }
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true,
gutter: 10
});
.grid-sizer задаёт базовую ширину колонки.percentPosition: true гарантирует корректное
перераспределение элементов при изменении ширины окна.Для плавного появления элементов используется CSS-переход:
.grid-item {
transition: transform 0.4s, opacity 0.4s;
}
Masonry управляет свойством transform, поэтому анимация
выглядит естественно при добавлении или перестановке элементов.
Masonry учитывает высоту элементов при размещении. Для элементов с переменной высотой можно задавать классы и стили:
<div class="grid-item grid-item--wide"></div>
<div class="grid-item grid-item--tall"></div>
.grid-item--wide { width: 50%; }
.grid-item--tall { height: 400px; }
Masonry автоматически подстроит позиции соседних элементов, создавая “кирпичную” компоновку.
layout() — перерасчёт расположения всех элементов.reloadItems() — пересчитывает элементы, например, после
изменения содержимого.remove(element) — удаление элемента из сетки.appended(elements) — добавление новых элементов.on(eventName, callback) — подписка на события, такие
как layoutComplete или removeComplete.Пример подписки на событие:
msnry.on('layoutComplete', function() {
console.log('Сетка перестроена');
});
Masonry хорошо сочетается с инструментами анимации
(GSAP, Anime.js) и фреймворками
(React, Vue). В React, например, рекомендуется
использовать useEffect для инициализации Masonry после
рендера компонентов, а методы appended и
remove применять при изменении списка элементов.
percentPosition и
columnWidth в процентах.reloadItems() при изменении размеров элементов или
добавлении новых.layoutComplete и другие события для корректной
синхронизации с анимациями или взаимодействиями пользователя.layout() только
после добавления нескольких элементов.imagesLoaded для корректного расчёта
позиций изображений..grid-sizer элемент.Masonry обеспечивает гибкость и контроль над сложными сетками, позволяя создавать визуально привлекательные и динамичные интерфейсы без необходимости вручную рассчитывать позиции каждого элемента.