Библиотека Shopify Draggable предоставляет мощный API для реализации перетаскивания элементов на веб-странице. Одной из ключевых возможностей является работа с жестами, которые позволяют определять действия пользователя и реагировать на них более гибко, чем простое перемещение элемента мышью.
Жесты в контексте Draggable представляют собой последовательности событий, происходящие при взаимодействии с элементами DOM. Классические жесты включают drag, drop, swipe, а также пользовательские жесты, которые могут быть определены через события библиотеки.
Draggable использует событийную модель, позволяя подписываться на ключевые моменты жизненного цикла перетаскивания. Основные события:
drag:start – срабатывает в момент
начала перемещения элемента. Позволяет установить начальные параметры,
сохранить исходные координаты и применить визуальные эффекты.drag:move – вызывается на каждом кадре
движения курсора. Предоставляет объект события с информацией о текущей
позиции, изменении координат и целевом элементе.drag:stop – срабатывает по завершении
перетаскивания, когда элемент отпущен. Используется для финальной
обработки, например, возврата элемента на исходную позицию или фиксации
в новом контейнере.drop:over и
drop:out – информируют о пересечении
элемента с зоной drop. Позволяют реализовать подсветку целевых
областей.sortable:swap – специфическое событие
для сортируемых контейнеров, когда элементы меняются местами во время
drag.Каждое событие передает объект с набором свойств:
source, mirror, sensorEvent,
over и др., которые дают полный доступ к состоянию
взаимодействия.
Жесты распознаются через Sensor API Draggable, который абстрагирует источник ввода, будь то мышь, сенсорный экран или клавиатура. Основные сенсоры:
MouseSensor – стандартная обработка
drag для мыши.TouchSensor – поддержка жестов на
мобильных устройствах. Позволяет учитывать мульти-тач и различать
направления свайпов.KeyboardSensor – альтернативный способ
перемещения для доступности, реагирует на стрелочные клавиши и клавишу
Enter для активации drag.Сенсор можно подключить через конфигурацию Draggable:
import { Draggable, MouseSensor, TouchSensor } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.draggable'), {
sensors: [MouseSensor, TouchSensor],
draggable: '.item',
mirror: {
constrainDimensions: true,
}
});
Draggable позволяет определять собственные жесты на основе комбинаций стандартных событий. Например, можно реализовать свайп влево или вправо по элементу:
draggable.on('drag:move', (event) => {
const deltaX = event.sensorEvent.deltaX;
if (deltaX > 100) {
console.log('Свайп вправо распознан');
} else if (deltaX < -100) {
console.log('Свайп влево распознан');
}
});
Здесь sensorEvent.deltaX отражает смещение курсора или
пальца относительно начала drag. По аналогии можно отслеживать
deltaY для вертикальных свайпов или комбинировать оси для
диагональных жестов.
Mirror-элемент — это копия перетаскиваемого элемента, создаваемая Draggable для плавного перемещения. Он критически важен для распознавания жестов, поскольку позволяет:
drag:over.Пример настройки mirror с изменением прозрачности при drag:
const draggable = new Draggable(document.querySelectorAll('.draggable'), {
mirror: {
constrainDimensions: true,
appendTo: document.body,
xAxis: true,
yAxis: true
}
});
draggable.on('mirror:created', (event) => {
event.mirror.style.opacity = 0.7;
});
classes можно
добавлять CSS-классы при старте (draggable--is-dragging),
наведении (draggable--over) или отпускании.distance) перед срабатыванием drag.Можно объединять несколько сенсоров и событий для сложных взаимодействий, например, drag с горизонтальным свайпом и последующей сортировкой:
draggable.on('drag:start', (event) => {
event.source.classList.add('dragging');
});
draggable.on('drag:move', (event) => {
if (Math.abs(event.sensorEvent.deltaX) > 150) {
console.log('Свайп выполнен');
}
});
draggable.on('drag:stop', (event) => {
event.source.classList.remove('dragging');
});
Такой подход позволяет реализовать интуитивно понятные интерфейсы, где один элемент может реагировать как на простое перемещение, так и на специальные жесты.
Эта методика обеспечивает гибкую архитектуру для создания современных интерактивных интерфейсов на базе Shopify Draggable с поддержкой всех видов жестов: мышь, сенсорный экран и клавиатура.