Метод dragItemPositioned является ключевым событием в
библиотеке Packery, отвечающим за отслеживание завершения перемещения
элемента в сетке. Он вызывается каждый раз, когда пользователь
перетаскивает элемент с помощью Draggabilly или любого другого
совместимого плагина, и элемент занимает новую позицию.
packeryInstance.on('dragItemPositioned', function( draggedItem ) {
// действия с draggedItem
});
Параметры:
draggedItem – объект Packery.Item,
представляющий элемент сетки, который был перемещен. Через него можно
получить DOM-элемент и текущие координаты позиции.draggedItem{x, y, width, height}.Пример доступа к координатам:
packeryInstance.on('dragItemPositioned', function(item) {
console.log('Элемент перемещён в координаты:', item.x, item.y);
});
Событие dragItemPositioned идеально подходит для
динамического обновления данных или интерфейса. Например, можно
сохранять новые позиции элементов в базе данных после того, как
пользователь переставил их:
packeryInstance.on('dragItemPositioned', function(item) {
const elementId = item.element.getAttribute('data-id');
const position = { x: item.x, y: item.y };
savePositionToServer(elementId, position);
});
Здесь savePositionToServer — функция, которая отправляет
координаты элемента на сервер, обеспечивая сохранение состояния
сетки.
Чтобы событие корректно срабатывало, необходимо, чтобы элементы сетки были интегрированы с Draggabilly:
const draggies = [];
elements.forEach(function(el) {
const draggie = new Draggabilly(el);
packeryInstance.bindDraggabillyEvents(draggie);
draggies.push(draggie);
});
После этого перемещение любого элемента автоматически вызывает
событие dragItemPositioned, и можно отслеживать его
положение.
requestAnimationFrame:
если обновление интерфейса связано с анимациями, оборачивайте действия в
requestAnimationFrame для плавного рендеринга.classList или
dataset, прежде чем выполнять сложные операции.packeryInstance.on('dragItemPositioned', function(item) {
const items = packeryInstance.items;
items.sort((a, b) => a.y - b.y || a.x - b.x);
console.log('Порядок элементов после перемещения:', items.map(i => i.element.id));
});
packeryInstance.on('dragItemPositioned', function(item) {
const maxX = 500;
if (item.x > maxX) {
item.element.style.left = maxX + 'px';
packeryInstance.fit(item.element);
}
});
packeryInstance.on('dragItemPositioned', function(item) {
item.element.classList.add('moved');
setTimeout(() => item.element.classList.remove('moved'), 300);
});
fit, stamp и
layout библиотеки Packery.Packery.Item, а не прямой
DOM-элемент, поэтому для манипуляций с атрибутами или стилями необходимо
использовать item.element.dragItemPositioned является мощным инструментом для
реализации интерактивных сеток, динамического управления элементами и
интеграции Packery с внешними данными. Правильное использование этого
события позволяет создавать сложные и отзывчивые интерфейсы с
минимальными усилиями.