Dragula — это легковесная библиотека для реализации перетаскивания элементов между контейнерами и внутри одного контейнера. Основная концепция строится на управлении DOM-элементами напрямую, без сложной структуры данных или шаблонов. Библиотека обеспечивает минимальный API, но позволяет гибко настраивать поведение перетаскивания и события.
Dragula распространяется как через npm, так и через CDN. После подключения необходимо создать экземпляр Dragula, передав в конструктор массив контейнеров, элементы которых будут перемещаемыми.
import dragula from 'dragula';
const containers = [document.getElementById('container1'), document.getElementById('container2')];
const drake = dragula(containers);
Ключевые моменты:
Конструктор Dragula поддерживает объект настроек, позволяющий управлять поведением перетаскивания:
const drake = dragula(containers, {
moves: (el, source, handle, sibling) => handle.classList.contains('handle'),
accepts: (el, target, source, sibling) => !target.classList.contains('no-drop'),
copy: false,
revertOnSpill: true
});
true, если элемент можно перетаскивать. handle
позволяет задать область, с которой можно перетаскивать элемент.true, если элемент можно разместить в контейнере
target.true, при перетаскивании
создается копия элемента вместо перемещения.true, элемент
возвращается на исходное место при отпускании вне контейнера.Dragula предоставляет несколько событий, которые позволяют отслеживать процесс перетаскивания:
removeOnSpill.Пример использования событий:
drake.on('drop', (el, target, source, sibling) => {
console.log(`Элемент ${el.textContent} перемещён из ${source.id} в ${target.id}`);
});
Особенности работы с событиями:
Dragula позволяет управлять копированием элементов и их удалением вне контейнеров. Это полезно для создания интерфейсов типа «перетаскивание из библиотеки элементов» или «перетаскивание с удалением».
const drake = dragula(containers, {
copy: true,
removeOnSpill: true
});
Dragula напрямую манипулирует DOM, что обеспечивает простоту и скорость, но требует внимательности:
copy: false).handle для сложных
интерфейсов, чтобы избежать случайных перетаскиваний.accepts, если необходимо
запрещать перемещение между определёнными контейнерами.drop для
обновления внутреннего состояния приложения.Dragula совместим с современными браузерами и не зависит от фреймворков. Его можно интегрировать с React, Vue или Angular, но потребуется управлять синхронизацией состояния компонентов с DOM-изменениями Dragula. Для сложных интерфейсов рекомендуется использовать отдельный слой состояния, а Dragula использовать только для визуального перетаскивания.
Dragula добавляет классы .gu-transit и
.gu-mirror для перетаскиваемого элемента и его копии. Это
позволяет создавать анимации и эффекты:
.gu-mirror {
background-color: rgba(0, 0, 0, 0.1);
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}
.gu-transit {
opacity: 0.5;
}
Ключевые моменты стилизации:
.gu-mirror — визуальная копия элемента во время
перетаскивания..gu-transit — оригинальный элемент в процессе
перетаскивания.