Библиотека Masonry в JavaScript предназначена для динамической раскладки элементов сетки, обеспечивая плотное и аккуратное распределение карточек разного размера. Для адаптивного дизайна ключевую роль играют breakpoints и media queries, позволяющие изменять поведение сетки в зависимости от ширины экрана.
В Masonry нет встроенной поддержки media queries напрямую, но можно реализовать адаптивность через управление параметрами сетки в зависимости от размеров контейнера. Основные параметры, влияющие на сетку:
columnWidth — ширина колонки сетки.gutter — промежуток между элементами.fitWidth — если true, сетка центрируется в
контейнере.percentPosition — позиционирование элементов в
процентах.Пример использования breakpoints:
let msnry;
function initMasonry() {
const container = document.querySelector('.grid');
const windowWidth = window.innerWidth;
let columnWidth = 200;
let gutter = 20;
if (windowWidth < 768) {
columnWidth = 150;
gutter = 10;
} else if (windowWidth >= 768 && windowWidth < 1200) {
columnWidth = 180;
gutter = 15;
}
msnry = new Masonry(container, {
itemSelector: '.grid-item',
columnWidth: columnWidth,
gutter: gutter,
percentPosition: true
});
}
window.addEventListener('resize', () => {
if (msnry) msnry.destroy();
initMasonry();
});
initMasonry();
В этом примере сетка перестраивается автоматически при изменении ширины окна. Значения breakpoints можно подбирать индивидуально под дизайн проекта.
Для сложных макетов часто требуется не только изменение ширины
колонок, но и перестройка всей сетки. Masonry предоставляет методы
layout() и destroy(), которые позволяют
полностью пересоздать сетку при смене условий.
Использование метода layout():
window.addEventListener('resize', () => {
const windowWidth = window.innerWidth;
if (windowWidth < 768) {
msnry.options.columnWidth = 150;
msnry.options.gutter = 10;
} else if (windowWidth >= 768 && windowWidth < 1200) {
msnry.options.columnWidth = 180;
msnry.options.gutter = 15;
} else {
msnry.options.columnWidth = 200;
msnry.options.gutter = 20;
}
msnry.layout();
});
Метод layout() перестраивает элементы без удаления
существующих объектов сетки, что экономит ресурсы и повышает
производительность при динамическом изменении размеров окна.
Для некоторых случаев удобнее комбинировать Masonry с обычными CSS media queries. Это особенно полезно для изменения внешнего вида элементов, их ширины или отступов, не влияя на JavaScript напрямую.
Пример:
.grid-item {
width: 200px;
margin-bottom: 20px;
}
@media (max-width: 1200px) {
.grid-item {
width: 180px;
margin-bottom: 15px;
}
}
@media (max-width: 768px) {
.grid-item {
width: 150px;
margin-bottom: 10px;
}
}
При таком подходе Masonry автоматически подстраивается под размеры
элементов, если используется percentPosition: true и
columnWidth: '.grid-sizer', где .grid-sizer —
невидимый элемент, задающий базовую ширину колонки.
Grid sizer — специальный элемент, который задаёт размер колонки. Этот метод особенно удобен для адаптивного дизайна.
<div class="grid">
<div class="grid-sizer"></div>
<div class="grid-item">...</div>
<div class="grid-item">...</div>
</div>
const msnry = new Masonry('.grid', {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true,
gutter: 20
});
Теперь ширину колонок можно полностью контролировать через CSS media
queries, меняя размеры .grid-sizer:
.grid-sizer {
width: 200px;
}
@media (max-width: 1200px) {
.grid-sizer {
width: 180px;
}
}
@media (max-width: 768px) {
.grid-sizer {
width: 150px;
}
}
Это позволяет Masonry автоматически перестраивать сетку при изменении
ширины .grid-sizer без необходимости полного пересоздания
сетки в JavaScript.
percentPosition —
особенно полезно при гибкой ширине колонок.destroy() —
пересоздание сетки ресурсоёмко; лучше использовать
layout(), когда это возможно.Адаптивное управление Masonry через breakpoints и media queries обеспечивает плавное и стабильное распределение элементов сетки на любых устройствах, сочетая преимущества CSS и гибкость JavaScript.