Dragula — это библиотека для реализации перетаскивания элементов между контейнерами в браузере с минимальными усилиями. Она ориентирована на простоту использования, но при этом предоставляет гибкие возможности для настройки поведения перетаскивания. Dragula работает с нативными событиями мыши и тач-событиями, что позволяет ей корректно функционировать на десктопных и мобильных устройствах.
Основной объект — dragula(containers, options), где:
Ключевые события Dragula, на которые можно подписаться:
drag — момент начала перетаскивания.drop — момент окончания перетаскивания и помещения
элемента в новый контейнер.over / out — событие наведения или выхода
элемента из контейнера.cancel — отмена перетаскивания.Эти события позволяют гибко контролировать поведение элементов и интегрировать библиотеку с пользовательским интерфейсом.
Параметр options предоставляет несколько ключевых
свойств:
true,
если элемент можно перетаскивать. Принимает параметры
(el, source, handle, sibling).(el, target, source, sibling).true, если элемент не должен
быть перетаскиваемым.true, создаётся копия элемента при перетаскивании вместо
перемещения оригинала.Пример настройки ограничения перетаскивания только по определённой части элемента:
dragula([container1, container2], {
moves: function(el, source, handle) {
return handle.classList.contains('handle');
}
});
Dragula автоматически добавляет классы к элементам для визуального обозначения состояния:
gu-transit — элемент в процессе перетаскивания.gu-mirror — копия элемента, которая следует за
курсором.gu-hide — временно скрытый элемент при создании
зеркала.Для улучшения UX рекомендуется использовать CSS-переходы при добавлении или удалении классов:
.gu-mirror {
opacity: 0.8;
transform: scale(1.05);
transition: transform 0.2s ease, opacity 0.2s ease;
}
Dragula изначально использует нативные события
mousedown, mousemove, mouseup и
их тач-аналоги. Различия в реализации этих событий в разных браузерах
требуют внимательной настройки:
touchmove часто
блокируются стандартным поведением прокрутки. Необходимо предотвращать
event.preventDefault() в начале перетаскивания, чтобы
избежать конфликтов.dragula-mirror, но в Firefox при быстром движении курсора
могут возникать артефакты позиционирования, которые решаются добавлением
will-change: transform; к зеркалу.classList и CustomEvent.Различия в рендеринге элементов и реакциях браузеров могут приводить к «дерганию» элементов:
requestAnimationFrame для обновления
позиции зеркала уменьшает лаги на слабых устройствах.position и top/left на
элементе после завершения перетаскивания предотвращает наложение стилей
контейнера.mousemove и touchmove снижает нагрузку на
браузер при работе с большими списками элементов.Для корректной работы на разных устройствах Dragula позволяет использовать кастомные обработчики:
scroll
контейнера.overflow: hidden в родительских контейнерах
для предотвращения выхода зеркала за пределы видимой области.Эти меры обеспечивают одинаковый опыт взаимодействия пользователя независимо от браузера и устройства.
Dragula легко интегрируется с современными фреймворками. Основные подходы:
drop для сохранения порядка элементов.Такая интеграция позволяет создавать сложные интерфейсы с перетаскиваемыми списками, сетками и даже drag-and-drop формами с минимальным количеством кода, сохраняя совместимость с основными браузерами.