Библиотека Masonry предназначена для организации элементов на веб-странице в сетку с динамическим расположением, напоминающую «кирпичную кладку». Она идеально подходит для галерей изображений, карточек товаров или любых блоков переменной высоты. Основная идея заключается в том, чтобы элементы выравнивались по вертикали, минимизируя пустое пространство.
Для начала работы с Masonry необходимо подключить библиотеку через npm или CDN:
import Masonry from 'masonry-layout';
// или через CDN
// <script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
После подключения можно создать объект Masonry для контейнера с элементами:
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10,
fitWidth: true
});
Пояснение параметров:
itemSelector — CSS-селектор для элементов, которые
нужно расположить в сетке.columnWidth — ширина одной колонки. Может быть числом в
пикселях или селектором элемента.gutter — расстояние между элементами сетки.fitWidth — если true, ширина контейнера
подгоняется под ширину колонок.Masonry предоставляет множество методов для динамического управления сеткой:
layout() — пересчитывает расположение элементов.
Полезно после динамического добавления или изменения размеров
блоков.reloadItems() — обновляет список элементов сетки.appended(elements) — добавляет новые элементы и
автоматически размещает их.remove(elements) — удаляет элементы из сетки и
перестраивает расположение.Пример динамического добавления элементов:
const newItems = document.createElement('div');
newItems.classList.add('grid-item');
grid.appendChild(newItems);
msnry.appended(newItems);
msnry.layout();
Для корректной работы Masonry с изображениями важно убедиться, что
все изображения загружены перед вызовом layout(). Для этого
используют библиотеку imagesLoaded:
import imagesLoaded from 'imagesloaded';
imagesLoaded(grid, () => {
msnry.layout();
});
Без этого вызова блоки могут накладываться друг на друга, так как Masonry рассчитывает расположение на основе текущих размеров элементов.
Для создания адаптивной сетки можно использовать процентные значения или медиазапросы:
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
Элемент с классом .grid-sizer задаёт базовую ширину
колонки в процентах. Masonry автоматически распределяет блоки по
колонкам с учётом размеров контейнера.
Masonry генерирует события, которые позволяют отслеживать изменения сетки:
layoutComplete — вызывается после завершения
перестановки элементов.removeComplete — после удаления элементов.appendComplete — после добавления новых элементов.Пример использования события:
msnry.on('layoutComplete', () => {
console.log('Сетка обновлена');
});
Masonry хорошо работает с контентом, загружаемым через AJAX. После добавления новых элементов необходимо:
appended().imagesLoaded().fetch('/api/photos')
.then(response => response.json())
.then(data => {
const fragment = document.createDocumentFragment();
data.forEach(item => {
const div = document.createElement('div');
div.classList.add('grid-item');
div.innerHTML = `<img src="${item.url}" />`;
fragment.appendChild(div);
});
grid.appendChild(fragment);
imagesLoaded(grid, () => {
msnry.appended(fragment.children);
msnry.layout();
});
});
columnWidth и
percentPosition снижает количество пересчётов при
изменении размеров окна.layout()
уменьшает нагрузку на браузер.Для корректной работы Masonry важно учитывать:
display: block или inline-block для
элементов сетки.columnWidth.gutter в Masonry, а не только
через CSS, чтобы избежать конфликтов.Masonry обеспечивает гибкое, динамичное и визуально аккуратное расположение элементов любой сложности, минимизируя пустое пространство и упрощая управление сеткой.