Dragula — это библиотека для перетаскивания элементов на странице с
минимальной конфигурацией. Она обеспечивает интуитивный
интерфейс drag-and-drop, не требующий сложной настройки событий
mousedown, mousemove и mouseup.
Основная цель Dragula — предоставить готовое решение для
перемещения элементов между контейнерами с минимальными
усилиями.
Библиотека работает с любыми HTML-элементами, поддерживает динамическое добавление и удаление контейнеров, а также обеспечивает поддержку множественных контейнеров и вложенных структур.
Dragula можно подключить через CDN или npm. Вариант с CDN выглядит так:
<link rel="stylesheet" href="https://unpkg.com/dragula/dist/dragula.min.css">
<script src="https://unpkg.com/dragula/dist/dragula.min.js"></script>
Для npm:
npm install dragula
Импорт в проекте с модульной системой:
import dragula from 'dragula';
import 'dragula/dist/dragula.css';
Для создания базового drag-and-drop достаточно передать массив контейнеров:
const containers = [document.getElementById('left'), document.getElementById('right')];
const drake = dragula(containers);
После этого элементы внутри контейнеров становятся перетаскиваемыми. Dragula автоматически обрабатывает перетаскивание между контейнерами, создаёт визуальные подсказки, и позволяет возвращать элементы в исходное положение, если перетаскивание отменено.
Dragula предоставляет множество опций для гибкой настройки:
moves — функция, определяющая, можно
ли перетаскивать конкретный элемент:dragula(containers, {
moves: (el, source, handle, sibling) => {
return handle.classList.contains('handle');
}
});
accepts — функция, задающая правила, в
какой контейнер элемент можно поместить:dragula(containers, {
accepts: (el, target, source, sibling) => {
return target.id !== 'forbidden';
}
});
copy — позволяет создавать копии
перетаскиваемых элементов вместо перемещения:dragula(containers, { copy: true });
revertOnSpill — возвращает элемент в
исходное место, если он был «выброшен» вне контейнера:dragula(containers, { revertOnSpill: true });
removeOnSpill — удаляет элемент, если
его бросить за пределы контейнеров:dragula(containers, { removeOnSpill: true });
Dragula предоставляет обширную систему событий, которые позволяют контролировать весь процесс перетаскивания:
drag — начинается перетаскивание:drake.on('drag', el => {
el.style.opacity = '0.5';
});
drop — элемент успешно перемещён:drake.on('drop', (el, target, source, sibling) => {
console.log('Элемент перемещён', el, 'в контейнер', target.id);
});
over / out — элемент
находится над контейнером или покидает его:drake.on('over', (el, container) => {
container.classList.add('highlight');
});
drake.on('out', (el, container) => {
container.classList.remove('highlight');
});
cancel / remove — элемент
отменён или удалён:drake.on('remove', el => {
console.log('Элемент удалён:', el);
});
Простота и минимальная настройка В отличие от стандартного API HTML5 Drag and Drop, Dragula не требует обработки низкоуровневых событий. Достаточно указать контейнеры, и библиотека сама управляет всей логикой.
Кроссбраузерная поддержка Dragula корректно работает во всех современных браузерах и поддерживает мобильные устройства с сенсорными экранами.
Визуальная обратная связь Автоматическая подсветка контейнеров и placeholder для перетаскиваемого элемента делают интерфейс более понятным и интуитивным, чего сложно достичь с нативным API без дополнительного кода.
Поддержка множественных контейнеров и динамических изменений DOM Можно добавлять новые контейнеры и элементы на лету, Dragula сразу интегрирует их в существующую логику drag-and-drop.
Гибкая настройка поведения Функции
moves, accepts, copy,
revertOnSpill позволяют реализовать практически любые
требования к перетаскиванию, без необходимости вручную проверять условия
при каждом событии.
Событийная система Dragula предоставляет готовую систему событий, что облегчает интеграцию с другими частями приложения и обеспечивает чистую архитектуру без «грязных» обработчиков DOM.
Лёгкость интеграции с фреймворками Dragula легко работает с React, Vue и Angular, обеспечивая реактивное обновление состояния при перетаскивании элементов, без необходимости писать сложные мосты между нативными событиями и виртуальным DOM.
Dragula можно комбинировать с другими библиотеками для реализации продвинутых сценариев:
drop и dragend.Dragula рассчитан на работу с большими списками. Рекомендуется:
mirrorContainer для кастомного
расположения элемента-зеркала, чтобы не создавать лишних пересчётов
DOM.Dragula объединяет в себе простоту, гибкость и мощный набор инструментов, которые позволяют реализовать drag-and-drop интерфейсы быстро и эффективно, избегая типичных проблем с нативным HTML5 API и кроссбраузерными багами.