Media queries и breakpoints

Библиотека Masonry в JavaScript предназначена для динамической раскладки элементов сетки, обеспечивая плотное и аккуратное распределение карточек разного размера. Для адаптивного дизайна ключевую роль играют breakpoints и media queries, позволяющие изменять поведение сетки в зависимости от ширины экрана.


Настройка сетки с помощью breakpoints

В 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() перестраивает элементы без удаления существующих объектов сетки, что экономит ресурсы и повышает производительность при динамическом изменении размеров окна.


Интеграция CSS Media Queries

Для некоторых случаев удобнее комбинировать 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 для адаптивности

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.


Практические рекомендации

  1. Использовать percentPosition — особенно полезно при гибкой ширине колонок.
  2. Комбинировать JavaScript и CSS — CSS media queries изменяют ширину элементов, JS Masonry подстраивает расположение.
  3. Не злоупотреблять destroy() — пересоздание сетки ресурсоёмко; лучше использовать layout(), когда это возможно.
  4. Тестировать на разных экранах — адаптивность зависит от точного выбора breakpoints.
  5. Grid sizer делает код более чистым и удобным для поддержки.

Адаптивное управление Masonry через breakpoints и media queries обеспечивает плавное и стабильное распределение элементов сетки на любых устройствах, сочетая преимущества CSS и гибкость JavaScript.