Dragula — это легкая и простая в использовании библиотека для перетаскивания элементов (drag-and-drop) на веб-странице. Одним из ключевых компонентов, обеспечивающих динамическое визуальное взаимодействие, является gu-mirror — зеркальный элемент. Он представляет собой визуальное отражение перетаскиваемого объекта, которое создается автоматически в момент начала drag-операции и следует за курсором до завершения перемещения.
При начале перетаскивания Dragula создает DOM-элемент, который является точной копией исходного объекта, но с определенными стилями и поведением:
Этот элемент позволяет пользователю видеть, что именно перетаскивается, не влияя на исходную структуру DOM контейнера.
const drake = dragula([container1, container2]);
При вызове dragula и передаче массивов контейнеров
библиотека автоматически подготавливает gu-mirror для
любого элемента, который начинается перетаскивать.
gu-mirror создается с классом
gu-mirror. Через CSS можно задавать его поведение и внешний
вид:
.gu-mirror {
opacity: 0.8;
background-color: rgba(0, 0, 0, 0.1);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
transform: rotate(2deg);
}
gu-mirror активно участвует в обработке событий Dragula:
drag — срабатывает при начале перетаскивания, когда
gu-mirror создается и привязывается к курсору.dragend — элемент исчезает после завершения
перемещения.shadowing — визуальный эффект перемещения через
прозрачное отражение без изменения оригинала.drake.on('drag', function(el, source) {
console.log('Начало перетаскивания', el);
});
drake.on('dragend', function(el) {
console.log('Перетаскивание завершено', el);
});
Хотя Dragula автоматически создает и управляет зеркальным элементом, есть сценарии, когда требуется ручная кастомизация:
drake.on('drag', function(el, source) {
const mirror = document.querySelector('.gu-mirror');
mirror.style.width = `${el.offsetWidth * 1.2}px`;
mirror.style.height = `${el.offsetHeight * 1.2}px`;
});
.gu-mirror {
transition: transform 0.2s ease;
}
drake.on('drag', function(el, source) {
const mirror = document.querySelector('.gu-mirror');
mirror.innerHTML = `<strong>${el.textContent}</strong>`;
});
mirrorOffsetX и mirrorOffsetY,
чтобы точка привязки соответствовала курсору.const drake = dragula([container1, container2], {
moves: (el, source, handle) => handle.classList.contains('handle'),
accepts: (el, target) => target.id !== 'no-drop',
});
Для страниц с большим количеством draggable элементов рекомендуется:
will-change: transform; к gu-mirror для
аппаратного ускорения..gu-mirror {
will-change: transform;
}
gu-mirror является важным компонентом Dragula, обеспечивая визуальное и интерактивное сопровождение перемещения элементов. Правильное использование стилей, событий и ручной кастомизации позволяет создавать плавные и интуитивно понятные drag-and-drop интерфейсы.