Библиотека Shopify Draggable реализует систему событий, основанную на чётком разделении жизненного цикла перетаскиваемого элемента. Каждое действие пользователя — от начала перетаскивания до завершения — проходит через определённые фазы событий, что позволяет гибко управлять поведением интерфейса.
mirror:createЭта фаза срабатывает в момент создания зеркального элемента (mirror element), который визуально повторяет перетаскиваемый объект. Mirror используется для анимаций и позволяет пользователю видеть движение объекта без изменения оригинального DOM-элемента.
Ключевые особенности:
event.source.Пример использования:
draggable.on('mirror:create', (event) => {
event.mirror.style.border = '2px dashed #000';
event.mirror.textContent = 'Перетаскиваю';
});
mirror:destroyФаза mirror:destroy наступает при завершении
перетаскивания и удалении зеркального элемента из DOM. Она позволяет
выполнить очистку ресурсов, удалить классы или отменить
анимации, связанные с mirror.
Пример:
draggable.on('mirror:destroy', (event) => {
console.log('Mirror элемент удалён', event.source);
});
drag:startdrag:start — это начало перетаскивания,
момент, когда пользователь удерживает объект и начинает его движение. На
этой фазе можно:
Пример:
draggable.on('drag:start', (event) => {
event.source.classList.add('is-dragging');
});
drag:movedrag:move — ключевая фаза, происходящая на
каждом кадре перемещения объекта. Позволяет отслеживать
координаты, обновлять позицию mirror, вычислять пересечения с другими
элементами.
Особенности:
Пример:
draggable.on('drag:move', (event) => {
console.log('Текущая позиция:', event.sensorEvent.clientX, event.sensorEvent.clientY);
});
drag:stopФаза drag:stop срабатывает в момент отпускания
объекта пользователем. Она сигнализирует о завершении действия
перетаскивания, но ещё до выполнения сортировки или других
изменений DOM.
Применение:
drop.Пример:
draggable.on('drag:stop', (event) => {
event.source.classList.remove('is-dragging');
});
drop:preparedrop:prepare — это момент, когда библиотека определяет
возможные зоны сброса для элемента. На этой фазе
можно:
Пример:
draggable.on('drop:prepare', (event) => {
event.containers.forEach(container => container.classList.add('highlight'));
});
drop:moveФаза drop:move отслеживает движение элемента над
контейнерами, где потенциально может произойти drop.
Используется для динамического изменения состояния контейнеров:
подсветки, анимаций, ограничения позиции.
Пример:
draggable.on('drop:move', (event) => {
if (event.over) {
event.over.classList.add('over');
}
});
drop:stopdrop:stop срабатывает в момент фактического
сброса элемента в контейнер. На этом этапе можно обновлять
данные, изменять DOM или запускать сторонние события.
Пример:
draggable.on('drop:stop', (event) => {
console.log('Элемент сброшен в контейнер', event.over);
});
droppable:over и droppable:outЭти события фиксируют пересечение перетаскиваемого элемента с контейнером:
droppable:over — элемент вошёл в область
контейнера.droppable:out — элемент покинул область
контейнера.Применение:
Пример:
draggable.on('droppable:over', (event) => {
event.over.classList.add('active-zone');
});
draggable.on('droppable:out', (event) => {
event.over.classList.remove('active-zone');
});
event.cancelable позволяет
отменять действия на определённой фазе, например
предотвращать drop в недопустимых контейнерах.mirror:createdrag:startdrag:move (многократные срабатывания)drop:preparedrop:move (при пересечении контейнеров)droppable:over / droppable:outdrag:stopdrop:stopmirror:destroyТакое поэтапное разделение обеспечивает максимальный контроль над поведением перетаскиваемого элемента, позволяет реализовать сложные анимации, динамическое изменение контейнеров и точную интеграцию с DOM.
Каждая фаза предоставляет набор данных через объект
event, включая source, mirror,
over, containers и sensorEvent,
что делает библиотеку Shopify Draggable мощным инструментом для создания
интерактивных интерфейсов с перетаскиванием.