Библиотека Dragula является легковесным решением для реализации перетаскивания элементов на веб-странице. Для её использования необходимо подключение как JavaScript, так и CSS части. Существует несколько способов установки:
Через 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
После установки можно подключить Dragula в проекте:
import dragula from 'dragula';
import 'dragula/dist/dragula.css';
Для работы Dragula требуется указать контейнеры, элементы внутри
которых будут перетаскиваться. Контейнер — это любой DOM-элемент,
например div или ul.
const containers = [
document.getElementById('left-container'),
document.getElementById('right-container')
];
const drake = dragula(containers);
После этого элементы внутри контейнеров становятся перетаскиваемыми.
При создании экземпляра Dragula можно передавать объект опций. Основные ключи:
moves: функция, которая определяет, можно ли
перемещать конкретный элемент. Принимает аргументы
(el, source, handle, sibling).
moves: function(el, source, handle, sibling) {
return handle.classList.contains('handle');
}accepts: функция, проверяющая возможность
перемещения элемента в другой контейнер. Аргументы
(el, target, source, sibling).
accepts: function(el, target) {
return target.id !== 'restricted-container';
}copy: если установлено true,
элементы будут копироваться вместо перемещения.
copy: truerevertOnSpill: если true, элементы
возвращаются в исходное место при отпускании вне контейнера.
revertOnSpill: trueremoveOnSpill: если true, элемент
удаляется при отпускании вне контейнера. Использовать осторожно, чтобы
не потерять данные.
direction: задаёт направление перетаскивания:
'vertical' или 'horizontal'. По умолчанию
'vertical'.
ignoreInputTextSelection: предотвращает
случайное перетаскивание при выделении текста в элементах
<input> или <textarea>.
Dragula предоставляет гибкую систему событий для отслеживания действий пользователя. Основные события:
Пример подписки на событие:
drake.on('drop', function(el, target, source, sibling) {
console.log('Элемент перемещён', el, 'в контейнер', target.id);
});
При включённой опции copy Dragula создаёт клонированный
элемент, который можно перемещать. При этом исходный элемент остаётся на
месте. Если требуется модифицировать клонированный элемент:
drake.on('cloned', function(clone, original, type) {
clone.style.backgroundColor = 'lightblue';
});
Иногда необходимо позволить перемещать только определённые элементы.
Для этого используется опция moves:
moves: function(el, source, handle, sibling) {
return el.tagName === 'LI'; // только элементы списка
}
Дополнительно можно задать класс для «хвата» (handle)
внутри элемента, чтобы перемещать его только при взаимодействии с
конкретной частью.
Два ключевых параметра: revertOnSpill и
removeOnSpill. Их логика различается:
revertOnSpill: true — элемент возвращается на исходное
место.removeOnSpill: true — элемент удаляется.Можно комбинировать события для дополнительной обработки:
drake.on('out', function(el, container, source) {
console.log('Элемент покинул контейнер', container.id);
});
Dragula позволяет перемещать элементы между любым количеством
контейнеров. Важно правильно настроить функцию accepts,
чтобы ограничить перенос:
accepts: function(el, target) {
return target.classList.contains('droppable');
}
Это предотвращает попадание элементов в контейнеры, где их быть не должно.
Dragula сохраняет порядок DOM-элементов после перетаскивания, что упрощает дальнейшую обработку данных на стороне клиента. Чтобы получить актуальный порядок:
const items = Array.from(document.getElementById('left-container').children);
Можно использовать это для сохранения состояния на сервере через AJAX.
Dragula корректно работает с элементами, добавленными динамически
через JavaScript, если контейнер уже был инициализирован. Для этого
достаточно обновить DOM без переинициализации Dragula. В случае
добавления новых контейнеров необходимо вызвать
drake.containers.push(newContainer).
Эта подробная конфигурация позволяет гибко управлять поведением Dragula, контролировать перенос элементов, их копирование, ограничения по контейнерам и события, обеспечивая полное соответствие пользовательским требованиям интерфейса.