当前位置: 首页 > 知识库问答 >
问题:

自定义光标,可拖放不带库的HTML元素

谢阳曜
2023-03-14

我知道可以设置dropEffect,以更改拖放区上方的光标外观,但几乎没有选项:复制移动链接,以及——无自定义或类似选项。

我曾尝试用Javascript和CSS更改游标,比如设置cursor:grabbing ondragstart被触发时。但在拖放区域上拖动时,浏览器会显示默认的移动光标。

不幸的是,我不能在解决方案中使用JQuery或其他帮助库。提前谢谢!

var onDragStart = function(event) {
    event.dataTransfer.setData("Text", event.target.id);
    event.currentTarget.classList.add("being-dragged");
};

var onDragEnd = function(event) {
    event.currentTarget.classList.remove("being-dragged");
};

var onDragOver = function(event) {
    event.preventDefault();
};
.dropzone {
    width: 500px;
    height: 200px;
    background-color: silver;
}

.block {
    position: absolute;
    background-color: pink;
    margin: 10px;
    border: 20px solid pink;
}

.draggable {
    cursor: -webkit-grab;
    cursor: grab;
}

.being-dragged {
    cursor: -webkit-grabbing;
    cursor: grabbing;
    background-color: red;
}
<div class      = "dropzone"
    ondragover  = "onDragOver(event);"
    >
    Grab and drag block around
    <div class      = "draggable block"
        draggable   = "true"
        ondragstart = "onDragStart(event);"
        ondragend   = "onDragEnd(event);"
        >
        I'm draggable
    </div>
</div>

共有3个答案

羊舌墨一
2023-03-14

为了弄明白这一点,我经历了很多痛苦。公认的答案是web上的最佳答案,但现在的最佳实践是使用元素的。setPointerCapture事件,该事件允许您监听元素上类似拖动的行为并对其进行操作,而无需被限制在拖动API的狭窄行为中。一种方法是:

el.onpointerdown = ev => {
    el.onpointermove = pointerMove 
    el.setPointerCapture(ev.pointerId)
}

pointerMove = ev => {
    console.log('Dragged!')
}

el.onpointerup = ev => {
    el.onpointermove = null
    el.releasePointerCapture(ev.pointerId)
}

最明显的礼物是,这里没有发现偷袭后门的光标劫持行为。

乜建柏
2023-03-14

这是一个已知的问题在这里报告

拖动时,光标会自动变为正常。

我的尝试给了我以下几点。在带有抓取游标的元素上给出一个活动的。当它处于活动状态时,光标将更改,但一旦您启动拖动,它将自动更改。

我试图设置body光标在dragstart上抓取,但没有结果。甚至它也不起作用。

var onDragStart = function(event) {
    event.dataTransfer.setData("Text", event.target.id);
    event.currentTarget.classList.add("being-dragged");
};

var onDragEnd = function(event) {
    event.currentTarget.classList.remove("being-dragged");
};

var onDragOver = function(event) {
    event.preventDefault();
};
css prettyprint-override">.dropzone {
    width: 500px;
    height: 200px;
    background-color: silver;
}

.block {
    position: absolute;
    background-color: pink;
    margin: 10px;
    border: 20px solid pink;
}

.draggable {
    cursor: -webkit-grab;
    cursor: grab;
}

.draggable:active{
    cursor : -moz-grabbing;
    cursor: -webkit-grabbing;
    cursor: grabbing;
}
.being-dragged{
    background-color: red;
    cursor : -moz-grabbing;
    cursor: -webkit-grabbing;
    cursor: grabbing;
}
<div class      = "dropzone"
    ondragover  = "onDragOver(event);"
    >
    Grab and drag block around
    <div class      = "draggable block"
        draggable   = "true"
        ondragstart = "onDragStart(event);"
        ondragend   = "onDragEnd(event);"
        >
        I'm draggable
    </div>
</div>

洪国兴
2023-03-14

浏览器似乎不允许在拖动开始时更改光标

如果jQuery不是一个选项,一种可能的解决方法是实现一个拖动

var onDragStart = function (event) {
  event.preventDefault();
  var clone = event.target.cloneNode(true);
  clone.classList.add("dragging");
  event.target.parentNode.appendChild(clone);
  var style = getComputedStyle(clone);
  clone.drag = {
    x: (event.pageX||(event.clientX+document.body.scrollLeft)) - clone.offsetLeft + parseInt(style.marginLeft),
    y: (event.pageY||(event.clientY+document.body.scrollTop)) - clone.offsetTop + parseInt(style.marginTop),
    source: event.target
  };
};

