Masonry — это библиотека JavaScript, предназначенная для создания динамических сеток с плавающими блоками, часто называемыми Pinterest-подобными layout’ами. Главная особенность Masonry — автоматическое позиционирование элементов в колонках с минимальными промежутками, что обеспечивает аккуратное распределение блоков различной высоты и ширины без необходимости использовать фиксированные размеры.
Библиотека работает по принципу “гравитации”: каждый элемент опускается в самую свободную вертикальную область контейнера. Это позволяет избежать пустых промежутков и сделать сетку визуально плотной.
Для использования Masonry доступно несколько способов:
npm install masonry-layout
<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 поддерживает добавление и удаление элементов после инициализации. Это важно для динамического контента, подгружаемого через AJAX.
Добавление элементов:
const newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.textContent = 'Новый блок';
grid.appendChild(newItem);
msnry.appended(newItem);
Удаление элементов:
msnry.remove(newItem);
msnry.layout();
layout() перераспределяет оставшиеся элементы после
удаления или изменения размеров блоков.
Masonry часто используется для сеток с изображениями, но важно учитывать, что библиотека позиционирует элементы сразу, а размеры изображений могут подгружаться с задержкой. Для корректного расчёта рекомендуется использовать библиотеку imagesLoaded:
imagesLoaded(grid, function() {
msnry.layout();
});
imagesLoaded гарантирует, что Masonry выполнит расчёт
расположения после полной загрузки изображений, предотвращая «прыгающую»
сетку.
Для адаптивного дизайна Masonry позволяет комбинировать CSS и JavaScript. Ширина колонок может быть задана в процентах через CSS:
.grid-item {
width: 30%;
}
В JavaScript указываем:
columnWidth: '.grid-item',
percentPosition: true
percentPosition: true позволяет Masonry корректно
рассчитывать позицию элементов в процентах, обеспечивая плавное
масштабирование при изменении ширины окна браузера.
Библиотека предоставляет систему событий для отслеживания жизненного цикла сетки:
layoutComplete — вызывается после завершения
перестановки всех элементов.removeComplete — после удаления элементов.appendComplete — после добавления новых блоков.Пример подписки на событие:
msnry.on('layoutComplete', function(items) {
console.log('Перераспределение завершено', items);
});
msnry.stagger = 30; // задержка в миллисекундах
originLeft: false // колонки идут справа налево
Использование percentPosition с
fitWidth позволяет создавать центрированные и
полностью адаптивные сетки.
Смешивание Masonry с другими библиотеками:
Masonry совместим с Infinite Scroll для подгрузки блоков по
мере прокрутки и с Isotope для фильтрации и сортировки
элементов.
requestAnimationFrame при анимации
добавления элементов для плавной работы.width и
height) для ускорения initial layout.<div class="grid">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
</div>
<script>
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-item',
gutter: 20,
percentPosition: true,
fitWidth: true
});
imagesLoaded(grid, function() {
msnry.layout();
});
</script>
В этом примере сетка автоматически адаптируется под ширину окна, элементы выстраиваются в колонки, а появление новых блоков не нарушает существующую структуру.
Masonry предоставляет гибкий и надёжный способ создавать Pinterest-подобные сетки с минимальными усилиями, поддерживая динамический контент, адаптивность и анимацию без сложных вычислений вручную.