Библиотека Shopify Draggable предназначена для
реализации перетаскивания элементов на веб-странице с высокой гибкостью
и широким набором событий, которые позволяют контролировать весь процесс
взаимодействия. Она работает поверх нативного drag and drop
API браузера, но значительно упрощает и расширяет его возможности,
устраняя большинство ограничений стандартного подхода.
MouseSensor или TouchSensor.Инициализация Draggable выполняется следующим образом:
import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.container'), {
draggable: '.item',
mirror: {
constrainDimensions: true,
},
delay: 0,
});
Пояснения:
document.querySelectorAll('.container') – контейнеры,
внутри которых элементы будут перетаскиваться.draggable: '.item' – селектор дочерних элементов,
которые становятся перетаскиваемыми.mirror.constrainDimensions: true – зеркало будет копией
размеров оригинального элемента.delay – задержка перед началом перетаскивания в
миллисекундах, полезно для предотвращения случайных перемещений.Draggable предоставляет богатый набор событий, разделённых на этапы:
start – инициируется при начале перетаскивания.
draggable.on('drag:start', (event) => {
console.log('Начало перетаскивания', event.source);
});
В объекте события доступен event.source – оригинальный
элемент, который начал перетаскиваться.
move – происходит при перемещении элемента или зеркала. Позволяет отслеживать позицию и изменять поведение динамически:
draggable.on('drag:move', (event) => {
console.log('Текущие координаты', event.sensorEvent.clientX, event.sensorEvent.clientY);
});over/out – события при наведении на допустимые
цели. Используются в связке с Droppable:
draggable.on('drag:over', (event) => {
console.log('Элемент над зоной', event.over);
});stop – завершение перетаскивания, моментальное или после отпускания мыши/пальца. Здесь часто реализуют перемещение оригинального элемента или отправку данных на сервер:
draggable.on('drag:stop', (event) => {
console.log('Перетаскивание завершено');
});Создание зеркала (mirror) полностью контролируется
библиотекой:
constrainDimensions и x/yAxis
позволяют ограничивать размеры и направление перемещения.mirror:created и
mirror:destroy, дают возможность добавлять анимации или
эффект затемнения оригинала.draggable.on('mirror:created', (event) => {
event.mirror.style.transition = 'transform 0.2s ease';
});
Draggable позволяет задавать зоны, где перемещение разрешено или запрещено:
droppable – селекторы контейнеров, куда элементы могут
быть помещены.invalid – селекторы элементов, которые нельзя
перетаскивать.handle – селектор для «ручки», по которой разрешено
начинать перетаскивание.Пример использования:
const draggable = new Draggable(document.querySelectorAll('.container'), {
draggable: '.item',
handle: '.drag-handle',
invalid: ['.disabled'],
});
С помощью плагина Sortable можно реализовать динамическую перестановку элементов внутри контейнера:
import { Sortable } from '@shopify/draggable';
const sortable = new Sortable(document.querySelectorAll('.container'), {
draggable: '.item',
swapAnimation: {
duration: 200,
easingFunction: 'ease-in-out',
},
});
swapAnimation добавляет плавный визуальный эффект
перемещения элементов.sortable:sorted и sortable:stop
позволяют отслеживать изменения порядка и синхронизировать их с данными
на сервере.handle предотвращает случайные
перетаскивания при кликах по интерактивным элементам внутри
draggable.Поведение элементов в Shopify Draggable полностью настраивается через события, зеркала и плагины, что делает библиотеку гибким инструментом для создания интерактивных интерфейсов, сортируемых списков и drag-and-drop областей любого уровня сложности.