Этот хитрый и может отличаться от того, что вы имели в виду, но вот идея, как решить вашу проблему:
- Запустить событие перетаскивания
- Чтобы скрыть объект перетаскивания, задайте изображение с помощью
setDragImage
- . Клонируйте узел элемента перетаскивания, скройте клон и добавьте его в документ (поскольку изменить изображение, установленное с помощью
setDragImage
) * 1010 невозможно.* - Начните тайм-аут, чтобы изменить видимость элемента-призрака
Это можно еще улучшить многими способами, но я думаю, вы можете получить механику того, как он работает, как есть.Для справки см. Следующий фрагмент:
const [$drag] = document.getElementsByClassName('drag')
const [$pixel] = document.getElementsByClassName('pixel')
let $ghost = null
$drag.addEventListener("dragstart", e => {
// set the current draged element invisible
e.dataTransfer.setDragImage($pixel, 0, 0)
// create a ghost element
$ghost = $drag.cloneNode(true)
$ghost.style.position = "absolute"
$ghost.style.display = "none"
document.body.appendChild($ghost)
setTimeout(() => {
$ghost.style.display = 'block'
}, 1000)
})
$drag.addEventListener("drag", e => {
// keep the ghost position to follow the mouse while dragging
$ghost.style.left = `${e.clientX}px`
$ghost.style.top = `${e.clientY}px`
}, false);
$drag.addEventListener("dragend", e => {
// remove the ghost
if ($ghost.parentNode) $ghost.parentNode.removeChild($ghost)
}, false)
.content {
display: flex;
}
.box {
width: 100px;
height: 35px;
padding: 10px;
margin: 10px;
border: 1px solid #aaaaaa;
}
.drop {
user-select: none;
}
.drag {
text-align: center;
}
.pixel {
width: 1px;
height: 1px;
background-color: white;
}
<div class="content">
<div draggable="true" class="drag box">Drag</div>
<div class="drop box"></div>
<div class="pixel"></div>
</div>