Dragula — это легковесная библиотека для организации drag-and-drop интерфейсов в веб-приложениях на JavaScript. Она обеспечивает перенос элементов между контейнерами и внутри одного контейнера с минимальной настройкой. Ключевым преимуществом является простота использования при высокой гибкости: события drag-and-drop обрабатываются автоматически, но при этом доступны расширенные настройки.
Основная идея Dragula заключается в отслеживании элементов DOM и их перемещении между контейнерами, заданными в настройках. Библиотека не накладывает строгих ограничений на структуру данных и позволяет работать с любыми HTML-элементами.
Создание Dragula начинается с вызова функции dragula,
которой передается массив контейнеров:
const containers = [document.querySelector('#container1'), document.querySelector('#container2')];
const drake = dragula(containers);
drake — объект, через который управляется поведение
drag-and-drop.Методы объекта drake:
drake.containers — массив текущих контейнеров.drake.start(item) — принудительно начинает перенос
указанного элемента.drake.cancel(revert = true) — отменяет текущее
перемещение.drake.remove() — удаляет элемент из DOM после переноса,
если это необходимо.drake.destroy() — полностью отключает Dragula для всех
контейнеров.Dragula предоставляет набор событий, позволяющих гибко контролировать процесс перетаскивания:
drag — начинается перетаскивание элемента.drop — элемент был отпущен в контейнере.over — элемент находится над контейнером.out — элемент покинул контейнер.cancel — операция переноса была отменена.cloned — элемент был склонирован (используется при
настройках копирования).Пример подписки на событие:
drake.on('drop', function(el, target, source, sibling) {
console.log('Элемент перемещен:', el);
console.log('Новый контейнер:', target);
});
el — перемещаемый элемент.target — контейнер, в который элемент помещен.source — исходный контейнер.sibling — элемент, перед которым вставляется
переносимый элемент, либо null.Dragula позволяет тонко настраивать поведение через объект опций при инициализации:
const drake = dragula(containers, {
moves: function(el, source, handle, sibling) {
return handle.classList.contains('handle');
},
accepts: function(el, target, source, sibling) {
return !target.classList.contains('forbidden');
},
copy: false,
revertOnSpill: true
});
Ключевые параметры:
moves(el, source, handle, sibling) — функция,
определяющая, можно ли начать перенос с данного элемента. Обычно
используется для ограничения перетаскивания только по определенной
области (например, по «ручке»).accepts(el, target, source, sibling) — определяет,
можно ли поместить элемент в конкретный контейнер.copy — если true, элементы копируются
вместо перемещения.revertOnSpill — возвращает элемент в исходное положение
при броске вне контейнеров.direction — ограничивает направление перемещения
('vertical' или 'horizontal').invalid — функция, которая запрещает перетаскивание
определенных элементов (например, кнопок или заголовков).Хотя Dragula напрямую работает с DOM, управление данными часто необходимо для синхронизации с состоянием приложения. Обычно используется два подхода:
let items = ['А', 'Б', 'В'];
drake.on('drop', function(el, target, source, sibling) {
const movedItem = el.dataset.item;
items = items.filter(i => i !== movedItem);
// Вставка в новое место
items.splice(Array.from(target.children).indexOf(el), 0, movedItem);
});
data-id.drop обновляется соответствующий объект в
массиве данных.drake.containers.push(newContainer).copy позволяет создавать копии элементов при
перетаскивании, полезно для списков шаблонов.accepts
позволяет создавать сложные правила, например, запрет перемещения одного
типа элементов в контейнер другого типа.Dragula хорошо интегрируется с фреймворками типа React или Vue через
управление жизненным циклом контейнеров и элементов. Важно использовать
destroy() при удалении контейнеров, чтобы избежать утечек
памяти. Также можно комбинировать Dragula с библиотеками для анимации,
например, с GSAP, для плавного перемещения элементов.
revertOnSpill для предотвращения случайных
потерь элементов.out и over для
динамического изменения состояния контейнеров.Dragula сочетает простоту и гибкость, позволяя создавать как базовые списки с drag-and-drop, так и сложные интерфейсы с множественными контейнерами, копированием элементов и строгой валидацией.