gpt4 book ai didi

javascript - 将一个对象拖放到另一个对象上

转载 作者:行者123 更新时间:2023-11-28 04:19:59 24 4
gpt4 key购买 nike

我是新来的,我在拖放方面遇到了一些问题。我试图将一个对象放在另一个对象之上,但它仅取决于我添加对象的方式。我想要我添加的最后一个对象,我可以将它移到其他对象上,而第一个对象什么都不做。我应该怎么办?

var selectedElement = 0;
var currentX = 0;
var currentY = 0;
var currentMatrix = 0;

function selectElement(evt) {

selectedElement = evt.target;
currentX = evt.clientX;
currentY = evt.clientY;
currentMatrix = selectedElement.getAttributeNS(null, "transform").slice(7, -1).split(' ');

for (var i = 0; i < currentMatrix.length; i++) {
currentMatrix[i] = parseFloat(currentMatrix[i]);
}

selectedElement.setAttributeNS(null, "onmousemove", "moveElement(evt)");
selectedElement.setAttributeNS(null, "onmouseout", "deselectElement(evt)");
selectedElement.setAttributeNS(null, "onmouseup", "deselectElement(evt)");
}

function moveElement(evt) {
dx = evt.clientX - currentX;
dy = evt.clientY - currentY;
currentMatrix[4] += dx;
currentMatrix[5] += dy;
newMatrix = "matrix(" + currentMatrix.join(' ') + ")";

selectedElement.setAttributeNS(null, "transform", newMatrix);
currentX = evt.clientX;
currentY = evt.clientY;
}


function deselectElement(evt) {
if (selectedElement != 0) {
selectedElement.removeAttributeNS(null, "onmousemove");
selectedElement.removeAttributeNS(null, "onmouseout");
selectedElement.removeAttributeNS(null, "onmouseup");
selectedElement = 0;
}
}
#draggable {
cursor: move;
}
#draggable.hover {
background-color: red;
}
<!DOCTYPE html>
<html>

<head>
</head>


<body>

<svg height="600" width="600">
<circle id="draggable" cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" transform="matrix(1 0 0 1 0 0)" onmousedown="selectElement(evt)" />Sorry, your browser does not support inline SVG.
<circle id="draggable" cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="blue" transform="matrix(1 0 0 1 0 0)" onmousedown="selectElement(evt)" />
<rect id="draggable" x="10" y="220" width="100" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" transform="matrix(1 0 0 1 0 0)" onmousedown="selectElement(evt)" />

<rect id="draggable" x="10" y="320" width="100" height="100" style="fill:rgb(255,0,0);stroke-width:3;stroke:rgb(0,0,0)" transform="matrix(1 0 0 1 0 0)" onmousedown="selectElement(evt)" />




</svg>

</body>

</html>

最佳答案

您的问题是 onmousemove 仅在您的光标直接位于对象上方时触发。如果另一个元素在前面,它将不起作用。当您将鼠标悬停在另一个元素上时,也会触发 mouseout

为了简化它,我在 svg 元素上添加了监听器,并且始终引用 selectedElement

我还从 mosueout 监听器切换到 mouseleave 监听器,因为当您将鼠标悬停在 child 身上时不会触发此监听器。

var container = document.getElementById('container');
var selectedElement = 0;
var currentX = 0;
var currentY = 0;
var currentMatrix = 0;

function selectElement(evt) {

selectedElement = evt.target;
currentX = evt.clientX;
currentY = evt.clientY;
currentMatrix = selectedElement.getAttributeNS(null, "transform").slice(7, -1).split(' ');

for (var i = 0; i < currentMatrix.length; i++) {
currentMatrix[i] = parseFloat(currentMatrix[i]);
}

}

container.addEventListener("mousemove", function(evt) {
if (selectedElement != 0) {
dx = evt.clientX - currentX;
dy = evt.clientY - currentY;
currentMatrix[4] += dx;
currentMatrix[5] += dy;
newMatrix = "matrix(" + currentMatrix.join(' ') + ")";

selectedElement.setAttributeNS(null, "transform", newMatrix);
currentX = evt.clientX;
currentY = evt.clientY;
}
});

container.addEventListener("mouseleave", deselectElement)
container.addEventListener("mouseup", deselectElement)
function deselectElement(evt) {
selectedElement = 0;
}
#draggable{
cursor:move;

}
#draggable.hover
{
background-color:red;
}
<svg height="600" width="600" id="container"  >
<circle id="draggable" cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" transform="matrix(1 0 0 1 0 0)"

onmousedown="selectElement(evt)"/>
Sorry, your browser does not support inline SVG.
<circle id="draggable" cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="blue" transform="matrix(1 0 0 1 0 0)"

onmousedown="selectElement(evt)"/>
<rect id="draggable" x="10" y="220" width="100" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" transform="matrix(1 0 0 1 0 0)"

onmousedown="selectElement(evt)" />

<rect id="draggable" x="10" y="320" width="100" height="100" style="fill:rgb(255,0,0);stroke-width:3;stroke:rgb(0,0,0)" transform="matrix(1 0 0 1 0 0)"
onmousedown="selectElement(evt)" />

</svg>

关于javascript - 将一个对象拖放到另一个对象上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42256568/

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