Библиотека Shopify Draggable предоставляет мощный инструмент для создания интерактивных интерфейсов с возможностью перетаскивания элементов. Ключевым аспектом является понимание жизненного цикла перетаскивания, который определяет последовательность событий и взаимодействий между элементами, контейнерами и пользователем.
Для начала работы с Draggable создается экземпляр класса
Draggable, которому передаются:
containers) — элементы
DOM, внутри которых разрешено перетаскивание;draggable) —
конкретные элементы, которые можно перемещать.import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.container'), {
draggable: '.item'
});
На этом этапе библиотека подготавливает внутренние структуры для отслеживания состояния каждого перетаскиваемого элемента и контейнера.
Жизненный цикл перетаскивания включает несколько ключевых событий, которые позволяют управлять процессом и реагировать на действия пользователя.
drag:startСрабатывает в момент начала перетаскивания. На этом этапе создается снимок исходного элемента, фиксируется его исходная позиция и активируется визуальная индикация перетаскивания.
draggable.on('drag:start', (event) => {
console.log('Начало перетаскивания', event.source);
});
Особенности:
event.source — исходный элемент, который пользователь
начал перемещать.drag:moveСрабатывает при каждом изменении позиции элемента во время перетаскивания. Позволяет отслеживать координаты и динамически реагировать на движение.
draggable.on('drag:move', (event) => {
console.log('Перемещение элемента', event.source, 'координаты', event.sensorEvent.clientX, event.sensorEvent.clientY);
});
Особенности:
event.sensorEvent.drag:over и
drag:outЭти события связаны с контейнерами. drag:over
срабатывает при наведении перетаскиваемого элемента на новый контейнер,
а drag:out — при выходе из него.
draggable.on('drag:over', (event) => {
console.log('Элемент над контейнером', event.overContainer);
});
draggable.on('drag:out', (event) => {
console.log('Элемент покинул контейнер', event.overContainer);
});
Особенности:
drag:stopСрабатывает в момент завершения перетаскивания. На этом этапе происходит:
draggable.on('drag:stop', (event) => {
console.log('Перетаскивание завершено', event.source);
});
Особенности:
event.source — элемент, завершивший перемещение.Помимо базовых событий, Draggable предоставляет дополнительные хуки для более детальной настройки поведения:
sortable:swap — возникает при обмене двух элементов
внутри сортируемого списка;sortable:sorted — фиксирует финальный порядок элементов
после перетаскивания;drag:mirror:create и drag:mirror:destroy —
создаются и удаляются зеркала элементов, используемые для визуальной
анимации перетаскивания.draggable.on('drag:mirror:create', (event) => {
event.mirror.style.background = 'rgba(0, 0, 0, 0.1)';
});
Особенности зеркал:
Важной частью жизненного цикла является возможность отмены
перетаскивания. Для этого можно вызвать метод cancel() на
событии drag:start или drag:move, чтобы
предотвратить перемещение элемента.
draggable.on('drag:start', (event) => {
if (event.source.classList.contains('fixed')) {
event.cancel();
}
});
Применение:
Жизненный цикл перетаскивания в Shopify Draggable можно разделить на следующие этапы:
drag:start) —
фиксация исходного состояния.drag:move) — отслеживание
позиции и обновление интерфейса.drag:over,
drag:out) — управление возможными зонами
размещения.drag:stop) — финальная
фиксация положения, очистка стилей.Понимание и грамотное использование этих этапов позволяет создавать гибкие интерфейсы, поддерживающие сложные сценарии drag-and-drop, включая сортируемые списки, перенос между контейнерами и анимированные эффекты.