Библиотека Dragula предоставляет возможность создавать интерактивные перетаскиваемые элементы с минимальной настройкой. Одной из ключевых концепций является использование массива контейнеров. Контейнеры в Dragula представляют собой DOM-элементы, внутри которых элементы могут быть перетаскиваемыми.
Для создания функциональности перетаскивания необходимо передать Dragula массив контейнеров:
const containers = [
document.getElementById('container1'),
document.getElementById('container2'),
document.getElementById('container3')
];
const drake = dragula(containers);
Здесь каждый элемент массива — это DOM-узел, который будет участвовать в взаимодействии. Dragula автоматически добавляет обработчики событий для всех указанных контейнеров, позволяя перемещать элементы внутри контейнера и между ними.
Контейнеры можно добавлять и после инициализации Dragula с помощью
метода drake.containers.push():
const newContainer = document.getElementById('container4');
drake.containers.push(newContainer);
После добавления новый контейнер становится частью существующей системы перетаскивания. Важно помнить, что порядок контейнеров в массиве не влияет на работу Dragula, но может иметь значение для некоторых кастомных условий в колбэках.
Dragula позволяет гибко управлять, куда можно перемещать элемент. Для
этого используется опция accepts:
const drake = dragula(containers, {
accepts: function (el, target, source, sibling) {
return target.id !== 'container3'; // запрет перемещения в container3
}
});
Проверка выполняется для каждого контейнера, указанного в массиве. Таким образом, можно создавать сложные правила перемещения между контейнерами, сохраняя массив контейнеров общим для всей логики.
Dragula предоставляет набор событий, связанных с перемещением
элементов. Для массивов контейнеров особенно важны события
drop, drag, over и
out:
drake.on('drop', (el, target, source, sibling) => {
console.log(`Элемент ${el.id} перемещен из ${source.id} в ${target.id}`);
});
drake.on('over', (el, container) => {
container.style.background = '#f0f0f0';
});
drake.on('out', (el, container) => {
container.style.background = '';
});
События применяются к каждому контейнеру в массиве. При добавлении
нового контейнера через drake.containers.push() события
автоматически начинают работать и с ним.
Dragula автоматически отслеживает все потомки
контейнеров как потенциально перетаскиваемые элементы. Если
необходимо ограничить список элементов, можно использовать опцию
moves:
const drake = dragula(containers, {
moves: function (el, source, handle, sibling) {
return el.classList.contains('draggable'); // только элементы с классом draggable
}
});
Таким образом, массив контейнеров задает область работы Dragula, а
moves контролирует конкретные элементы, доступные для
перетаскивания.
Для удаления контейнера из массива используется стандартное обращение к массиву:
const index = drake.containers.indexOf(containerToRemove);
if (index !== -1) {
drake.containers.splice(index, 1);
}
После удаления контейнера элементы внутри него перестают участвовать в перетаскивании. События, привязанные к удаленному контейнеру, больше не срабатывают.
drake.containers.push() и
splice.accepts и
ограничивать элементы с помощью moves.Массив контейнеров является центральной структурой для организации перетаскиваемых зон и обеспечивает гибкое управление логикой перемещения элементов между ними.