Dragula — это легковесная библиотека для реализации
перетаскивания элементов между контейнерами и внутри них. Одним из
ключевых аспектов управления перетаскиваемыми элементами является
контроль событий, связанных с перемещением элементов, и особенно события
out, которое срабатывает при выходе элемента из
контейнера.
out и его
назначениеСобытие out вызывается, когда перетаскиваемый элемент
покидает контейнер, из которого был взят. Это событие
полезно для:
Сигнатура события:
drake.on('out', function(el, container, source) {
// el — перетаскиваемый элемент
// container — контейнер, из которого элемент выходит
// source — тот же контейнер, что и container
});
Ключевые параметры:
el — DOM-элемент, который перемещается.container — контейнер, который покидает элемент.source — исходный контейнер (обычно совпадает с
container).const drake = dragula([document.querySelector('#left'), document.querySelector('#right')]);
drake.on('out', function(el, container, source) {
console.log('Элемент покинул контейнер:', el);
container.style.backgroundColor = '#f8d7da'; // визуальное выделение покинутого контейнера
});
В этом примере каждый раз, когда элемент покидает контейнер, происходит изменение цвета фона, что позволяет визуально отследить событие.
out
от других событий DragulaDragula предоставляет множество событий, связанных с перемещением элементов:
drag — элемент начинает перетаскиваться.drop — элемент отпускается в контейнере.over — элемент находится над контейнером.out — элемент покидает контейнер.Событие out срабатывает перед
drop, когда элемент ещё не был размещён в новом
контейнере. Это позволяет выполнить подготовительные действия, например
скрыть подсказку или сбросить стили.
outdrake.on('out', function(el, container) {
container.classList.remove('highlight');
});
Здесь при выходе элемента из контейнера убирается CSS-класс
highlight, который мог подсвечивать контейнер во время
перетаскивания.
drake.on('out', function(el, container) {
console.log(`Элемент ${el.id} покинул контейнер ${container.id}`);
});
Это позволяет собирать данные о перемещениях элементов между контейнерами.
В сочетании с другими событиями можно реализовать логику, когда элемент не должен покидать контейнер:
drake.on('out', function(el, container, source) {
if (container.id === 'restricted') {
source.appendChild(el);
}
});
Элемент автоматически возвращается в исходный контейнер, если попытка покинуть его была запрещена.
Если контейнеры вложены друг в друга, событие out
срабатывает только для контейнера, из которого реально выходит
элемент, а не для всех родителей. Это важно учитывать при
работе со сложной структурой DOM, чтобы не срабатывать на лишние
события.
outDragula не ограничивает работу с CSS. Можно динамически менять:
background-color)border)box-shadow)opacity)Пример:
drake.on('out', function(el, container) {
container.style.opacity = '0.6';
setTimeout(() => container.style.opacity = '1', 300);
});
Эффект прозрачности создаёт визуальный отклик на уход элемента, а через короткий промежуток стиль возвращается к исходному.
out с
over и dropСобытие out лучше всего работает в связке с
over и drop, чтобы отслеживать весь цикл
перемещения:
drake.on('over', function(el, container) {
container.classList.add('highlight');
});
drake.on('out', function(el, container) {
container.classList.remove('highlight');
});
drake.on('drop', function(el, target) {
target.classList.add('dropped');
});
Такой подход позволяет создавать комплексные интерфейсы с наглядной обратной связью на действия пользователя.
Если требуется, могу продолжить и подробно разобрать
взаимодействие события out с функциями
accepts и invalid для более строгого
контроля перемещений внутри Dragula. Это создаёт мощный инструмент для
ограничения перетаскивания по правилам бизнес-логики.