Packery представляет собой библиотеку для построения динамических, плотных сеток с поддержкой drag-and-drop и автоматическим размещением элементов. Основная особенность Packery — способность упорядочивать элементы без пустого пространства, благодаря алгоритму bin-packing, что отличает её от классических Masonry-сеток.
Packery использует координаты x и y для каждого элемента, что позволяет гибко изменять их положение и поддерживать интерактивное перетаскивание. Алгоритм учитывает:
При добавлении нового элемента Packery ищет оптимальное место, минимизируя пустоты и обеспечивая плотное заполнение контейнера.
var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10,
percentPosition: true
});
Ключевые параметры:
itemSelector — CSS-селектор элементов сетки.gutter — промежуток между элементами.percentPosition — использование процентных размеров для
адаптивной верстки.Packery тесно интегрируется с Draggabilly или jQuery UI, позволяя пользователю перетаскивать элементы по сетке с сохранением плотного расположения. Это отличие от Masonry и Isotope, где drag-and-drop реализуется либо через дополнительные плагины, либо ограниченно.
var draggableItems = grid.querySelectorAll('.grid-item');
draggableItems.forEach(function(item){
var draggie = new Draggabilly(item);
pckry.bindDraggabillyEvents(draggie);
});
Эффекты, достигаемые при таком взаимодействии:
Хотя Packery не имеет встроенной фильтрации и сортировки как Isotope, её можно комбинировать с Isotope или создавать кастомные решения:
display
элементов, после чего вызывается pckry.layout() для
перерасчёта сетки.Packery оптимизирована для работы с относительно большим количеством элементов, однако плотная упаковка требует больше вычислений, чем простая Masonry. Важно учитывать:
requestAnimationFrame при сложных
интерактивных действияхАдаптивность достигается с помощью percentPosition и
медиазапросов CSS. Packery перерасчитывает позиции элементов при
изменении ширины контейнера, сохраняя плотность сетки.
Packery особенно эффективна для интерфейсов, где важен динамический контроль расположения элементов пользователем и плотная визуальная композиция, в отличие от Masonry или Isotope, где акцент делается на статичное отображение или фильтрацию.