Режим masonry — один из ключевых режимов компоновки в библиотеке Isotope, предназначенный для создания динамической сетки элементов, которые размещаются вертикально без фиксированных строк. Элементы выстраиваются в столбцы и заполняют свободное пространство по принципу «каменной кладки», благодаря чему между блоками практически не остаётся пустых промежутков.
Такой способ размещения широко применяется в галереях изображений, карточках товаров, портфолио и новостных лентах, где элементы могут иметь различную высоту.
Классическая CSS-сетка предполагает строгую структуру строк и колонок. Каждый элемент занимает определённую ячейку, и высота строки определяется самым высоким элементом.
Masonry работает иначе:
В результате образуется плотная сетка без лишнего вертикального пространства.
Схематично структура выглядит следующим образом:
| 1 | 2 | 3 |
| 4 | | 5 |
| | 6 | |
| 7 | | 8 |
Элементы разной высоты автоматически распределяются между колонками.
Masonry является режимом компоновки, который активируется через параметр layoutMode.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry'
});
| Параметр | Назначение |
|---|---|
| itemSelector | селектор элементов сетки |
| layoutMode | режим компоновки |
| masonry | объект с настройками Masonry |
Контейнер содержит элементы сетки, которые будут автоматически размещаться.
<div class="grid">
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item grid-item--tall"></div>
<div class="grid-item"></div>
<div class="grid-item grid-item--wide"></div>
</div>
Высота элементов может отличаться. Именно это создаёт характерную «неровную» сетку.
.grid-item {
width: 200px;
height: 150px;
}
.grid-item--tall {
height: 300px;
}
.grid-item--wide {
width: 400px;
}
Настройки режима задаются внутри объекта masonry.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
masonry: {
columnWidth: 200,
gutter: 10
}
});
Определяет ширину колонок.
masonry: {
columnWidth: 200
}
Если ширина элементов равна ширине колонок, сетка получается аккуратной и предсказуемой.
Отступ между элементами.
masonry: {
columnWidth: 200,
gutter: 10
}
Фактически создаётся пространство между карточками.
Позволяет использовать процентные размеры вместо фиксированных значений.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
percentPosition: true,
masonry: {
columnWidth: '.grid-sizer'
}
});
При адаптивной верстке удобнее задавать ширину колонок через специальный элемент.
<div class="grid">
<div class="grid-sizer"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
.grid-sizer,
.grid-item {
width: 25%;
}
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
percentPosition: true,
masonry: {
columnWidth: '.grid-sizer'
}
});
Этот подход облегчает создание адаптивной сетки.
Masonry поддерживает элементы, занимающие несколько колонок.
.grid-item {
width: 25%;
}
.grid-item--width2 {
width: 50%;
}
<div class="grid-item grid-item--width2"></div>
Isotope автоматически учитывает ширину элемента и корректно размещает его в сетке.
По умолчанию элементы располагаются слева. Можно изменить выравнивание через CSS.
.grid {
margin: 0 auto;
}
Также можно использовать центрирование контейнера или flex-контекст.
Masonry корректно работает при добавлении новых элементов.
var newItems = document.createElement('div');
newItems.className = 'grid-item';
grid.appendChild(newItems);
iso.appended(newItems);
После добавления Isotope пересчитает расположение элементов.
Иногда требуется пересчитать расположение элементов, например после загрузки изображений.
iso.layout();
Если элементы содержат изображения, их высота может измениться после загрузки. Для предотвращения ошибок используется библиотека imagesLoaded.
imagesLoaded('.grid', function() {
iso.layout();
});
Это гарантирует корректный расчет высоты элементов.
Masonry часто используется вместе с фильтрами.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry'
});
document.querySelector('.filter-button').addEventListener('click', function() {
iso.arrange({
filter: '.category-a'
});
});
После фильтрации сетка автоматически перестраивается.
Isotope плавно анимирует перемещение элементов.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
transitionDuration: '0.4s'
});
Элементы перемещаются к новым позициям без резких скачков.
Masonry учитывает порядок элементов в DOM. Однако можно использовать сортировку.
iso.arrange({
sortBy: 'name'
});
При изменении порядка Masonry пересчитает расположение элементов.
При большом количестве элементов важно учитывать оптимизацию:
Рекомендуемые практики:
Также полезно отключать анимацию при массовых обновлениях.
transitionDuration: 0
Сетка Masonry хорошо работает с медиазапросами.
.grid-item {
width: 25%;
}
@media (max-width: 900px) {
.grid-item {
width: 33.333%;
}
}
@media (max-width: 600px) {
.grid-item {
width: 50%;
}
}
Isotope автоматически пересчитает сетку после изменения размеров контейнера.
Алгоритм Masonry можно описать следующими шагами:
Упрощённый псевдокод:
columns = [0,0,0,0]
for item in items:
column = min(columns)
place(item, column)
columns[column] += item.height
Такой подход обеспечивает максимально плотное заполнение пространства.
| Режим | Особенности |
|---|---|
| masonry | вертикальная плотная сетка |
| fitRows | классическая сетка строк |
| vertical | вертикальный список |
| packery | более сложная упаковка элементов |
Masonry подходит для большинства галерей и карточных интерфейсов.
Режим Masonry часто используется в следующих интерфейсах:
Гибкость алгоритма позволяет работать с элементами произвольной высоты и ширины, формируя визуально плотные и аккуратные интерфейсы.