Shopify Draggable — это библиотека на чистом JavaScript, предназначенная для создания интерактивных интерфейсов с возможностью перетаскивания, сортировки и управления списками элементов. Она работает без зависимостей от сторонних фреймворков и идеально подходит для реализации drag-and-drop в веб-приложениях, управляемых Vanilla JavaScript.
Библиотека строится вокруг трёх ключевых компонентов:
Для создания базового draggable-элемента используется следующий синтаксис:
import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.list'), {
draggable: '.item',
delay: 0,
mirror: {
constrainDimensions: true,
}
});
Разбор параметров:
document.querySelectorAll('.list') – контейнеры, внутри
которых элементы будут перетаскиваться.draggable: '.item' – CSS-селектор для элементов,
которые можно перетаскивать.delay – задержка перед началом drag (в
миллисекундах).mirror – объект с настройками для «зеркала» (копии
элемента при перетаскивании).Draggable использует мощную систему событий, позволяющую отслеживать каждый этап взаимодействия:
drag:start – когда пользователь начал перетаскивать
элемент.drag:move – когда элемент перемещается.drag:stop – когда завершилось перетаскивание.mirror:created – когда создаётся визуальная копия
элемента для перемещения.sortable:stop – когда завершена сортировка
элементов.Пример использования событий:
draggable.on('drag:start', (event) => {
console.log('Начало перетаскивания:', event.source);
});
draggable.on('drag:stop', (event) => {
console.log('Элемент отпущен:', event.source);
});
Каждое событие получает объект event, содержащий такие
свойства, как source (исходный элемент),
sensorEvent (оригинальное событие мыши/тача) и
mirror (элемент-зеркало).
Draggable поддерживает подключаемые плагины, расширяющие функциональность. Среди ключевых:
import { Sortable } from '@shopify/draggable';
const sortable = new Sortable(document.querySelectorAll('.list'), {
draggable: '.item'
});
import { Swappable } from '@shopify/draggable';
const swappable = new Swappable(document.querySelectorAll('.list'), {
draggable: '.item',
swapAnimation: {
duration: 300,
easingFunction: 'ease-in-out'
}
});
import { Droppable } from '@shopify/draggable';
const droppable = new Droppable(document.querySelectorAll('.drop-area'), {
draggable: '.item'
});
Плагины можно комбинировать для реализации сложных интерфейсов с сортировкой, перетаскиванием между списками и визуальной анимацией.
Зеркало — это копия перетаскиваемого элемента, которая следует за курсором:
const draggable = new Draggable(document.querySelectorAll('.list'), {
draggable: '.item',
mirror: {
constrainDimensions: true,
xAxis: true,
yAxis: true
}
});
constrainDimensions: true – зеркальная копия сохраняет
размеры исходного элемента.xAxis / yAxis – ограничение движения по
конкретной оси..draggable-mirror.Draggable поддерживает несколько контейнеров одновременно:
const draggable = new Draggable(
document.querySelectorAll('.list, .another-list'),
{ draggable: '.item' }
);
Элементы можно перетаскивать между разными списками без
дополнительных настроек. При этом события sortable:stop и
swappable:swapped помогут отслеживать изменения порядка и
обмена элементов.
transform вместо
top/left.Draggable легко интегрируется с Vanilla JS-плагинами для:
Masonry,
CSS Grid)GSAP)Fetch API, Axios)Пример совместимости с GSAP для анимации зеркала:
draggable.on('mirror:created', ({ mirror }) => {
gsap.set(mirror, { opacity: 0.8, scale: 1.05 });
});
touchstart и touchmove.Draggable в Vanilla JavaScript предоставляет полный контроль над интерфейсом перетаскивания, позволяя создавать динамичные и отзывчивые пользовательские элементы без использования сторонних фреймворков.