Dragula — это легковесная библиотека для реализации drag-and-drop функционала в веб-приложениях. Для начала работы требуется подключить её в проект. Возможны два способа: через npm или CDN.
Через npm:
npm install dragula
Затем в JavaScript-файле:
import dragula from 'dragula';
import 'dragula/dist/dragula.css';
Через CDN:
<link rel="stylesheet" href="https://unpkg.com/dragula/dist/dragula.min.css">
<script src="https://unpkg.com/dragula/dist/dragula.min.js"></script>
Подключение стилей обязательно, так как Dragula использует встроенные CSS-классы для корректного отображения перетаскиваемых элементов.
Dragula работает с контейнерами — DOM-элементами, внутри которых находятся перетаскиваемые элементы.
const containers = [document.getElementById('container1'), document.getElementById('container2')];
const drake = dragula(containers, {
moves: function (el, source, handle, sibling) {
return true; // все элементы можно перетаскивать
},
copy: false, // копирование элементов отключено
revertOnSpill: true // возвращать элемент в исходное место, если он брошен вне контейнера
});
Ключевые параметры:
moves(el, source, handle, sibling) — определяет, можно
ли перемещать конкретный элемент.copy — создает копию элемента вместо перемещения.revertOnSpill — возвращает элемент, если он не был
корректно брошен.Dragula предоставляет ряд событий, которые позволяют отслеживать действия пользователя:
drag — когда пользователь начал перетаскивать
элемент.dragend — завершение перетаскивания.drop — элемент был перемещен в новый контейнер.over — элемент находится над контейнером.out — элемент покинул контейнер.cancel — отмена перетаскивания.Пример подписки на событие drop:
drake.on('drop', function(el, target, source, sibling) {
console.log(`Элемент ${el.id} перемещен из ${source.id} в ${target.id}`);
});
Dragula изначально ориентирован на десктопную среду, однако поддерживает сенсорные события через тач-устройства. На мобильных устройствах поведение drag-and-drop может отличаться по следующим аспектам:
touchstart/touchmove.Для улучшения мобильного опыта часто применяют следующие методы:
-webkit-user-select: none; для
предотвращения выделения текста при перетаскивании.moves.drake.on('drag', function() {
document.body.style.overflow = 'hidden';
});
drake.on('dragend', function() {
document.body.style.overflow = '';
});
Перетаскивание элементов на слабых устройствах может приводить к «подтормаживанию». Для минимизации задержек рекомендуется:
requestAnimationFrame при работе с
анимациями.drag и
drop.1. Ограничение перетаскивания по контейнерам:
const drake = dragula([container1, container2], {
accepts: function(el, target, source, sibling) {
return target.id !== 'container2'; // запрет на перемещение в container2
}
});
2. Динамическое создание контейнеров:
const dynamicContainers = [];
function addContainer(container) {
dynamicContainers.push(container);
drake.containers.push(container);
}
3. Drag-and-drop с копированием элементов:
const drake = dragula([container1, container2], {
copy: function(el, source) {
return source.id === 'container1'; // копировать только из container1
},
accepts: function(el, target) {
return target.id === 'container2';
}
});
Эти приёмы позволяют реализовать гибкие интерфейсы на мобильных устройствах, сочетая удобство сенсорного управления и стабильность работы.
Dragula поддерживает большинство современных браузеров, включая мобильные версии Chrome, Safari и Firefox. Однако необходимо учитывать:
Эти принципы позволяют создавать устойчивый drag-and-drop функционал с Dragula, адаптированный для мобильных устройств, без потери отзывчивости и удобства использования.