Библиотека Masonry предназначена для организации элементов на странице в виде сетки с динамическими высотами. Для корректной работы необходимо правильно подключить библиотеку и подготовить структуру HTML и CSS.
Для проектов с использованием Node.js и сборщиков модулей (Webpack, Parcel, Vite) рекомендуется установка через npm:
npm install masonry-layout
После установки библиотеку можно импортировать в JavaScript-файл:
import Masonry from 'masonry-layout';
// Инициализация Masonry
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
Ключевые моменты:
itemSelector — CSS-селектор элементов сетки. Указывает,
какие элементы Masonry будет выравнивать.columnWidth — ширина колонок. Можно указать
элемент-сизер или число в пикселях.percentPosition: true — позволяет использовать
процентные ширины колонок для адаптивной сетки.Для быстрого прототипирования или статических сайтов можно подключить Masonry через CDN. Вставка скрипта в HTML:
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
Инициализация производится после загрузки DOM:
<script>
document.addEventListener('DOMContentLoaded', function() {
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
});
</script>
Для корректного распределения элементов создается базовая структура сетки:
<div class="grid">
<div class="grid-sizer"></div>
<div class="grid-item">Элемент 1</div>
<div class="grid-item">Элемент 2</div>
<div class="grid-item">Элемент 3</div>
</div>
Особенности структуры:
.grid — контейнер, в котором Masonry будет выравнивать
элементы..grid-item — отдельные элементы сетки..grid-sizer — опциональный элемент, используемый для
определения ширины колонок при адаптивной верстке.Для правильного отображения Masonry требует CSS, который задаёт размеры колонок и отступы:
.grid {
display: flex;
margin-left: -10px; /* отрицательный отступ компенсирует margin элементов */
width: auto;
}
.grid-sizer,
.grid-item {
width: 30%; /* ширина одной колонки */
margin-left: 10px;
margin-bottom: 10px;
}
.grid-item {
background-color: #e0e0e0;
border-radius: 4px;
padding: 10px;
box-sizing: border-box;
}
Важные моменты CSS:
position: absolute для
позиционирования элементов. Поэтому родительский контейнер должен иметь
position: relative..grid-sizer нужен для вычисления ширины колонок,
особенно при использовании процентных значений.Если элементы сетки загружаются динамически (например, через AJAX или fetch), Masonry нужно обновлять вручную после добавления новых элементов:
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
// Добавление нового элемента
const newItem = document.createElement('div');
newItem.classList.add('grid-item');
newItem.textContent = 'Новый элемент';
grid.appendChild(newItem);
// Обновление Masonry
msnry.appended(newItem);
Ключевые методы:
msnry.appended(element) — добавляет новый элемент в
сетку с перерасчетом.msnry.layout() — пересчитывает текущую сетку.msnry.reloadItems() — обновляет список элементов, если
структура DOM изменилась.Для сеток с изображениями важно дождаться полной загрузки изображений перед вызовом Masonry, иначе высота элементов будет рассчитана некорректно:
imagesLoaded(grid, function() {
new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
});
Используется библиотека imagesLoaded, которую также можно подключить через npm или CDN:
<script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script>
npm install masonry-layout..grid, элементы
.grid-item и опционально .grid-sizer.imagesLoaded.Правильное подключение и настройка библиотеки обеспечивает стабильную работу сетки с динамическими высотами элементов, адаптивность и корректное перераспределение при добавлении новых блоков.