В библиотеке Shopify Draggable swap-зоны (или swap containers) позволяют задавать области, внутри которых объекты можно менять местами. Они обеспечивают гибкую организацию интерфейса, позволяя создавать динамические списки, сетки и канвасы, где элементы можно перетаскивать и переставлять.
Swap-зоны управляются через контейнеры и сортируемые списки. В отличие от обычных drag-and-drop областей, swap-зоны не создают копий элементов — они перемещают объекты внутри определённых контейнеров, сохраняя их структуру и события.
Для начала необходимо определить контейнер, который будет служить swap-зоной:
import { Draggable } from '@shopify/draggable';
const container = document.querySelector('.swap-zone');
const draggable = new Draggable(container, {
draggable: '.draggable-item',
mirror: {
constrainDimensions: true
},
plugins: [Draggable.Plugins.Sortable]
});
Ключевые параметры:
draggable — селектор элементов, которые можно
перемещать.mirror.constrainDimensions — сохраняет размеры
зеркального отображения при перетаскивании.plugins — подключение плагинов, таких как
Sortable, обеспечивающих функционал перестановки внутри
swap-зоны.Swap-зона может содержать элементы любой структуры, но важно, чтобы они имели идентифицируемый селектор для корректной работы.
Для более точной настройки используются события библиотеки:
sortable:start — инициируется при начале
перетаскивания. Можно использовать для добавления классов
активности.sortable:sort — срабатывает при перемещении элемента
между позициями.sortable:stop — завершает перетаскивание, позволяет
обновить состояние DOM или синхронизировать данные.Пример использования событий:
draggable.on('sortable:start', (event) => {
event.dragEvent.source.classList.add('dragging');
});
draggable.on('sortable:stop', (event) => {
event.dragEvent.source.classList.remove('dragging');
});
Если на странице несколько swap-зон, можно определить, какие
контейнеры могут обмениваться элементами. Для этого используется
свойство containers:
const containerA = document.querySelector('.swap-zone-a');
const containerB = document.querySelector('.swap-zone-b');
const draggable = new Draggable([containerA, containerB], {
draggable: '.draggable-item',
plugins: [Draggable.Plugins.Sortable]
});
Элементы можно перемещать только между контейнерами, указанных в
массиве [containerA, containerB].
Для запрета перемещения некоторых элементов между зонами применяют
селекторы или кастомные условия в обработчике события
sortable:sort:
draggable.on('sortable:sort', (event) => {
if (event.over && event.over.classList.contains('no-swap')) {
event.cancel();
}
});
Для swap-зон важно наглядно показывать, куда элемент может быть перемещён. Shopify Draggable поддерживает классы и зеркала:
mirror — отображение перетаскиваемого элемента поверх
страницы.classes — добавление кастомных классов для активного
состояния, placeholder или элемента под курсором.Пример:
const draggable = new Draggable(container, {
draggable: '.draggable-item',
mirror: {
constrainDimensions: true,
appendTo: 'body'
},
classes: {
mirror: 'mirror-element',
chosen: 'chosen-element',
placeholder: 'placeholder-element'
},
plugins: [Draggable.Plugins.Sortable]
});
Для сложных интерфейсов swap-зоны часто требуют синхронизации с
данными на сервере или локальным хранилищем. Лучший подход —
обрабатывать событие sortable:stop:
draggable.on('sortable:stop', (event) => {
const updatedOrder = Array.from(container.querySelectorAll('.draggable-item'))
.map(item => item.dataset.id);
fetch('/update-order', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ order: updatedOrder })
});
});
Такой подход обеспечивает сохранение нового порядка элементов после перестановки без потери интерактивности.
Shopify Draggable позволяет подключать дополнительные плагины:
Использование нескольких плагинов позволяет создать гибкие интерфейсы с drag-and-drop и swap-функционалом в реальном времени.
sortable:start,
sortable:sort, sortable:stop для управления
состоянием и визуальной обратной связью.Эти практики обеспечивают корректную работу swap-зон и позволяют строить сложные, интерактивные интерфейсы на базе Shopify Draggable.