Библиотека Dragula предоставляет удобный и гибкий способ реализации перетаскивания элементов между контейнерами. Поддержка нескольких контейнеров одновременно позволяет строить сложные интерфейсы с динамическими списками, досками задач или каталогами товаров.
Создание Dragula-инстанса с несколькими контейнерами выполняется через передачу массива DOM-элементов:
const containers = [
document.getElementById('container1'),
document.getElementById('container2'),
document.getElementById('container3')
];
const drake = dragula(containers);
Ключевые моменты:
Dragula предоставляет возможность контролировать, куда можно
перемещать элементы. Для этого используется опция moves и
accepts:
const drake = dragula(containers, {
moves: (el, source, handle, sibling) => {
return !el.classList.contains('no-drag');
},
accepts: (el, target, source, sibling) => {
return target.id !== 'container3';
}
});
moves — определяет, какие элементы можно брать за
перетаскивание. В примере элементы с классом no-drag нельзя
перетаскивать.accepts — определяет, можно ли вставить элемент в
конкретный контейнер. Здесь элементы не могут попадать в
container3.При работе с несколькими контейнерами особенно важны события, которые позволяют отслеживать перемещения и обновлять данные:
drag — начинается процесс перетаскивания.drop — элемент помещён в контейнер.over — курсор находится над контейнером.out — курсор покидает контейнер.remove — элемент удалён, если включена опция
removeOnSpill.Пример использования событий для синхронизации данных:
drake.on('drop', (el, target, source, sibling) => {
console.log(`Элемент ${el.textContent} перемещён из ${source.id} в ${target.id}`);
updateDataModel(el, target, source);
});
Особенности работы с событиями:
source и target, чтобы корректно обновлять
внутреннюю модель данных.sibling позволяет определить, перед каким элементом был
вставлен перетаскиваемый элемент.Dragula позволяет добавлять контейнеры после инициализации:
const newContainer = document.getElementById('container4');
drake.containers.push(newContainer);
Чтобы ограничить перетаскивание для отдельных контейнеров, можно использовать кастомные функции:
const drake = dragula(containers, {
accepts: (el, target, source, sibling) => {
if (source.id === 'container1' && target.id === 'container2') {
return el.dataset.allowed === 'true';
}
return true;
}
});
Dragula поддерживает автоматическое добавление CSS-классов:
gu-transit — применяется к элементу, который
перемещается.gu-mirror — создаётся зеркальное отображение элемента
при перетаскивании.gu-hide — скрывает оригинальный элемент на время
перетаскивания.Для кастомизации можно подключать собственные стили и анимации, например:
.gu-mirror {
background-color: rgba(0, 150, 255, 0.3);
border: 2px dashed #0096ff;
}
Dragula корректно обрабатывает вложенные контейнеры:
containers.accepts для предотвращения неправильного
поведения.При большом количестве элементов и контейнеров рекомендуется:
drop
и drag.Эти меры существенно повышают отзывчивость интерфейса и предотвращают лаги при перетаскивании.