Библиотека Shopify Draggable предоставляет гибкий интерфейс для создания интерактивных перетаскиваемых элементов на веб-странице. В основе работы лежат различные типы draggable объектов, которые определяют поведение элементов при взаимодействии с пользователем.
Draggable — это базовый класс, на котором строятся все остальные объекты. Он создаёт область, элементы которой можно перемещать с помощью мыши или касания. Основные свойства и методы:
container — DOM-элемент или селектор контейнера, в
пределах которого будут перемещаться элементы.
draggable — селектор элементов внутри контейнера,
которые становятся перетаскиваемыми.
Методы:
on(eventName, handler) — подписка на события, например
drag:start, drag:move,
drag:stop.destroy() — отключение всех слушателей и очистка
памяти.Пример базового Draggable:
import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.container'), {
draggable: '.item'
});
draggable.on('drag:start', (event) => {
console.log('Начало перетаскивания:', event.source);
});
Sortable расширяет функциональность Draggable, добавляя возможность перестановки элементов внутри одного контейнера или между контейнерами. Основные отличия:
mirror — визуального клона перемещаемого
элемента.sortable:stop.Пример использования Sortable:
import { Sortable } from '@shopify/draggable';
const sortable = new Sortable(document.querySelectorAll('.list'), {
draggable: '.list-item'
});
sortable.on('sortable:stop', (event) => {
console.log('Новый порядок:', Array.from(event.container.children).map(el => el.textContent));
});
Swappable позволяет обмениваться местами элементами между контейнерами при перетаскивании. Отличительные особенности:
Не требует перестановки всех элементов, достаточно поменять позиции двух элементов.
События:
swappable:start — начало перетаскивания.swappable:swapped — элементы успешно обменялись
местами.Пример Swappable:
import { Swappable } from '@shopify/draggable';
const swappable = new Swappable(document.querySelectorAll('.grid'), {
draggable: '.grid-item'
});
swappable.on('swappable:swapped', (event) => {
console.log('Элементы обменялись местами:', event.source, event.over);
});
Droppable предоставляет механизм приёма элементов в специальные зоны, без изменения порядка остальных элементов. Полезен для реализации корзин, списков задач и подобных интерфейсов. Основные особенности:
droppable — селектор зон, куда можно бросать
элементы.
События:
droppable:over — элемент наведен на зону.droppable:out — элемент покинул зону.droppable:dropped — элемент сброшен в зону.Пример Droppable:
import { Droppable } from '@shopify/draggable';
const droppable = new Droppable(document.querySelectorAll('.dropzones'), {
draggable: '.item',
droppable: '.zone'
});
droppable.on('droppable:dropped', (event) => {
console.log('Элемент помещён в зону:', event.source, event.over);
});
Mirror — вспомогательный объект, создающий визуальный клон перетаскиваемого элемента. Он используется внутри Sortable и Draggable для улучшения UX. Ключевые особенности:
mirror создаётся автоматически при перетаскивании.Пример кастомного Mirror:
draggable.on('mirror:created', (event) => {
event.mirror.style.backgroundColor = 'rgba(0, 0, 255, 0.2)';
});
| Тип | Основное назначение | Изменение DOM | Поддержка нескольких контейнеров |
|---|---|---|---|
| Draggable | Базовое перетаскивание | Нет | Да |
| Sortable | Перестановка элементов | Да | Да |
| Swappable | Обмен местами элементов | Да (локально) | Да |
| Droppable | Приём элементов в зоны | Нет | Да |
| Mirror | Визуальный клон элемента | Нет | Да |
Использование правильного типа draggable объекта зависит от цели: сортировка и перестановка — Sortable, обмен элементами — Swappable, приём в зоны — Droppable, простое перетаскивание без изменения DOM — Draggable. Mirror обеспечивает визуальную отзывчивость и улучшает UX при всех типах взаимодействий.
Каждый тип draggable объекта поддерживает опции конфигурации:
delay — задержка начала перетаскивания.mirror — параметры визуального клона.handle — только элементы внутри которых могут
инициировать drag.classes — пользовательские CSS-классы для состояния
dragging, mirror и over.Пример с кастомной настройкой Sortable:
const sortable = new Sortable(document.querySelectorAll('.list'), {
draggable: '.item',
handle: '.handle',
mirror: {
constrainDimensions: true
},
classes: {
dragging: 'is-dragging',
mirror: 'mirror-element'
}
});
Эти типы объектов создают основу для всех интерактивных интерфейсов в Shopify Draggable, позволяя строить сложные системы перетаскивания с минимальным количеством кода.