Адаптивные стили

Packery — это библиотека для динамического и адаптивного позиционирования элементов на странице. В основе её работы лежит алгоритм размещения, похожий на “masonry”, но с поддержкой более сложной сетки и возможности перетаскивания элементов. Адаптивные стили обеспечиваются за счёт сочетания CSS и конфигурации Packery, что позволяет автоматически перестраивать сетку при изменении размеров окна или контейнера.

Настройка контейнера и элементов

Для корректной работы адаптивной сетки важно правильно настроить контейнер и элементы:

<div id="grid">
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>
</div>
#grid {
  width: 100%;
  margin: 0 auto;
}

.grid-item {
  width: 200px;
  height: 150px;
  margin: 10px;
  background-color: #ccc;
}

Здесь ключевые моменты:

  • width: 100% для контейнера обеспечивает гибкость сетки.
  • Фиксированная ширина элементов (width: 200px) может быть заменена на процентное значение или использоваться через медиазапросы для адаптации под разные устройства.
  • margin обеспечивает пространство между элементами, которое учитывается алгоритмом Packery при расстановке.

Инициализация Packery с адаптивными настройками

Инициализация библиотеки требует передачи объекта конфигурации:

var grid = document.querySelector('#grid');
var pckry = new Packery(grid, {
  itemSelector: '.grid-item',
  gutter: 10,
  percentPosition: true
});

Ключевые параметры:

  • itemSelector — CSS-селектор для элементов сетки.
  • gutter — расстояние между элементами.
  • percentPosition: true — позволяет использовать проценты для ширины элементов, что критично для адаптивной сетки.

Использование медиазапросов для адаптивности

Packery хорошо сочетается с CSS-медиазапросами. Пример изменения ширины элементов в зависимости от ширины экрана:

@media (max-width: 1200px) {
  .grid-item {
    width: 30%;
  }
}

@media (max-width: 768px) {
  .grid-item {
    width: 45%;
  }
}

@media (max-width: 480px) {
  .grid-item {
    width: 100%;
  }
}

Особенности:

  • Ширина элементов меняется динамически, а Packery перестраивает сетку автоматически.
  • Использование percentPosition: true позволяет сохранять корректное позиционирование при любом изменении размеров.

Перестройка сетки при изменении размеров окна

Для полной адаптивности нужно уведомлять Packery об изменении размеров:

window.addEventListener('resize', function() {
  pckry.layout();
});

Важно: вызов layout() после изменения размеров гарантирует, что элементы будут корректно расставлены в новом пространстве.

Работа с элементами разной высоты и ширины

Packery поддерживает элементы с разной шириной и высотой, что часто встречается в адаптивных макетах. Для этого можно использовать классы с разными размерами:

<div class="grid-item grid-item--large"></div>
<div class="grid-item grid-item--small"></div>
.grid-item--large {
  width: 400px;
  height: 300px;
}

.grid-item--small {
  width: 200px;
  height: 150px;
}

Библиотека корректно расставляет элементы, заполняя свободное пространство и избегая пустот.

Динамическое добавление и удаление элементов

Для адаптивных интерфейсов часто требуется динамически добавлять или удалять элементы:

var newItem = document.createElement('div');
newItem.className = 'grid-item';
grid.appendChild(newItem);
pckry.appended(newItem);
pckry.layout();

Принцип работы:

  • appendChild добавляет элемент в DOM.
  • pckry.appended уведомляет Packery о новом элементе.
  • pckry.layout пересчитывает сетку, учитывая новые размеры.

Интеграция с перетаскиванием элементов

Packery может работать совместно с библиотекой Draggabilly для поддержки drag-and-drop. Это особенно полезно для адаптивных интерфейсов:

var draggableElems = grid.querySelectorAll('.grid-item');
draggableElems.forEach(function(elem) {
  var draggie = new Draggabilly(elem);
  pckry.bindDraggabillyEvents(draggie);
});

Преимущества:

  • Элементы можно переставлять вручную.
  • Packery автоматически перестраивает сетку после перемещения элементов.
  • Поддержка адаптивности сохраняется, даже если размеры контейнера изменяются динамически.

Оптимизация адаптивной сетки

  1. Использование percentPosition вместо фиксированных пикселей для ширины.
  2. Настройка gutter через медиазапросы для более комфортного отображения на мобильных устройствах.
  3. Минимизация количества элементов с очень большой высотой, чтобы избежать сильного смещения сетки.
  4. Вызов layout() после любых изменений размеров или добавления элементов.

Адаптивные стили в Packery обеспечивают гибкую и динамичную сетку, которая автоматически подстраивается под размеры окна и размеры элементов, позволяя создавать сложные, но при этом эстетично расположенные макеты на любой ширине экрана.