gpt4 book ai didi

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

转载 作者:技术小花猫 更新时间:2023-10-29 12:15:30 27 4
gpt4 key购买 nike

我有一个包含一些可拖动元素的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com