Dragula — это легковесная библиотека для организации перетаскивания элементов в интерфейсе без сложных зависимостей. Она предоставляет простой API для управления drag-and-drop, поддерживает как сортировку элементов внутри контейнеров, так и перенос между ними. Основной принцип работы Dragula — использование событий и колбэков для контроля поведения элементов во время перетаскивания.
Инициализация Dragula осуществляется через создание экземпляра с указанием контейнеров:
const containers = [document.querySelector('#list1'), document.querySelector('#list2')];
const drake = dragula(containers);
Здесь containers — массив HTML-элементов, в которых
разрешено перемещение элементов. После создания экземпляра можно
подключать обработчики событий, таких как:
drag — элемент начал перетаскиваться.drop — элемент был отпущен в контейнере.over — элемент перемещается над контейнером.out — элемент покидает контейнер.cancel — отмена перетаскивания.remove — элемент удален из DOM.drake.on('drag', (el) => {
el.style.opacity = '0.5';
});
drake.on('drop', (el, target) => {
el.style.opacity = '';
});
Dragula позволяет гибко настраивать, какие элементы можно
перетаскивать, а какие — нет. Для этого используется функция
moves, которая возвращает true или
false:
const drake = dragula(containers, {
moves: (el, source, handle, sibling) => {
return handle.classList.contains('handle');
}
});
Параметры функции moves:
el — перетаскиваемый элемент.source — контейнер, из которого элемент берется.handle — элемент, с которого осуществляется
захват.sibling — элемент, перед которым будет вставлен
перетаскиваемый элемент.Также можно управлять разрешением на перенос элементов между
контейнерами через accepts:
accepts: (el, target, source, sibling) => {
return target.id !== 'forbidden';
}
Dragula не имеет официального плагин-системы, но предоставляет гибкий
API для расширений. Плагин в контексте Dragula — это
функция или объект, который подключает дополнительные возможности к
существующему экземпляру drake.
Типичный плагин содержит следующие элементы:
drag, drop, over,
out.Пример плагина, который добавляет подсветку контейнера при наведении элемента:
function highlightPlugin(drake, options = {}) {
const color = options.color || 'yellow';
drake.on('over', (el, container) => {
container.style.backgroundColor = color;
});
drake.on('out', (el, container) => {
container.style.backgroundColor = '';
});
return {
destroy: () => {
drake.off('over');
drake.off('out');
}
};
}
// Использование
const pluginInstance = highlightPlugin(drake, { color: 'lightblue' });
Важно предусматривать очистку плагина, чтобы не
оставлять “подвешенные” события. Стандартный подход — возвращать объект
с методом destroy, который удаляет все обработчики и
очищает внутренние состояния.
Плагины позволяют реализовать:
drop.Пример плагина с ограничением количества элементов:
function maxItemsPlugin(drake, maxCount) {
drake.on('drop', (el, target) => {
if (target.children.length > maxCount) {
target.removeChild(el);
}
});
return {
destroy: () => drake.off('drop')
};
}
maxItemsPlugin(drake, 3);
Dragula построен на принципе событийного посредника. Это позволяет плагинам подключаться к любым стадиям перетаскивания. Рекомендуется использовать комбинацию событий для создания сложных эффектов:
drag + over — изменение стилей
перетаскиваемого элемента и контейнера.drop + remove — синхронизация состояния с
внешними данными.out + cancel — реализация анимаций отмены
перетаскивания.Для масштабируемых проектов рекомендуется придерживаться структуры:
plugins/
├─ highlightPlugin.js
├─ maxItemsPlugin.js
├─ syncPlugin.js
Каждый плагин реализуется как самодостаточная
функция, принимающая экземпляр drake и опции. Это
облегчает подключение и тестирование, а также минимизирует риски
конфликтов между плагинами.
moves,
accepts, событийная модель.Такой подход делает Dragula удобным инструментом для построения динамических интерфейсов с поддержкой перетаскивания, а плагины позволяют адаптировать функциональность под любые задачи.