Я никогда не пробовал, используя draggable="true"
, вместо этого я бы использовал мышь вверх, вниз, перемещение (и сенсорные аналоги, если это необходимо для сенсорных устройств)
, это дает вам больше контроля, а затем у вас не отображается этот перекрывающийся элемент.
Идея состоит в том, что ...
- в данных, позиции трека, позиции начального фрагмента (x, y) и о том, является ли элемент при перетаскивании
- при наведении мыши установите isDragging в true и сохранить начальную позицию перетаскивания x, y с координатами
- при перемещении мыши, если
isDragging === true
обновить положение на основе разницы между startdrag и текущим клиентомXY - при наведении мыши, установите isDragging в false
, вы также можете улучшить это, добавляя и удаляя слушателя mousemove и mouseup динамически. Поскольку вы хотите, чтобы указатель мыши перемещался по документу (в любом случае, вместо элемента, это лучший способ go)
Недавно я написал об этом для нового API композиции vue3 в https://dev.to/dasdaniel/vue3-compisition-api-craeting-a-draggable-element-fo6
Поскольку он предназначен для vue3, он не подходит для копирования и вставки, но важная часть здесь:
const onMouseDown = e => {
let { clientX, clientY } = e;
position.dragStartX = clientX - position.x;
position.dragStartY = clientY - position.y;
position.isDragging = true;
document.addEventListener("mouseup", onMouseUp);
document.addEventListener("mousemove", onMouseMove);
};
const onMouseMove = e => {
let { clientX, clientY } = e;
position.x = clientX - position.dragStartX;
position.y = clientY - position.dragStartY;
};
const onMouseUp = e => {
let { clientX, clientY } = e;
position.isDragging = false;
position.dragStartX = null;
position.dragStartY = null;
document.removeEventListener("mouseup", onMouseUp);
document.removeEventListener("mousemove", onMouseMove);
};