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

标签 javascript html css drag-and-drop

我有一个包含一些可拖动元素的 HTML 页面。我们的规范规定,将鼠标悬停在此类元素上时,光标必须 grab grab ,并且在拖动期间光标必须 抓取 grabbing .

我知道可以设置 dropEffect这会更改放置区上方的光标外观,但选项很少:copymovelinknone -- 没有自定义或类似的东西。

我曾尝试使用 Javascript 和 CSS 更改光标,例如在触发 ondragstart 时设置 cursor: grabbing;。但是在拖放区上拖动时,浏览器默认移动光标出现。

所以问题是:在拖动过程中我缺少什么来显示抓取光标 (grabbing)?

不幸的是,我无法在解决方案中使用 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>

最佳答案

浏览器似乎不允许在拖放操作开始时更改光标。我不知道为什么,但这是一个已知问题,我相信他们将来会。

如果 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>

关于javascript - 自定义光标,拖放不带库的 HTML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44447210/

相关文章:

javascript - 文本框中的传输表 TD

html - CSS应用于特定类

javascript - 如何根据输入框的值更改图像的宽度和高度?

css - 跟随 svg 运动路径时的偏移量

html - 使用更少的 css 根据屏幕大小调整视频大小

javascript - 请解释 jQuery-ui 项目中的这些行 - 与添加 "sub-plugins"有关

javascript - 无法加载 ui.bootstrap 模块

javascript - 使用 javascript 将类添加到 html 元素

html - 如何使用 Jsoup 获取帧?

javascript - 动画在一段时间后停止