HTML5 拖放 拖动时更改图标/光标

IT技术 javascript html drag-and-drop
2021-03-09 14:18:16

我想知道如何在拖动 (dragover/dragenter) 图标/光标期间更改,例如当我 dragenter 拒绝或允许部分时。当然,我可以用光标移动绝对定位的 DOM 的一部分,但我对原生 HTML5 解决方案感兴趣。

谢谢!

6个回答

你在dropEffect之后

在 dragstart 中初始化它:

event.dataTransfer.effectAllowed = "copyMove";

在 dragenter 中更新它:

event.dataTransfer.dropEffect = "copy";
我将上面的 JSFiddle 更新到jsfiddle.net/rvRhM/192以遵循您的建议。它适用于 Chrome,但 Firefox 不会更改光标(撰写本文时的当前版本......)。无论如何,感谢您的提示。
2021-04-16 14:18:16

我在这里有一个独立的跨浏览器 HTML5 拖放示例:http : //jsfiddle.net/rvRhM/1/

看看 dragstart 和 dragend 事件。dm是被拖动的元素。

EventUtil.addHandler(dm, 'dragstart', function(e) {
    e.dataTransfer.setData(format, 'Dragme');
    e.dataTransfer.effectAllowed = effect;
    var target = EventUtil.getCurrentTarget(e);
    target.style.backgroundColor = 'blue';
    target.style.cursor = 'move'; // You can do this or use a css class to change the cursor
    return true;
});

确保在拖动结束时重置光标:

EventUtil.addHandler(dm, 'dragend', function(e) {  
    var target = EventUtil.getCurrentTarget(e);
    target.style.backgroundColor = '';
    target.style.cursor = 'default'; // Reset cursor
    return true;
});
感谢您的回复!但是我需要在 dragenter/dragover 期间根据我是否有权将元素拖入其中进行更改。顺便说一句,该示例在 Chrome 18 (OS X) 中不起作用。
2021-04-18 14:18:16
我在 chrome 75 上试过,有时它会显示移动光标,但有时它只是默认的光标图标。
2021-04-18 14:18:16
dataTransfer 仅在 FF 中受支持。
2021-05-02 14:18:16
是的,不仅仅是 chrome,还有 safari,我不太确定为什么,因为它是普通的旧 javascript。它适用于 Firefox。关于您的另一个问题,您必须在可拖动元素和放置区(使用 id、cssClass 等)之间建立某种连接,以便您可以确定允许哪个可拖动元素进入哪个放置区。然后您可以相应地设置可拖动的样式。
2021-05-11 14:18:16

添加纯 css 解决方案,这可能对少数人有用。在 html 元素上使用这个类。

.grab {
        cursor: move;
        cursor: grab;
        cursor: -moz-grab;
        cursor: -webkit-grab;
        .thumbnails-list{
            cursor: pointer;
        }
    }

    .grab:active {
        cursor: grabbing;
        cursor: -moz-grabbing;
        cursor: -webkit-grabbing;
    }
这在元素拖动时不起作用并且仅当元素被单击时才起作用。
2021-04-27 14:18:16
这很好用,直到我开始拖动。然后光标只是切换回默认值。
2021-05-05 14:18:16

我试图实现相同的目标,但找不到一个很好的解决方案。我最后所做的是将图像设置到 dataTransfer 并在每次操作时更改其 src。这样,行为至少在浏览器之间是一致的。这是我用作参考的页面的链接:

https://kryogenix.org/code/browser/custom-drag-image.html

您页面上的元素不会在 Chrome 中拖动
2021-05-01 14:18:16

这对我有用:

<div class="container">
    <div draggable="true">
    <div draggable="true">
</div>
$('.container').bind('dragover', function() {
    $('body').addClass('dragging');
});
$('.container').bind('dragleave', function() {
    $('body').removeClass('dragging');
});
.container > div {
    cursor: grab;
}
body.dragging .container > div {
    cursor: grabbing;
}

https://jsfiddle.net/cLb3hxtf/1/

@AMoore 似乎在 Chrome 92.0.4515.107 jsfiddle.net/cLb3hxtf/1上为我工作
2021-04-17 14:18:16
对我来说,在 Chrome 92.0.4515.131(windows 7,sry :()上,它甚至不能在提供的 jsfiddle 中拖动。
2021-05-07 14:18:16