Библиотека Shopify Draggable предоставляет мощный инструмент для реализации перетаскивания элементов на странице. Для сложных интерфейсов важную роль играют механизмы ограничения движения элементов и валидации действий пользователя. Эти функции позволяют контролировать, куда элементы могут быть перемещены, и предотвращают нежелательные состояния интерфейса.
Основной способ ограничения перемещения элемента — использование
опции containers и draggable при инициализации
Draggable. Элементы можно перемещать только в пределах указанных
контейнеров:
const draggable = new Draggable.Sortable(
document.querySelectorAll('.container'),
{
draggable: '.item',
mirror: {
constrainDimensions: true,
}
}
);
Ключевые моменты:
draggable определяет селектор элементов, которые можно
перетаскивать.mirror.constrainDimensions фиксирует размеры элемента
во время перетаскивания.Если необходимо ограничить перемещение строго по вертикали или
горизонтали, используют событие drag:start для модификации
стилей:
draggable.on('drag:move', (event) => {
const axis = 'y'; // или 'x'
if (axis === 'y') {
event.data.dragEvent.deltaX = 0;
} else {
event.data.dragEvent.deltaY = 0;
}
});
Это позволяет точно контролировать траекторию движения и предотвращает смещение в нежелательном направлении.
В Draggable можно указать контейнеры, куда элемент может быть
перемещен, и запретить остальные. Для этого используется метод
canMove или кастомные проверки внутри события
drag:over:
draggable.on('drag:over', (event) => {
const validContainers = ['#allowed-container1', '#allowed-container2'];
if (!validContainers.includes(event.overContainer.id)) {
event.cancel();
}
});
Особенности работы:
event.overContainer указывает на контейнер, над которым
находится элемент.cancel() прерывает текущую операцию
перетаскивания.Валидация необходима для предотвращения ошибок интерфейса при неправильном размещении элементов. Основные подходы:
data-type:draggable.on('drag:over', (event) => {
if (event.dragEvent.source.dataset.type !== event.overContainer.dataset.accept) {
event.cancel();
}
});
draggable.on('sortable:sort', (event) => {
if (event.newIndex < 1) {
event.cancel();
}
});
Валидация позволяет исключить конфликтные состояния и гарантировать правильное распределение элементов по контейнерам.
Draggable позволяет контролировать максимальное количество элементов в контейнере:
draggable.on('drag:over', (event) => {
if (event.overContainer.children.length >= 5) {
event.cancel();
}
});
Это особенно полезно для списков с фиксированными слотами, таких как карточки товаров или элементы меню.
Дополнительно к логике на JavaScript можно использовать CSS для визуального ограничения:
.container {
overflow: hidden;
max-height: 300px;
}
.item {
cursor: grab;
}
overflow: hidden предотвращает визуальное выход за
пределы контейнера.Draggable предоставляет ряд событий, позволяющих реализовать сложные ограничения:
drag:start — можно задавать начальные
условия для элемента.drag:move — контроль траектории
движения.drag:over / drag:out —
проверка допустимости контейнера.sortable:sort — проверка и валидация
новой позиции элемента.Эти события дают полный контроль над поведением элементов, что позволяет строить надежные и гибкие интерфейсы.
Комбинируя все вышеописанные методы, можно создать систему с несколькими условиями:
draggable.on('drag:over', (event) => {
const maxItems = 3;
const allowedContainers = ['#container1', '#container2'];
if (!allowedContainers.includes(event.overContainer.id)) {
event.cancel();
}
if (event.overContainer.children.length >= maxItems) {
event.cancel();
}
if (event.dragEvent.source.dataset.type !== event.overContainer.dataset.accept) {
event.cancel();
}
});
Такой подход позволяет полностью контролировать:
drag:over и
sortable:sort для точной валидации.Эти методы делают работу с Draggable гибкой и безопасной, позволяя создавать сложные интерфейсы с точным контролем над поведением элементов.