Dragula — это лёгкая библиотека для организации перетаскивания элементов в браузере. Она обеспечивает drag-and-drop функциональность без сложных зависимостей, работает с нативными DOM-элементами и поддерживает несколько контейнеров. Основной принцип работы заключается в управлении событиями мыши и обновлении DOM при перемещении элементов.
Dragula использует следующие ключевые концепты:
drag, drop, over,
out, cancel.Создание Dragula-инстанса происходит через вызов функции
dragula() с массивом контейнеров:
const drake = dragula([container1, container2], {
moves: (el, source, handle, sibling) => true,
accepts: (el, target, source, sibling) => true,
copy: false,
revertOnSpill: true,
removeOnSpill: false
});
Dragula предоставляет богатый набор событий для управления поведением перетаскивания. Основные из них:
drag — вызывается при начале перетаскивания
элемента.drop — срабатывает при отпускании элемента.over — элемент наведен на контейнер.out — элемент покидает контейнер.cancel — перетаскивание отменено пользователем или
программно.shadow — временный элемент, показывающий будущую
позицию перетаскиваемого объекта.Пример подписки на события:
drake.on('drag', (el) => {
el.style.opacity = '0.5';
});
drake.on('drop', (el, target, source, sibling) => {
el.style.opacity = '';
console.log(`Элемент перемещен из ${source.id} в ${target.id}`);
});
Для работы с большим количеством элементов (сотни и тысячи DOM-узлов) важно использовать виртуализацию, чтобы минимизировать нагрузку на DOM и ускорить перетаскивание. Dragula сам по себе не реализует виртуализацию, но хорошо интегрируется с библиотеками виртуализации, такими как Virtual Scroller или React Window.
Хранение данных отдельно от DOM Все элементы должны представляться через массив данных. DOM создаётся только для видимой области.
Синхронизация с Dragula Dragula работает с реальными DOM-элементами. Поэтому при виртуализации необходимо:
drag только для реально
отрендеренных элементов.Обработка прокрутки Виртуализированные списки могут динамически рендерить элементы при скролле. Dragula должен быть уведомлён о добавлении/удалении элементов:
function updateDragulaContainers(visibleElements) {
drake.containers = visibleElements.map(el => el.parentNode);
}
Dragula позволяет полностью контролировать поведение перетаскивания через опции и колбэки:
moves(el, source, handle, sibling) — определяет, можно
ли начать перетаскивание элемента.accepts(el, target, source, sibling) — определяет,
можно ли положить элемент в контейнер.invalid(el, handle) — исключает элементы из
перетаскивания.direction — указывает направление сортировки:
'vertical' или 'horizontal'.Пример ограничения перетаскивания по горизонтали:
const drake = dragula([container], {
direction: 'horizontal',
moves: (el) => !el.classList.contains('fixed')
});
Dragula часто используют вместе с фреймворками и библиотеками визуализации:
querySelectorAll для контейнеров.drag и
drop.Эти принципы позволяют Dragula эффективно управлять даже большим количеством элементов, обеспечивая плавный пользовательский опыт и лёгкость интеграции с современными фреймворками и библиотеками виртуализации.