Masonry — это библиотека JavaScript, предназначенная для создания динамических сеток с переменной высотой элементов. В отличие от стандартных CSS-сеток, где элементы выстраиваются в ровные строки и столбцы, Masonry автоматически размещает блоки в колонках так, чтобы минимизировать вертикальные пробелы. Это обеспечивает эффект “кирпичной кладки”, где элементы естественно подстраиваются под размеры соседей.
Ключевой принцип работы Masonry — подсчет доступного пространства в колонках и распределение элементов по минимальной высоте колонки, что позволяет добиться плотного и визуально гармоничного расположения контента.
Для использования Masonry необходимо подключить библиотеку и выбрать контейнер с элементами. Стандартная инициализация выглядит следующим образом:
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
// Опции Masonry
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true,
gutter: 10
});
Пояснение параметров:
itemSelector — CSS-селектор для элементов сетки,
которые будут позиционироваться.columnWidth — ширина колонки. Может быть задана в
пикселях, процентах или через отдельный элемент-сизер
(.grid-sizer), который задает базовую ширину колонки.percentPosition — использование процентных значений для
ширины колонок.gutter — расстояние между колонками.Правильная HTML-структура важна для корректной работы библиотеки. Пример минимальной разметки:
<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 — контейнер сетки..grid-sizer — невидимый элемент, задающий базовую
ширину колонок..grid-item — отдельные блоки, которые Masonry будет
размещать по колонкам.Библиотека предоставляет ряд методов для управления сеткой после инициализации:
msnry.layout() — перерасчет и перестановка элементов
сетки. Используется после изменения размеров элементов или их
количества.msnry.appended(elements) — добавление новых элементов и
автоматическое их размещение в сетке.msnry.remove(elements) — удаление элементов из сетки с
перерасчетом расположения.msnry.reloadItems() — обновление списка элементов,
особенно актуально при динамическом добавлении или удалении элементов в
DOM.Пример динамического добавления элементов:
var newItem = document.createElement('div');
newItem.classList.add('grid-item');
newItem.textContent = 'Новый элемент';
grid.appendChild(newItem);
msnry.appended(newItem);
Masonry позволяет детально настроить поведение сетки:
true, контейнер сетки
будет подстраиваться под ширину колонок.true элементы
будут размещаться в порядке слева направо, а не только по минимальной
высоте.'0.4s'.var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
gutter: 20,
fitWidth: true,
transitionDuration: '0.5s'
});
Для адаптивных сеток важно использовать процентные значения
ширины колонок или медиазапросы для .grid-sizer и
.grid-item. Это обеспечивает корректное перераспределение
блоков при изменении ширины экрана.
Пример с CSS:
.grid-sizer,
.grid-item {
width: 33.33%; /* 3 колонки по ширине контейнера */
}
@media (max-width: 768px) {
.grid-sizer,
.grid-item {
width: 50%; /* 2 колонки на мобильных устройствах */
}
}
После изменения размеров элементов или контейнера рекомендуется
вызвать msnry.layout() для корректного перераспределения
элементов.
Masonry не учитывает размер изображений по умолчанию, что может
приводить к наложению элементов. Для решения используют библиотеку
imagesLoaded:
imagesLoaded(grid, function() {
msnry.layout();
});
Этот подход гарантирует, что Masonry перестроит сетку только после полной загрузки изображений, сохраняя правильное расположение элементов.
columnWidth и gutter,
чтобы сетка выглядела аккуратно.appended
и remove.transitionDuration.Эти механизмы делают Masonry мощным инструментом для создания визуально привлекательных, динамических и адаптивных сеток, которые могут подстраиваться под содержимое любой высоты.