Для начала работы с библиотекой Shopify Draggable необходимо создать
экземпляр класса Draggable. Основной конструктор принимает
два обязательных аргумента: контейнер элементов и массив селекторов
элементов, которые будут перетаскиваться.
import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.container'), {
draggable: '.item'
});
Пояснение ключевых параметров:
container — DOM-элемент или NodeList контейнера, в
котором находятся перетаскиваемые элементы.draggable — CSS-селектор элементов, которые можно
перетаскивать.handle
(селектор для захвата), mirror (параметры зеркального
объекта), delay, ignore и т. д.Экземпляр, созданный через new Draggable(...),
предоставляет набор методов для управления поведением перетаскивания,
подписки на события и изменения состояния.
destroy()Метод полностью удаляет все обработчики событий и очищает внутренние данные экземпляра. Используется, когда необходимость в перетаскивании элементов отпадает.
draggable.destroy();
После вызова destroy экземпляр больше не будет
реагировать на события, и DOM-элементы вернутся к обычному
поведению.
enable() и
disable()Позволяют динамически включать или отключать перетаскивание без уничтожения экземпляра.
draggable.disable(); // Перетаскивание отключено
draggable.enable(); // Перетаскивание включено
Особенности:
disable() отключает события drag & drop, но
сохраняет конфигурацию.enable() восстанавливает возможность перетаскивания для
всех элементов.addContainer(container)Метод добавляет новый контейнер в список отслеживаемых экземпляром.
draggable.addContainer(document.querySelector('.new-container'));
После вызова все элементы внутри нового контейнера, соответствующие
селектору draggable, становятся доступными для
перетаскивания.
removeContainer(container)Удаляет контейнер из отслеживания экземпляром. Элементы внутри этого контейнера перестают быть перетаскиваемыми.
draggable.removeContainer(document.querySelector('.container'));
Метод не вызывает destroy, а только исключает указанный
контейнер из текущего экземпляра.
getDraggableElements()Возвращает массив всех элементов, которые могут быть перетаскиваемыми в текущий момент.
const items = draggable.getDraggableElements();
console.log(items);
Используется для динамической проверки состояния элементов, например, для обновления UI или применения стилей.
update()Обновляет внутренние данные экземпляра, полезно при динамическом изменении DOM: добавлении или удалении элементов, изменении классов, изменении размеров контейнера.
draggable.update();
Важно: метод не пересоздаёт экземпляр, а лишь синхронизирует его внутреннее состояние с текущим DOM.
getDraggableContainers()Возвращает массив всех контейнеров, в которых могут перемещаться элементы.
const containers = draggable.getDraggableContainers();
console.log(containers);
Полезно для работы с несколькими зонами перетаскивания или для управления динамическими контейнерами.
getMirror()Возвращает DOM-элемент зеркала (mirror), создаваемого при перетаскивании.
const mirrorElement = draggable.getMirror();
Применение:
getDraggableElement(event)Возвращает элемент, который инициировал событие drag или drop. Используется внутри обработчиков событий.
draggable.on('drag:start', (event) => {
const item = draggable.getDraggableElement(event);
item.style.opacity = '0.5';
});
Экземпляр Draggable активно взаимодействует с системой событий.
Методы on и off позволяют управлять подпиской
на события.
draggable.on('drag:stop', (event) => {
console.log('Перетаскивание завершено', event);
});
draggable.off('drag:stop'); // Отписка от события
Ключевые моменты:
тип:действие, например,
drag:start, drag:move, drag:stop,
sortable:sorted.source,
mirror, sensorEvent и другие свойства для
работы с DOM и логикой.setOptions(options)Позволяет изменить конфигурацию экземпляра на лету.
draggable.setOptions({
delay: 200,
handle: '.handle'
});
Изменения применяются к последующим событиям drag & drop без пересоздания экземпляра.
trigger(eventName, eventData)Инициирует кастомное событие экземпляра. Используется для интеграции с внешними системами или для тестирования.
draggable.trigger('drag:stop', { source: someElement });
Метод может быть полезен для программного имитации действий пользователя или отладки.
Методы экземпляра Shopify Draggable обеспечивают полное управление поведением перетаскиваемых элементов, позволяют динамически изменять конфигурацию, работать с контейнерами и элементами, а также интегрироваться с системой событий для построения сложных интерфейсов drag & drop.