Dragula — это легковесная библиотека на JavaScript, предназначенная для реализации перетаскивания элементов между контейнерами. Она не требует использования фреймворков и предоставляет простой API для создания интерактивных интерфейсов с возможностью drag-and-drop. Основные возможности включают: перемещение элементов внутри одного контейнера, между разными контейнерами и контроль над допустимыми операциями перетаскивания.
import dragula from 'dragula';
const containers = [document.getElementById('container1'), document.getElementById('container2')];
const drake = dragula(containers);
В данном примере создаются два контейнера, между которыми возможен
перенос элементов. drake — объект Dragula, через который
настраиваются события и поведение.
Dragula позволяет детально управлять тем, какие элементы можно перетаскивать, и куда их можно помещать. Для этого используются следующие опции:
Пример:
const drake = dragula(containers, {
moves: function (el, source, handle, sibling) {
return handle.classList.contains('handle');
},
accepts: function (el, target, source, sibling) {
return target.id !== 'restricted';
},
copy: false,
revertOnSpill: true
});
Здесь элемент можно перемещать только за специальную ручку с классом
handle, и он не будет перемещен в контейнер с id
restricted.
Dragula предоставляет богатый набор событий, которые позволяют реагировать на действия пользователя и реализовывать интерактивный отклик интерфейса.
Основные события:
drag — вызывается при начале перетаскивания
элемента.dragend — срабатывает при завершении
перетаскивания.drop — событие успешного перемещения элемента в
контейнер.over / out — срабатывают при наведении
элемента на контейнер и уходе с него.remove — вызывается при удалении элемента вне
контейнера, если включена опция removeOnSpill.Пример подписки на события:
drake.on('drag', function(el) {
el.style.opacity = '0.5';
});
drake.on('drop', function(el, target, source, sibling) {
el.style.opacity = '';
console.log(`Элемент перемещен из ${source.id} в ${target.id}`);
});
drake.on('out', function(el, container, source) {
el.classList.add('highlight');
});
drake.on('over', function(el, container, source) {
el.classList.remove('highlight');
});
Тактильный отклик повышает удобство работы с интерфейсом. Dragula облегчает его реализацию через события и CSS:
drag) помогает пользователю понять, что элемент
активен.over/out) создаёт эффект, схожий с
«магнитом», притягивающим элемент.revertOnSpill)
обеспечивает визуальный отклик при ошибочном перетаскивании.Пример CSS для визуального отклика:
.gu-mirror {
background-color: rgba(0, 150, 136, 0.3);
border: 2px dashed #009688;
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}
.highlight {
border: 2px solid #ff5722;
}
.gu-mirror — это элемент, который Dragula создаёт как
копию перетаскиваемого объекта для визуализации перемещения. Добавление
теней и прозрачности усиливает ощущение объёма и движения.
Dragula позволяет реализовать сложные сценарии:
const newContainer = document.createElement('div');
document.body.appendChild(newContainer);
drake.containers.push(newContainer);
drop можно сохранять новое положение элементов и обновлять
данные на сервере.drake.on('drop', function(el, target, source) {
const order = Array.from(target.children).map(child => child.dataset.id);
fetch('/update-order', {
method: 'POST',
body: JSON.stringify(order),
headers: {'Content-Type': 'application/json'}
});
});
drag и drop, чтобы избежать задержек при
перетаскивании.Dragula сочетает простоту и гибкость, позволяя создавать интуитивно понятные интерфейсы с плавной анимацией и тактильным откликом. Правильная комбинация событий, стилей и логики обеспечивает высокое качество пользовательского опыта при любых сценариях drag-and-drop.