Библиотека Shopify Draggable предоставляет мощный API для организации интерактивного перетаскивания элементов на веб-странице. Управление через JavaScript позволяет реализовать тонкий контроль над поведением элементов, событиями и взаимодействиями с другими компонентами интерфейса.
Для начала работы создаётся объект Draggable, которому передаётся контейнер с элементами и настройки поведения:
import { Draggable } from '@shopify/draggable';
const container = document.querySelector('.draggable-container');
const draggable = new Draggable(container, {
draggable: '.draggable-item',
delay: 100, // Задержка начала перетаскивания (мс)
mirror: {
constrainDimensions: true
}
});
Ключевые моменты:
draggable — селектор элементов, которые можно
перетаскивать.delay — полезно для предотвращения случайных
перетаскиваний при кликах.mirror — создание копии перетаскиваемого элемента,
которая визуально следует за курсором.Draggable предоставляет широкий спектр событий, позволяющих отслеживать каждое действие пользователя:
drag:start — инициируется при начале
перетаскивания.drag:move — вызывается при перемещении элемента.drag:stop — завершается после отпускания элемента.mirror:created и mirror:destroy —
управление копией перетаскиваемого элемента.sortable:sorted — фиксирует изменения порядка в
контейнере.Пример подписки на события:
draggable.on('drag:start', (event) => {
event.source.style.opacity = '0.5';
});
draggable.on('drag:stop', (event) => {
event.source.style.opacity = '1';
});
Draggable позволяет добавлять и удалять элементы без повторной инициализации:
const newItem = document.createElement('div');
newItem.classList.add('draggable-item');
container.appendChild(newItem);
draggable.addContainer(container); // Обновление контейнера
Удаление элементов также легко интегрируется через API:
draggable.removeContainer(container);
Если необходимо реализовать drag-and-drop сортировку, подключается модуль Sortable:
import { Sortable } from '@shopify/draggable';
const sortable = new Sortable(container, {
draggable: '.draggable-item',
handle: '.handle', // Перетаскивание только за определённый элемент
swapAnimation: {
duration: 200,
easingFunction: 'ease-in-out'
}
});
Особенности Sortable:
handle ограничивает область перетаскивания,
предотвращая случайные движения.swapAnimation создаёт плавное перемещение элементов при
изменении порядка.Можно инициировать или останавливать перетаскивание через методы Draggable:
draggable.enable(); // Активировать перетаскивание
draggable.disable(); // Отключить перетаскивание
Также возможно программно перемещать элементы с помощью событий и DOM-операций:
const item = container.querySelector('.draggable-item');
container.insertBefore(item, container.firstChild);
Mirror-элемент можно стилизовать через событие
mirror:created:
draggable.on('mirror:created', ({ mirror }) => {
mirror.style.backgroundColor = 'rgba(0, 0, 0, 0.1)';
mirror.style.boxShadow = '0 4px 8px rgba(0,0,0,0.2)';
});
Это позволяет сделать перетаскиваемый элемент более заметным и улучшить UX.
Draggable хорошо интегрируется с библиотеками анимации, такими как GSAP, и системами управления состоянием:
import { gsap } from 'gsap';
draggable.on('drag:move', ({ mirror }) => {
gsap.to(mirror, { x: mirror.offsetLeft, y: mirror.offsetTop, duration: 0.1 });
});
Такое сочетание позволяет создавать сложные интерфейсы с плавными анимациями и динамическими перестановками элементов.
Для больших списков элементов рекомендуется:
delay и handle для
минимизации случайных срабатываний.drag:move.Эти методы помогают сохранить высокую отзывчивость интерфейса даже при сотнях перетаскиваемых элементов.
Связывание нескольких контейнеров:
const containers = document.querySelectorAll('.draggable-container');
const sortableMulti = new Sortable(containers, {
draggable: '.draggable-item',
mirror: {
constrainDimensions: true
}
});
Это позволяет перемещать элементы между различными секциями страницы, сохраняя порядок внутри каждого контейнера.
Комбинированное использование с фильтрацией:
draggable.on('drag:start', ({ source }) => {
if (source.classList.contains('locked')) {
source.classList.add('no-drag');
return;
}
});
Таким образом, можно динамически запрещать перетаскивание определённых элементов.
Эти возможности JavaScript API Shopify Draggable дают полный контроль над поведением и визуальной частью перетаскивания, обеспечивая гибкость при разработке интерактивных интерфейсов.