Packery — это библиотека для построения динамических сеток с возможностью свободного позиционирования элементов. В отличие от традиционных CSS-сеток (flexbox, grid), Packery позволяет располагать блоки так, чтобы минимизировать пустое пространство между ними, создавая «мозаичный» эффект. Каждый элемент в сетке может иметь разные размеры, и библиотека автоматически вычисляет оптимальное положение для каждого блока.
Ключевой механизм Packery основан на алгоритме упаковки, который проверяет доступные позиции и выбирает наиболее компактное размещение. Это делает библиотеку особенно полезной для интерфейсов с переменной высотой элементов или для визуальных галерей.
Мозаичные галереи Для изображений или карточек товаров с разной высотой или шириной Packery автоматически подбирает оптимальное расположение, избегая больших пустот. Такой подход идеально подходит для портфолио, фотогалерей или сайтов электронной коммерции с визуальными карточками.
Дашборды и панели инструментов Packery позволяет динамически изменять положение виджетов на панели, сохраняя компактность интерфейса. Элементы можно перетаскивать, и библиотека будет корректно перераспределять оставшиеся блоки.
Интерактивные интерфейсы с drag-and-drop Поддержка совместимости с библиотекой Draggabilly или встроенной функциональностью Packery делает возможным перетаскивание элементов внутри сетки. Это позволяет создавать гибкие интерфейсы, где пользователи могут менять порядок блоков, а библиотека автоматически подстраивает соседние элементы.
Контент с переменной высотой Если блоки имеют динамический контент (например, текст разной длины), 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:
stamp,
чего нет в классической Masonry.Packery идеально подходит для интерфейсов, где важна динамическая перестановка элементов и минимизация пустого пространства, особенно для приложений с интерактивным контентом.