Packery — это библиотека для создания динамических, сеточных макетов с возможностью перемещения элементов. Одной из ключевых возможностей является управление порядком элементов после их первоначальной отрисовки. В отличие от традиционных сеток, Packery учитывает размеры элементов и их положение в реальном времени, что делает управление порядком более гибким и интерактивным.
stamp и unstampМетоды stamp и unstamp позволяют исключать
определённые элементы из автоматического позиционирования:
var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10
});
var fixedItem = document.querySelector('.fixed-item');
pckry.stamp(fixedItem); // элемент фиксируется, Packery его не двигает
pckry.unstamp(fixedItem); // элемент возвращается в поток сетки
pckry.layout(); // перерасчёт расположения
stamp — фиксирует элемент, исключая
его из алгоритма Packery.unstamp — возвращает элемент в поток
сетки, позволяя Packery управлять его позицией.Использование этих методов удобно для закрепления заголовков или рекламных блоков без нарушения общей сетки.
moveItemPackery поддерживает метод moveItem,
позволяющий программно менять позицию элементов в сетке:
var item = grid.querySelector('.grid-item:nth-child(2)');
pckry.moveItem(item, 0); // перемещаем элемент на первую позицию
Параметры метода:
item — DOM-элемент или элемент
Packery.index — новая позиция в массиве
элементов.После вызова moveItem рекомендуется вызвать
layout для перерасчёта расположения:
pckry.layout();
Packery тесно интегрируется с DOM, что позволяет использовать стандартные методы JavaScript для изменения порядка элементов. После изменения DOM необходимо обновить Packery:
var newItem = document.createElement('div');
newItem.classList.add('grid-item');
grid.appendChild(newItem);
// уведомляем Packery о новом элементе
pckry.appended(newItem);
pckry.layout();
appended — добавляет новый элемент в
Packery и интегрирует его в текущую сетку.prepended — аналогично, но элемент
добавляется в начало списка.Packery часто используется вместе с библиотекой Draggabilly для перетаскивания элементов. Это позволяет пользователям изменять порядок элементов визуально:
var draggies = [];
var items = grid.querySelectorAll('.grid-item');
items.forEach(function(item) {
var draggie = new Draggabilly(item);
pckry.bindDraggabillyEvents(draggie);
draggies.push(draggie);
});
bindDraggabillyEvents — связывает
события перетаскивания с Packery.Использование перетаскивания в сочетании с методами
moveItem и layout обеспечивает полный
контроль над порядком элементов в реальном времени.
Для сортировки элементов по определённому критерию (например, по дате или цене) можно использовать стандартные методы массива и затем обновлять сетку:
var itemsArray = Array.from(grid.querySelectorAll('.grid-item'));
// сортировка по data-атрибуту
itemsArray.sort(function(a, b) {
return parseInt(a.dataset.order) - parseInt(b.dataset.order);
});
// переставляем элементы в DOM
itemsArray.forEach(function(item) {
grid.appendChild(item);
});
// обновляем Packery
pckry.reloadItems();
pckry.layout();
reloadItems — пересчитывает внутренний
список элементов Packery.layout — перестраивает сетку после
изменения порядка.Для сложных макетов можно комбинировать все подходы: закрепление
элементов, динамическое добавление, программное перемещение и
drag-and-drop. Ключевой принцип — после любого изменения
структуры DOM всегда вызывать layout, чтобы
Packery пересчитал позиции.
Использование этих инструментов позволяет создавать гибкие, интерактивные сетки, где порядок элементов может изменяться как программно, так и через пользовательский интерфейс, при этом Packery обеспечивает корректное перераспределение пространства.