Для работы с библиотекой Shopify Draggable необходимо сначала подключить её в проект. Существует несколько способов подключения: через npm, yarn или CDN.
Через npm:
npm install @shopify/draggable
Через yarn:
yarn add @shopify/draggable
После установки можно импортировать необходимые модули в Jav * aScript:
import { Draggable } from '@shopify/draggable';
Если подключение через CDN, подключение выглядит так:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shopify/draggable/lib/draggable.bundle.css">
<script src="https://cdn.jsdelivr.net/npm/@shopify/draggable/lib/draggable.bundle.legacy.js"></script>
Основной класс для работы с элементами перетаскивания — это
Draggable. Он принимает два аргумента: селектор контейнера
и объект настроек.
Простейшая инициализация выглядит следующим образом:
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item'
});
Объект настроек Draggable поддерживает несколько ключевых параметров:
draggable — селектор элементов, которые можно
перетаскивать.handle — селектор элемента, по которому разрешено
перетаскивание. Если не указан, перетаскивать можно за любой участок
элемента.delay — задержка начала перетаскивания в миллисекундах.
Позволяет предотвращать случайные срабатывания при клике.mirror — объект настройки зеркального отображения
перетаскиваемого элемента. Например,
mirror: { constrainDimensions: true } сохраняет размеры
оригинального элемента.plugins — массив подключаемых плагинов для расширения
функционала, таких как Sortable или
Swappable.Пример расширенной инициализации с настройкой ручки и задержки:
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item',
handle: '.handle',
delay: 150,
mirror: {
constrainDimensions: true
}
});
Draggable генерирует набор событий, на которые можно подписываться для управления поведением элементов:
drag:start — событие при начале перетаскивания.drag:move — событие при перемещении элемента.drag:stop — событие при завершении перетаскивания.mirror:created — создаётся зеркальный элемент для
визуализации перетаскивания.mirror:destroy — уничтожение зеркального элемента после
завершения перетаскивания.Пример подписки на события:
draggable.on('drag:start', (event) => {
console.log('Начало перетаскивания', event.source);
});
draggable.on('drag:stop', (event) => {
console.log('Перетаскивание завершено', event.source);
});
new Draggable(...)draggable.disable() — временно блокирует возможность
перетаскивания.draggable.enable() — возвращает возможность
перетаскивания.draggable.destroy() — полностью очищает все слушатели и
удаляет экземпляр.Для корректной работы важно, чтобы все перетаскиваемые элементы находились внутри контейнера, указанного при инициализации. Структура HTML может быть следующей:
<div class="draggable-container">
<div class="draggable-item">
<div class="handle">Перетащи меня</div>
Элемент 1
</div>
<div class="draggable-item">
<div class="handle">Перетащи меня</div>
Элемент 2
</div>
</div>
В примере ручка .handle позволяет перетаскивать элементы
только за указанный участок. Это предотвращает случайное срабатывание на
клики по другим областям элемента.
Зеркальный элемент (mirror) создаётся автоматически при
начале перетаскивания. Он визуально повторяет перетаскиваемый элемент,
оставаясь поверх других элементов.
Параметры mirror:
constrainDimensions — сохраняет размеры оригинального
элемента.xAxis / yAxis — ограничение движения по
горизонтали или вертикали.Пример настройки ограниченного движения:
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item',
mirror: {
constrainDimensions: true,
xAxis: true,
yAxis: false
}
});
Это ограничит движение только по горизонтали.
Shopify Draggable имеет встроенные плагины для расширения возможностей:
Подключение плагина осуществляется через параметр
plugins:
import { Sortable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item',
plugins: [Sortable]
});
События плагинов также доступны для подписки, что позволяет создавать интерактивные интерфейсы с динамическим обновлением порядка элементов или зон сброса.
handle для сложных элементов, чтобы
избежать случайного срабатывания перетаскивания.destroy(), если
контейнер удаляется из DOM, чтобы избежать утечек памяти.drag:start и
drag:stop для добавления визуальных эффектов, таких как
подсветка активного элемента.Базовая инициализация Shopify Draggable обеспечивает гибкость настройки, поддержку событий и расширение функционала через плагины, что позволяет создавать мощные интерфейсы с интерактивной перетаскиваемой графикой и элементами списка.