Dragula — это легковесная библиотека для реализации перетаскивания элементов между контейнерами на веб-странице. Она минималистична, не требует сложной настройки и отлично подходит для задач drag-and-drop без зависимости от фреймворков. Основной функционал Dragula строится вокруг контейнеров, из которых элементы можно перетаскивать, и событий, позволяющих управлять поведением элементов во время перемещения.
Для начала работы необходимо подключить библиотеку Dragula и определить контейнеры, между которыми будет происходить перемещение элементов:
const containers = [
document.getElementById('container1'),
document.getElementById('container2')
];
const drake = dragula(containers);
Здесь создаётся объект drake, который отвечает за все
операции drag-and-drop между указанными контейнерами. Важно помнить, что
каждый контейнер должен быть DOM-элементом, иначе
Dragula не сможет корректно отслеживать перемещение элементов.
Одним из ключевых событий Dragula является
over. Оно срабатывает в момент, когда
перетаскиваемый элемент входит в пределы контейнера. Это позволяет
выполнять действия, связанные с визуальным выделением контейнера или
проверкой возможности помещать туда элемент.
drake.on('over', function(el, container, source) {
container.classList.add('over-highlight');
});
Параметры функции:
el — перетаскиваемый элемент.container — контейнер, над которым находится элемент в
текущий момент.source — контейнер, из которого элемент был взят.Ключевой момент: container и
source могут совпадать, если элемент перемещается внутри
одного контейнера. Это важно учитывать при логике подсветки или
валидации перемещения.
Событие out работает в паре с over и
срабатывает, когда элемент покидает контейнер. Обычно вместе с
over используется для снятия визуального эффекта:
drake.on('out', function(el, container, source) {
container.classList.remove('over-highlight');
});
Таким образом, можно реализовать динамическую подсветку контейнеров при наведении перетаскиваемого элемента.
Dragula позволяет детально настраивать логику перетаскивания через параметры конфигурации при инициализации:
const drake = dragula(containers, {
moves: function(el, source, handle, sibling) {
return !el.classList.contains('no-drag');
},
accepts: function(el, target, source, sibling) {
return !target.classList.contains('disabled-container');
}
});
moves — определяет, какие элементы можно
перетаскивать.accepts — проверяет возможность помещать элемент в
конкретный контейнер.Эти функции работают синхронно с событиями over и
out, что позволяет управлять логикой подсветки и
ограничения контейнеров.
Пример с анимацией:
drake.on('over', function(el, container) {
container.style.transition = 'background-color 0.3s';
container.style.backgroundColor = '#f0f8ff';
});
drake.on('out', function(el, container) {
container.style.backgroundColor = '';
});
При работе с более чем двумя контейнерами событие over
особенно полезно для определения, над каким контейнером сейчас находится
элемент. Это позволяет:
drake.on('over', function(el, container) {
if (container.id === 'important-container') {
container.classList.add('highlight-important');
} else {
container.classList.add('highlight-normal');
}
});
Событие over является фундаментальным для построения
интерфейсов с перетаскиванием. Оно отвечает за момент наведения
элемента на контейнер, позволяет динамически изменять
визуальные состояния и комбинируется с функциями moves и
accepts для создания гибкой логики drag-and-drop.
Использование over вместе с out и
конфигурацией контейнеров обеспечивает полный контроль над поведением
элементов при наведении и облегчает создание интерактивных, отзывчивых
интерфейсов.