Shopify Draggable — это современная JavaScript-библиотека, разработанная для реализации интерактивного перетаскивания элементов в веб-приложениях. В отличие от классических решений типа SortableJS, Draggable предлагает более гибкую архитектуру, расширенные возможности событийной модели и модульный подход к добавлению функциональности.
Draggable построен на основе ядра и плагинов. Ядро отвечает за базовое перетаскивание элементов, а расширения подключаются отдельно:
Такой подход позволяет подключать только необходимые функции, снижая нагрузку на приложение. SortableJS объединяет функциональность в одном пакете, что делает его меньше гибким при сложных сценариях.
Draggable предоставляет богатую событийную модель, которая делится на этапы взаимодействия:
SortableJS предоставляет события вроде onStart,
onEnd, onUpdate, но их количество и
детализация меньше. Draggable позволяет реагировать на каждое изменение
состояния и добавлять кастомную логику на каждом этапе.
Draggable использует MirrorPlugin, создающий отдельный DOM-элемент, который следует за курсором. Этот подход позволяет:
SortableJS перемещает оригинальные элементы напрямую, что иногда вызывает визуальные «скачки» при сложной верстке и анимации.
Draggable изначально ориентирован на работу с множественными контейнерами через Swappable и Droppable плагины:
import { Draggable, Swappable } from '@shopify/draggable';
const container1 = document.querySelector('#list1');
const container2 = document.querySelector('#list2');
const swappable = new Swappable([container1, container2], {
draggable: '.item'
});
SortableJS поддерживает мультиконтейнерность через опцию
group, но управление обменом элементов между списками менее
гибкое и требует дополнительной настройки.
Draggable позволяет задавать:
containers, droppables),cancel),const draggable = new Draggable(document.querySelectorAll('.list'), {
draggable: '.item',
handle: '.handle',
cancel: '.no-drag'
});
SortableJS также имеет handle и filter, но
управление исключениями и сложными условиями иногда требует обходных
путей.
Draggable интегрируется с CSS-переходами и анимациями через Mirror и собственные классы:
.draggable-mirror – элемент, который визуально следует
за курсором..draggable-source – исходный элемент, к которому
применяется временное выделение..draggable-dragging – класс, активируемый во время
перетаскивания.SortableJS также позволяет использовать CSS-классы, но Mirror-элемента нет, что ограничивает контроль над визуальной анимацией.
Draggable оптимизирован для больших списков и сложных интерфейсов благодаря:
SortableJS проще в использовании для небольших списков, но при работе с сотнями элементов и множеством контейнеров может потребоваться дополнительная оптимизация.
| Особенность | Draggable | SortableJS |
|---|---|---|
| Архитектура | Ядро + плагины | Монолитная |
| Событийная модель | Подробная, этапы drag/dragging | Простая, onStart/onEnd |
| Визуальный клон | MirrorPlugin | Нет |
| Мультиконтейнерность | Через Swappable/Droppable | Через group |
| Контроль handle/cancel | Гибкий, на уровне плагинов | Есть, но ограниченный |
| Анимация и стили | Mirror + CSS классы | CSS-классы, без Mirror |
| Масштабируемость | Высокая, оптимизировано | Средняя, требует оптимизации |
Draggable предоставляет расширенные возможности для сложных интерфейсов с множественными контейнерами, анимациями и детальной реакцией на события. SortableJS остаётся простым и быстрым инструментом для базовой сортировки, но в сложных сценариях Draggable оказывается более гибким и управляемым.