Dragula — это легковесная библиотека для реализации перетаскивания элементов на веб-страницах. Она предоставляет простой интерфейс для создания drag-and-drop функционала с минимальной конфигурацией, при этом поддерживает гибкую настройку поведения через цепочки вызовов методов.
Цепочки вызовов методов в Dragula позволяют удобно настраивать контейнеры, ограничения, события и дополнительные эффекты без необходимости многократного обращения к объекту Dragula. Это обеспечивает лаконичный, читаемый код и уменьшает вероятность ошибок.
Создание экземпляра Dragula начинается с передачи массивов контейнеров:
const containers = [document.getElementById('left'), document.getElementById('right')];
const drake = dragula(containers);
Ключевые моменты:
containers — массив HTML-элементов, между которыми
возможна перетаскиваемость.drake — объект Dragula, на котором строятся цепочки
методов для дальнейшей настройки.Dragula поддерживает несколько методов, возвращающих сам объект для цепочного вызова. Основные из них:
dragula.containersЭтот метод позволяет динамически добавить или изменить контейнеры:
drake.containers.push(document.getElementById('extra'));
Можно добавлять контейнеры после инициализации, сохраняя уже установленные настройки и события.
drake.optionsПозволяет задать или изменить опции:
drake.options({
moves: function (el, source, handle, sibling) {
return handle.classList.contains('handle');
},
accepts: function (el, target, source, sibling) {
return !target.classList.contains('disabled');
},
revertOnSpill: true
});
moves — определяет, может ли элемент
быть перетянутым.accepts — контролирует, можно ли
поместить элемент в конкретный контейнер.revertOnSpill — возвращает элемент на
исходное место, если его сбросили вне контейнера.Метод options возвращает объект drake, что
позволяет использовать цепочки вызовов:
drake.options({ revertOnSpill: true })
.on('drop', (el, target, source, sibling) => {
console.log(`Элемент ${el.id} перемещён`);
});
Dragula использует событийный подход для реагирования на действия
пользователя. Методы on и off поддерживают
цепочки:
drake.on('drag', el => el.classList.add('dragging'))
.on('drop', (el, target, source) => {
el.classList.remove('dragging');
console.log(`Элемент перемещён из ${source.id} в ${target.id}`);
})
.on('over', (el, container) => container.classList.add('over'))
.on('out', (el, container) => container.classList.remove('over'));
Пояснение:
drag — событие начала перетаскивания.drop — элемент был успешно перемещён.over — элемент находится над контейнером.out — элемент покинул контейнер.Все методы возвращают объект drake, что обеспечивает
возможность продолжить цепочку вызовов.
Цепочки методов позволяют комбинировать фильтры и условия:
drake.options({
moves: (el, source, handle) => handle.classList.contains('handle'),
accepts: (el, target) => !target.classList.contains('disabled')
})
.on('drop', (el, target, source) => {
if (target.id === 'right') {
el.style.backgroundColor = 'lightgreen';
}
});
Здесь логика фильтров встроена напрямую в цепочку, что улучшает читаемость и предотвращает разброс кода.
Dragula допускает добавление пользовательских методов для цепочек через проксирование или обёртки:
drake.highlightOnDrag = function() {
this.on('drag', el => el.classList.add('highlight'))
.on('drop', el => el.classList.remove('highlight'));
return this;
};
drake.highlightOnDrag()
.options({ revertOnSpill: true });
Такой подход позволяет создавать повторно используемые цепочки с собственными методами без изменения исходного API.
Методы Dragula интегрируются с манипуляциями DOM:
drag и
drop.Пример цепочки с динамическими стилями:
drake.on('drag', el => el.style.opacity = '0.5')
.on('drop', el => el.style.opacity = '1')
.on('over', (el, container) => container.style.border = '2px dashed #3498db')
.on('out', (el, container) => container.style.border = '');
Dragula допускает несколько последовательных цепочек на одном объекте
drake:
drake.options({ revertOnSpill: true })
.on('drag', el => console.log('Начало перетаскивания'))
.on('drop', (el, target) => console.log('Элемент перемещён'))
.on('over', (el, container) => console.log('Над контейнером'));
Каждая цепочка может быть независимой или комбинироваться с дополнительными методами для динамических изменений.
Для крупных проектов цепочки вызовов позволяют:
Использование цепочек методов — это не только удобство синтаксиса, но и эффективный инструмент масштабирования drag-and-drop интерфейсов.