В библиотеке Shopify Draggable каждый элемент, который можно перетаскивать, называется draggable element. Определение таких элементов является основополагающим шагом для инициализации функционала drag-and-drop и контроля поведения интерфейса.
Для создания draggable необходимо указать DOM-элементы, которые будут участвовать в перетаскивании. Обычно это делается с помощью CSS-селекторов:
import {Draggable} from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.draggable-item'), {
draggable: '.draggable-item'
});
В данном примере все элементы с классом draggable-item
становятся доступными для перетаскивания. Важно
различать контейнер, в котором находятся элементы, и сами элементы.
Контейнер обеспечивает область перетаскивания, а селектор
draggable указывает непосредственно на объекты, которые
будут перемещаться.
Shopify Draggable предоставляет гибкие настройки для определения поведения draggable элементов:
Пример использования handle и mirror:
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item',
handle: '.drag-handle',
mirror: {
constrainDimensions: true
}
});
Здесь перетаскивание будет происходить только при захвате области с
классом .drag-handle, а во время перетаскивания будет
создаваться зеркальная копия элемента с сохранением размеров
оригинала.
В Shopify Draggable различают draggable и sortable:
Для sortable необходимо использовать расширение
Sortable:
import {Sortable} from '@shopify/draggable';
const sortable = new Sortable(document.querySelectorAll('.sortable-container'), {
draggable: '.sortable-item'
});
Sortable наследует все свойства draggable, но добавляет логику
перестановки элементов и событие sortable:stop для
отслеживания изменений позиции.
Mirror элемент создается автоматически библиотекой и представляет визуальную копию перемещаемого объекта. Основные свойства mirror:
Пример кастомизации mirror:
const draggable = new Draggable(document.querySelectorAll('.draggable-container'), {
draggable: '.draggable-item',
mirror: {
constrainDimensions: true,
appendTo: document.body,
xOffset: 10,
yOffset: 10
}
});
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);
});
Элемент, готовый к перетаскиванию, обладает следующими характеристиками:
draggable.handle).Эти принципы позволяют создавать гибкую систему интерактивных интерфейсов с точным контролем поведения draggable элементов.