Shopify Draggable предоставляет мощный API для создания перетаскиваемых интерфейсов, включая возможность программного перемещения элементов. Программное перемещение позволяет изменять порядок элементов динамически через код, без прямого взаимодействия пользователя с мышью. Это особенно важно для реализации автоматических перестановок, сортировки и интерактивных интерфейсных эффектов.
Для работы с программным перемещением сначала создаётся объект Draggable:
import { Draggable } from '@shopify/draggable';
const container = document.querySelector('.draggable-container');
const draggable = new Draggable(container, {
draggable: '.draggable-item',
mirror: {
constrainDimensions: true,
},
});
container — элемент, содержащий перетаскиваемые
объекты.draggable — селектор элементов, которые можно
перемещать.mirror.constrainDimensions — позволяет зеркальному
элементу сохранять размеры оригинала при перемещении.В Draggable API существует метод move, позволяющий
переместить элемент в новый индекс внутри контейнера:
draggable.move(item, newIndex);
item — DOM-элемент, который нужно переместить.newIndex — индекс, куда должен быть вставлен элемент
после перемещения.Пример:
const item = document.querySelector('.draggable-item:nth-child(2)');
draggable.move(item, 0);
В этом примере второй элемент перемещается на первую позицию.
Draggable генерирует стандартные события drag:start,
drag:move и drag:stop. При программном
перемещении важно корректно отслеживать изменения:
draggable.on('drag:stop', (event) => {
console.log(`Элемент ${event.source.textContent} перемещён на позицию ${Array.from(container.children).indexOf(event.source)}`);
});
При вызове move событие drag:stop
автоматически срабатывает, что позволяет синхронизировать интерфейс и
данные.
Иногда требуется не просто менять позиции, а полностью перемещать элемент между контейнерами. Для этого используется комбинация методов:
const targetContainer = document.querySelector('.another-container');
const item = document.querySelector('.draggable-item');
targetContainer.appendChild(item);
draggable.destroy(); // пересоздание Draggable для нового контейнера
const newDraggable = new Draggable(targetContainer, {
draggable: '.draggable-item',
});
При этом важно помнить, что Draggable не отслеживает DOM-изменения автоматически, поэтому после перемещения между контейнерами нужно инициализировать новый экземпляр.
Для создания плавного визуального эффекта перемещения можно
использовать CSS-переходы вместе с программным move:
.draggable-item {
transition: transform 0.3s ease;
}
draggable.move(item, 3); // CSS обеспечит плавное смещение элемента
transition на свойстве transform
автоматически применяет анимацию при изменении позиции, сохраняя
визуальную целостность интерфейса.
Для более сложных интерфейсов можно ограничить программное перемещение по условиям:
function moveItemConditionally(item, newIndex) {
if (newIndex < 0 || newIndex >= container.children.length) return;
draggable.move(item, newIndex);
}
Эта проверка предотвращает ошибки при некорректных индексах и защищает DOM от неожиданного поведения.
В связке с динамическими списками (например, при подгрузке товаров или карточек):
function reorderItems(items) {
items.forEach((item, index) => {
draggable.move(item, index);
});
}
Эта стратегия позволяет синхронизировать порядок элементов с внутренним состоянием приложения, например с массивом объектов на фронтенде.
move только для элементов, уже
подключенных к Draggable.requestAnimationFrame при массовых перемещениях,
чтобы избежать просадок производительности.Программное перемещение в Shopify Draggable открывает возможности для реализации сложных интерактивных интерфейсов, позволяя управлять элементами не только вручную, но и через логические алгоритмы приложения, сохраняя при этом плавность и отзывчивость интерфейса.