var onDragMove = function (event) {
  if (!event.target.drag) {return;}
  event.target.style.left = ((event.pageX||(event.clientX+document.body.scrollLeft)) - event.target.drag.x) + "px";
  event.target.style.top = ((event.pageY||(event.clientY+document.body.scrollTop)) - event.target.drag.y) + "px";
};

var onDragEnd = function (event) {
  if (!event.target.drag) {return;}
  // Define persist true to let the source persist and drop the target, otherwise persist the target.
  var persist = true;
  if (persist || event.out) {
    event.target.parentNode.removeChild(event.target);
  } else {
    event.target.parentNode.removeChild(event.target.drag.source);
  }
  event.target.classList.remove("dragging");
  event.target.drag = null;
};

var onDragOver = function (event) {
  event.preventDefault();
};
.dropzone {
  width: 500px;
  height: 200px;
  background-color: silver;
}

.block {
  position: absolute;
  background-color: pink;
  margin: 10px;
  border: 20px solid pink;
}

.draggable {
  position: absolute;
  cursor: pointer; /* IE */
  cursor: -webkit-grab;
  cursor: grab;
}

.dragging {
  cursor: -webkit-grabbing;
  cursor: grabbing;
  background-color: red;
}
<div class="dropzone" onmouseover="onDragOver(event);">
  Grab and drag block around
  <div class    = "draggable block"
    onmousedown = "onDragStart(event);"
    onmousemove = "onDragMove(event);"
    onmouseup   = "onDragEnd(event);"
    onmouseout  = "event.out = true; onDragEnd(event);"
  >
    I'm draggable
  </div>
</div>
 类似资料:
  • 在拖放过程中显示鼠标图标旁边节点的半透明“副本”的最佳方法是什么? 基本上,我有彩色背景和文本标签的HBox,我想给出的外观,他们“粘”到鼠标光标时,他们被拖动。 如果用户能够直观地验证他们正在拖动什么,而不是仅仅看到鼠标光标变成各种拖动图标,那就很好了。当你拖动一些组件(如RadioButton)时,Scene Builder倾向于这样做。

  • Java自定义拖放--对TransferHandler没有回调。 我想为JPanel子类实现自定义拖放功能。I遵循标准DnD教程的指导方针: 拖放和数据传输 从表面上看,事情似乎很进步,但当我实际尝试时,我没有得到任何迹象表明任何DnD行为正在发生。事实上,没有调用我的TransferHandler中的任何方法。 所以,让我们回顾一下我所做的... 我创建了自己的容器类,它声明自己来扩展JPane

  • 我正在编写的Android应用程序中使用Google MapsV2。创建映射并将所有标记添加到其中之后,我通过对映射上的每个标记使用使所有标记可拖动。 如果我这样运行代码,标记确实是可拖动的。但是,我希望在拖动标记时更改标记的图标或颜色,因此我设置了OnMarkerDragListener,如下所示: 但是,在添加了该代码块之后,标记就不再是可拖动的了。颜色在onMarkerDragStart和o

  • jQuery draggeble/sortable演示只显示如何删除可拖动的克隆(可拖动和可排序项具有相同的结构)。我想删除一个不同的DOM结构。例如,当我拖动一个简单的div时,拖动的元素会被转换成更复杂的DOM结构。请参阅jsfidler示例,注意帮助器是如何变化的,我想删除帮助器,但原始项被删除。 使用简单的可拖动项目和可拖放容器工作,但我希望能够将项目放在可排序容器的任何部分,并能够重新排

  • 问题内容: 我有一个JavaScript Webapp,用户需要抓住背景才能移动整个屏幕。因此,我希望光标悬停在背景上时进行更改。在和CSS光标是非常理想的。当然,它们仅在Firefox中工作…其他浏览器是否具有等效的游标?我是否需要做一些比标准CSS游标更多的自定义操作? 问题答案: 我认为这可能是您正在执行的操作中最接近的标准光标值: move 表示要移动的东西。

  • 问题内容: 我有许多heroshot图像,单击它们时会弹出模式弹出窗口。我试图使光标在图像上移动时变成放大镜。即使我的位置正确,以下CSS也似乎无法正常工作。 有没有人做过类似的事情?我不介意一个JavaScript解决方案(如果存在)。 编辑 :它可以在Safari中,但不能在Firefox中使用。 问题答案: 您的问题可能是光标URL在Mac的Firefox中不起作用。 通过使用关键字,可以在