В библиотеке Shopify Draggable ключевым элементом
является класс Draggable, который инкапсулирует всю логику
взаимодействия с перетаскиваемыми элементами. Класс реализован с
использованием стандартного синтаксиса ES6, что обеспечивает гибкость
при расширении и настройке поведения.
Создание экземпляра класса Draggable происходит через
конструктор:
import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.draggable'), {
draggable: '.item',
delay: 0,
mirror: {
constrainDimensions: true
}
});
containers – обязательный параметр,
представляет собой DOM-элементы-контейнеры, в которых можно
перетаскивать элементы. Может быть NodeList, массив DOM-элементов или
одиночный элемент.
options – объект с настройками
поведения:
draggable – селектор перетаскиваемого элемента
внутри контейнера.
delay – задержка перед началом перетаскивания, в
миллисекундах.
mirror – объект настроек зеркала (элемента, который
перемещается по экрану):
constrainDimensions – сохраняет размеры оригинального
элемента.xAxis / yAxis – ограничивает движение по
одной оси.plugins – массив подключаемых плагинов (например,
Sortable, Swappable).
Экземпляр класса позволяет подключать обработчики событий через метод
.on() и управлять поведением drag-and-drop без прямого
вмешательства в DOM.
Класс Draggable предоставляет несколько ключевых
методов:
.on(event, callback)Используется для подписки на события жизненного цикла перетаскивания. События делятся на группы:
Drag events:
drag:start – начало перетаскивания.drag:move – движение перетаскиваемого элемента.drag:stop – завершение перетаскивания.Mirror events:
mirror:create – создание зеркала.mirror:destroy – удаление зеркала после завершения
действия.Пример использования:
draggable.on('drag:start', (event) => {
console.log('Начало перетаскивания', event);
});
draggable.on('drag:stop', (event) => {
console.log('Элемент отпущен', event);
});
.destroy()Метод полностью очищает экземпляр и удаляет все слушатели событий. Используется для предотвращения утечек памяти при динамическом создании контейнеров:
draggable.destroy();
.disable() и
.enable()Позволяют временно отключать или включать функциональность drag-and-drop:
draggable.disable();
draggable.enable();
Конструктор поддерживает детальную настройку, позволяя комбинировать
плагины и кастомные обработчики. Например, можно подключить плагин
Sortable для изменения порядка элементов:
import { Sortable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.list'), {
draggable: '.list-item',
plugins: [Sortable],
});
Дополнительно можно настроить ограничения перемещения:
const draggable = new Draggable(document.querySelectorAll('.grid'), {
draggable: '.grid-item',
mirror: { constrainDimensions: true },
delay: 100,
dragAxis: 'x' // ограничение движения по оси X
});
Класс Draggable можно расширять через стандартный
механизм ES6 extends. Это позволяет создавать кастомные
версии с дополнительной логикой:
class CustomDraggable extends Draggable {
constructor(containers, options) {
super(containers, options);
}
highlight(item) {
item.style.backgroundColor = 'yellow';
}
}
const custom = new CustomDraggable(document.querySelectorAll('.custom'), {
draggable: '.custom-item'
});
custom.on('drag:start', (event) => {
custom.highlight(event.source);
});
Такой подход позволяет интегрировать специфичные визуальные эффекты, дополнительные проверки или анимации, не вмешиваясь в исходный код библиотеки.
Экземпляр класса хранит ссылки на контейнеры и элементы, обеспечивая прямой доступ через свойства:
containers – массив контейнеров.draggableElements – массив элементов, которые можно
перемещать.plugins – активные плагины экземпляра.Каждое событие передает объект Event, содержащий
полезные свойства:
source – исходный элемент, который
перетаскивается.mirror – копия элемента, перемещаемая по экрану.sensorEvent – исходное событие мыши или касания.originalEvent – оригинальное DOM-событие.delay, чтобы предотвратить случайное перетаскивание при
клике.mirror.constrainDimensions обеспечивает
визуальную консистентность элементов.Использование классов и конструкторов в Shopify Draggable обеспечивает мощную основу для реализации сложных интерфейсов drag-and-drop, с возможностью гибкой настройки и расширения поведения элементов.