Когда использовать Packery

Packery — это библиотека для построения динамических сеток с возможностью свободного позиционирования элементов. В отличие от традиционных CSS-сеток (flexbox, grid), Packery позволяет располагать блоки так, чтобы минимизировать пустое пространство между ними, создавая «мозаичный» эффект. Каждый элемент в сетке может иметь разные размеры, и библиотека автоматически вычисляет оптимальное положение для каждого блока.

Ключевой механизм Packery основан на алгоритме упаковки, который проверяет доступные позиции и выбирает наиболее компактное размещение. Это делает библиотеку особенно полезной для интерфейсов с переменной высотой элементов или для визуальных галерей.

Основные сценарии использования

  1. Мозаичные галереи Для изображений или карточек товаров с разной высотой или шириной Packery автоматически подбирает оптимальное расположение, избегая больших пустот. Такой подход идеально подходит для портфолио, фотогалерей или сайтов электронной коммерции с визуальными карточками.

  2. Дашборды и панели инструментов Packery позволяет динамически изменять положение виджетов на панели, сохраняя компактность интерфейса. Элементы можно перетаскивать, и библиотека будет корректно перераспределять оставшиеся блоки.

  3. Интерактивные интерфейсы с drag-and-drop Поддержка совместимости с библиотекой Draggabilly или встроенной функциональностью Packery делает возможным перетаскивание элементов внутри сетки. Это позволяет создавать гибкие интерфейсы, где пользователи могут менять порядок блоков, а библиотека автоматически подстраивает соседние элементы.

  4. Контент с переменной высотой Если блоки имеют динамический контент (например, текст разной длины), Packery предотвращает появление пустых пространств и поддерживает равномерное распределение элементов.

Настройка и параметры

Packery предоставляет набор конфигурационных опций, позволяющих адаптировать сетку под конкретные задачи:

  • itemSelector — CSS-селектор элементов сетки. Обязательный параметр, определяет, какие элементы будут участвовать в упаковке.
  • gutter — задает промежуток между элементами. Можно использовать как числовое значение в пикселях, так и строку с CSS-единицами.
  • percentPosition — булевое значение, указывающее, использовать ли процентные координаты. Полезно для адаптивного дизайна.
  • stamp — элементы, которые будут «запечатываться» на месте и не будут сдвигаться другими блоками.
  • originLeft и originTop — определяют направление упаковки (слева направо, сверху вниз).
  • transitionDuration — время анимации перемещения элементов.

Пример инициализации:

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

Динамическое управление элементами

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

  • appended(items) — добавляет новые элементы в сетку и автоматически размещает их.
  • remove(items) — удаляет элементы и перераспределяет оставшиеся блоки.
  • layout() — пересчитывает позиции элементов, например после изменения размеров или добавления контента.
  • stamp(items) и unstamp(items) — управляют фиксированными элементами, которые не должны сдвигаться.

Пример добавления нового блока:

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

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

Совместная работа Packery и Draggabilly позволяет создавать интерактивные сетки. Для этого создаются draggable-элементы, после чего Packery автоматически переставляет соседние блоки при перетаскивании:

var draggies = [];
var items = grid.querySelectorAll('.grid-item');
items.forEach(function(item) {
  var draggie = new Draggabilly(item);
  pckry.bindDraggabillyEvents(draggie);
  draggies.push(draggie);
});

Преимущество такого подхода заключается в сохранении компактного расположения элементов и плавной анимации перемещений.

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

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

  • использовать transitionDuration для плавных, но не ресурсоемких анимаций;
  • предварительно задавать размеры элементов для уменьшения перерасчета;
  • использовать imagesLoaded для корректного расчета сетки при загрузке изображений.

Пример использования imagesLoaded:

imagesLoaded(grid, function() {
  pckry.layout();
});

Особенности адаптивного дизайна

Packery поддерживает адаптивные сетки, если использовать процентные координаты и динамическое пересчитывание layout при изменении ширины контейнера:

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

Это позволяет создавать гибкие интерфейсы, где элементы плавно перестраиваются при изменении размеров окна, сохраняя мозаичный вид без пустых областей.

Отличия от аналогов

В отличие от Masonry, Packery:

  • умеет свободно перемещать элементы для оптимальной упаковки;
  • поддерживает drag-and-drop с автоматическим перераспределением соседних блоков;
  • позволяет фиксировать отдельные элементы через stamp, чего нет в классической Masonry.

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