Dragula — это лёгкая библиотека для реализации drag-and-drop в
веб-приложениях на JavaScript. Она обеспечивает простое перетаскивание
элементов между контейнерами и внутри одного контейнера без
необходимости вручную работать с событиями mousedown,
mousemove и mouseup.
Ключевой особенностью Dragula является минимальная конфигурация и автоматическая обработка всех действий пользователя, включая визуальные эффекты перемещения и вставку элемента в новый контейнер.
Для начала работы с Dragula необходимо подключить библиотеку через CDN или установить её через npm:
import dragula from 'dragula';
import 'dragula/dist/dragula.css';
Создание экземпляра Dragula происходит вызовом функции
dragula(), в которую передаётся массив контейнеров:
const containers = [document.getElementById('left'), document.getElementById('right')];
const drake = dragula(containers);
После этого элементы внутри указанных контейнеров становятся перетаскиваемыми.
Dragula позволяет гибко управлять поведением перетаскивания через объект конфигурации:
moves — функция, определяющая, какие
элементы можно перетаскивать:const drake = dragula(containers, {
moves: (el, source, handle, sibling) => handle.classList.contains('handle')
});
accepts — функция, ограничивающая
контейнеры, в которые можно вставить элемент:const drake = dragula(containers, {
accepts: (el, target, source, sibling) => target.id !== 'left'
});
copy — позволяет создавать копию
элемента вместо его перемещения:const drake = dragula(containers, { copy: true });
revertOnSpill — возвращает элемент на
исходное место, если он был сброшен вне контейнера:const drake = dragula(containers, { revertOnSpill: true });
Dragula предоставляет события, которые помогают отслеживать процесс перетаскивания:
drag — элемент начал
перемещаться:drake.on('drag', (el) => {
el.style.opacity = '0.5';
});
drop — элемент был сброшен в новый
контейнер:drake.on('drop', (el, target, source, sibling) => {
el.style.opacity = '1';
console.log(`Элемент перемещён из ${source.id} в ${target.id}`);
});
over и out — элемент
находится над контейнером или покидает его:drake.on('over', (el, container) => container.classList.add('highlight'));
drake.on('out', (el, container) => container.classList.remove('highlight'));
remove — элемент удалён при
перетаскивании за пределы всех контейнеров:drake.on('remove', (el, container, source) => el.remove());
Использование DevTools помогает анализировать работу Dragula и отлаживать сложные сценарии:
Просмотр DOM во время drag-and-drop: DevTools
позволяет наблюдать реальное перемещение элемента, его вставку и
изменение контейнера. Dragula добавляет элементу класс
gu-transit во время перетаскивания, что удобно для
визуальной отладки.
Отслеживание событий: Вкладка Event Listeners
показывает все события Dragula (drag, drop,
over, out). Это позволяет убедиться, что
конфигурации moves и accepts работают
корректно.
Изменение стилей на лету: Стили
.gu-mirror и .gu-transit используются Dragula
для отображения перетаскиваемого элемента и его копии. Через DevTools
можно экспериментировать с opacity, border,
box-shadow для улучшения визуальной обратной
связи.
Проверка контейнеров и элементов: С помощью панели Elements можно динамически добавлять или удалять контейнеры и отслеживать, как Dragula реагирует на новые элементы. Это помогает создавать гибкие интерфейсы с динамическими списками.
drake.containers.push(document.getElementById('new-container'));
drake.containers = drake.containers.filter(c => c.id !== 'old-container');
drake.start(); // вручную инициирует процесс drag
drake.end(); // завершает drag
drake.on('cloned', (clone, original) => {
clone.addEventListener('click', original.onclick);
});
.gu-mirror,
.gu-transit для визуальной отладки.console.log в событиях Dragula для
отслеживания источника и цели перемещения.moves и accepts,
чтобы предотвратить неожиданное поведение.revertOnSpill для безопасного тестирования
перетаскивания, когда элементы не должны теряться.Dragula минимально нагружает DOM и события браузера, но для больших списков следует:
Использование этих подходов обеспечивает плавное и предсказуемое поведение drag-and-drop даже в сложных интерфейсах.