Библиотека Masonry предназначена для организации элементов на странице в виде динамической, «кирпичной» сетки, где каждый элемент занимает оптимальное место без пустых промежутков. В отличие от стандартных CSS-сеток, Masonry управляет позиционированием элементов через JavaScript, позволяя создавать адаптивные сетки, которые автоматически перестраиваются при изменении ширины контейнера или размеров элементов.
Ключевое преимущество Masonry заключается в том, что элементы могут иметь разную высоту, а библиотека будет корректно выравнивать их по колонкам, минимизируя пустое пространство.
Для корректной работы адаптивной сетки необходимо определить:
Пример HTML:
<div class="grid">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
</div>
Каждый элемент .grid-item может иметь разную
высоту, что делает сетку динамичной.
Для создания адаптивной сетки используется объект Masonry с набором параметров. Пример:
const grid = document.querySelector('.grid');
const masonry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-item',
percentPosition: true,
gutter: 10
});
Разбор параметров:
itemSelector – CSS-селектор элементов, которые Masonry
будет располагать.columnWidth – ширина колонки. Можно указать конкретное
значение в пикселях или использовать селектор одного из элементов для
автоматической подгонки.percentPosition: true – позволяет использовать
процентные значения для ширины колонок, что важно для адаптивности.gutter – расстояние между колонками в пикселях.Для корректного поведения сетки на разных устройствах рекомендуется использовать процентные ширины элементов или CSS-сетки с медиа-запросами:
.grid-item {
width: 30%;
margin-bottom: 10px;
}
@media (max-width: 768px) {
.grid-item {
width: 48%;
}
}
@media (max-width: 480px) {
.grid-item {
width: 100%;
}
}
Использование процентов вместо фиксированных значений позволяет Masonry автоматически подстраивать количество колонок в зависимости от ширины контейнера.
Для адаптивной сетки важно, чтобы Masonry перестраивал
элементы при изменении размера окна. Это можно реализовать
через событие resize:
window.addEventListener('resize', () => {
masonry.layout();
});
Метод .layout() пересчитывает позиции элементов в
соответствии с новой шириной контейнера, сохраняя аккуратное
выравнивание.
Masonry позволяет работать с элементами, добавляемыми на страницу
после инициализации. Для этого используются методы appended
и remove.
const newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.textContent = 'Новый элемент';
grid.appendChild(newItem);
masonry.appended(newItem);
Удаление элементов:
const itemToRemove = grid.querySelector('.grid-item');
masonry.remove(itemToRemove);
masonry.layout();
Такой подход обеспечивает динамическое изменение содержимого сетки без нарушения выравнивания.
Для больших сеток важно:
DocumentFragment) при массовом добавлении элементов, чтобы
снизить количество перерасчетов.imagesLoaded, чтобы Masonry рассчитывал позиции
после полной загрузки контента:imagesLoaded(grid, () => {
masonry.layout();
});
layout() при изменении размеров
окна через дебаунс:let resizeTimeout;
window.addEventListener('resize', () => {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(() => masonry.layout(), 200);
});
Masonry совместим с React, Vue, Angular через официальные обёртки или нативные вызовы. Основные принципы остаются:
.layout() при
изменении размеров контейнера.gutter.imagesLoaded, чтобы Masonry корректно рассчитывал
позиции.appended,
remove и layout.resize.Эти правила позволяют создавать стабильные, динамичные и полностью адаптивные сетки любой сложности, сохраняя минимальное пустое пространство между элементами и аккуратное визуальное расположение.