Dragula — это легковесная библиотека для реализации перетаскивания элементов между контейнерами в браузере. Она ориентирована на простоту использования и совместимость с различными структурами DOM, что делает её идеальной для создания интерактивных интерфейсов, таких как канбан-доски.
Для подключения Dragula достаточно добавить библиотеку через npm или CDN. После этого создается экземпляр dragula с указанием контейнеров, элементы которых будут перетаскиваться:
import dragula from 'dragula';
const containers = [document.querySelector('#todo'), document.querySelector('#in-progress'), document.querySelector('#done')];
const drake = dragula(containers);
Здесь containers — массив DOM-элементов, которые поддерживают перетаскивание. Любой элемент внутри этих контейнеров может быть перемещен по умолчанию.
Dragula предоставляет гибкие возможности конфигурации через объект опций:
const drake = dragula(containers, {
moves: (el, source, handle, sibling) => handle.classList.contains('handle'),
copy: false,
revertOnSpill: true,
direction: 'vertical'
});
true, элементы копируются
вместо перемещения.'vertical' или 'horizontal'.Использование handle позволяет создавать элементы с конкретными зонами захвата, что особенно полезно для карточек канбан-доски с кнопками или другими интерактивными элементами.
Dragula генерирует множество событий, которые дают полный контроль над процессом перетаскивания:
Пример использования события drop для обновления
состояния канбан-доски:
drake.on('drop', (el, target, source, sibling) => {
const newColumn = target.id;
const itemId = el.dataset.id;
updateBoardState(itemId, newColumn);
});
Здесь updateBoardState — функция, синхронизирующая состояние фронтенда с бэкендом, чтобы изменения в канбан-доске сохранялись.
Dragula автоматически поддерживает перенос элементов между разными контейнерами. При этом важно учитывать ключевые аспекты для канбан-досок:
accepts для контроля, какие элементы разрешено
перемещать в конкретный контейнер:accepts: (el, target, source, sibling) => {
return target.id !== 'done' || el.dataset.priority !== 'high';
}
Поддержка порядка элементов. Dragula сохраняет визуальный порядок, перемещая элементы относительно соседей. Это особенно важно для сортировки задач по приоритету.
Кастомизация визуальной подсказки. Событие
drag позволяет изменить стили элемента в момент
перемещения:
drake.on('drag', el => {
el.style.opacity = '0.5';
});
drake.on('dragend', el => {
el.style.opacity = '';
});
В канбан-досках часто добавляются новые колонки и карточки. Dragula
поддерживает динамическое добавление контейнеров через метод
drake.containers.push(newContainer):
const newColumn = document.querySelector('#new-column');
drake.containers.push(newColumn);
Это позволяет расширять доску без необходимости пересоздавать экземпляр Dragula.
Dragula легко интегрируется с React, Vue или Angular. Основной принцип — передавать DOM-узлы контейнеров в Dragula и отслеживать события для синхронизации состояния с виртуальным DOM:
useRef для получения DOM-элементов
колонок.ref и mounted для
инициализации dragula после рендеринга.ViewChild и
AfterViewInit.Для сценариев, где задача должна дублироваться (например, создание шаблонов), используется опция copy:
const drake = dragula(containers, { copy: true });
При этом оригинальный элемент остается на месте, а перемещенный — создается новый экземпляр.
Dragula не предоставляет встроенной анимации, но с помощью CSS и событий можно создавать плавные эффекты:
.gu-mirror {
transition: transform 0.2s ease;
}
.gu-transit {
opacity: 0.7;
}
Использование этих классов позволяет сделать интерфейс канбан-доски более отзывчивым и наглядным.
data-id. Обеспечивает корректную синхронизацию состояния
при событиях drop и remove.drop,
remove и out используются для обновления базы
данных или локального хранилища.Dragula сочетает в себе минимализм и мощь управления DOM, что делает его идеальным инструментом для реализации интерактивных канбан-досок с поддержкой перетаскивания, динамических колонок и сложных пользовательских сценариев.