Библиотека Shopify Draggable предоставляет мощный инструмент для управления перетаскиванием элементов на веб-странице. Одним из ключевых аспектов её использования является возможность группировки элементов, что позволяет объединять элементы в логические блоки и управлять ими как единым целым.
Для организации элементов необходимо определить контейнеры, внутри которых будет осуществляться drag-and-drop. Контейнер задаётся через CSS-селектор при создании экземпляра Draggable:
import { Draggable } from '@shopify/draggable';
const container = document.querySelectorAll('.draggable-container');
const draggable = new Draggable(container, {
draggable: '.draggable-item',
delay: 0,
mirror: {
constrainDimensions: true,
}
});
.draggable-container — родительский
элемент, объединяющий элементы группы..draggable-item — элементы, которые
будут перетаскиваться внутри контейнера.Draggable позволяет работать с несколькими контейнерами, что необходимо для перемещения элементов между группами. Это достигается через передачу массива элементов:
const containers = document.querySelectorAll('.group');
const draggable = new Draggable(containers, {
draggable: '.item',
swapAnimation: {
duration: 200,
easingFunction: 'ease-in-out',
}
});
Draggable поддерживает вложенные группы, когда внутри одного контейнера находятся несколько подгрупп. Для этого используется иерархия селекторов:
const nestedDraggable = new Draggable(document.querySelectorAll('.parent-group'), {
draggable: '.child-item',
handle: '.handle',
mirror: {
constrainDimensions: true,
}
});
Draggable предоставляет богатый набор событий, которые позволяют отслеживать действия с группами и элементами:
draggable.on('drag:start', (evt) => {
console.log('Начало перетаскивания', evt.source);
});
draggable.on('drag:stop', (evt) => {
console.log('Элемент перемещён в группу', evt.source.parentNode);
});
draggable.on('sortable:stop', (evt) => {
console.log('Элементы внутри группы переставлены');
});
Ключевые моменты:
Для управления перемещением элементов между группами можно использовать скрытые классы и фильтры:
const draggable = new Draggable(containers, {
draggable: '.item',
handle: '.handle',
invalid: ['.no-drag'],
});
Draggable поддерживает работу с динамическими группами:
const container = document.querySelector('.draggable-container');
const draggable = new Draggable(container, {
draggable: '.item'
});
// Добавление нового элемента
const newItem = document.createElement('div');
newItem.classList.add('item');
container.appendChild(newItem);
// Обновление Draggable
draggable.addContainer(container);
Для реализации интерактивных интерфейсов часто используется сортировка внутри групп:
const sortable = new Draggable(containers, {
draggable: '.item',
delay: 100,
sortable: true,
swapAnimation: {
duration: 300,
easingFunction: 'ease-in-out',
}
});
Грамотно настроенная группировка в Shopify Draggable позволяет создавать сложные интерактивные интерфейсы с множеством уровней вложенности и контролируемым перемещением элементов.