我该如何创建一个SVG对象,以便当你从它拖动时,它会创建一个新的实例。
例如,如果第一个SVG对象处于固定位置,并且我试图将其拖动,它将创建一个新的SVG对象,我可以将其放置在任何我想要的位置,而第一个SVG对象仍将位于其起始位置。
谢谢 :)
例如,如果第一个SVG对象处于固定位置,并且我试图将其拖动,它将创建一个新的SVG对象,我可以将其放置在任何我想要的位置,而第一个SVG对象仍将位于其起始位置。
谢谢 :)
我基于HTML拖放API创建了一个解决方案。
JSFiddle:https://jsfiddle.net/atfuzLso/145/
HTML
<div id="container" width="100%" height="100%">
<div id="originalCircle" class="circle">
<svg width='100' height='100'>
<circle id='circleSvg' cx="50" cy="50" r="40"
stroke="none" stroke-width="4" fill="rgb(185, 185, 185)" />
</svg>
</div>
</div>
JavaScript
var originalCircle = document.getElementById('originalCircle');
originalCircle.onmousedown = addCircle;
function addCircle(e) {
var newCircle = originalCircle.cloneNode(true);
newCircle.setAttribute("draggable", "true");
newCircle.ondragstart = e => e.dataTransfer.setData('text/plain',null);
var circleSvg = newCircle.querySelector('#circleSvg');
circleSvg.setAttribute("fill", randomColor());
var container = document.getElementById('container');
container.appendChild(newCircle);
}
var draggedElmnt;
document.ondrag = e => {};
document.ondragstart = e => {
draggedElmnt = e.target;
draggedElmnt.offsetX = e.offsetX;
draggedElmnt.offsetY = e.offsetY;
draggedElmnt.style.opacity = 0.5;
}
document.ondragend = e => draggedElmnt.style.opacity = "";
document.ondrop = e => {
e.preventDefault();
draggedElmnt.style.opacity = "";
draggedElmnt.style.left = (e.clientX - draggedElmnt.offsetX) + "px";
draggedElmnt.style.top = (e.clientY - draggedElmnt.offsetY) + "px";
}
document.ondragover = e => e.preventDefault(); // allow drop
function randomColor() {
return "#"+((1<<24)*Math.random()|0).toString(16);
}
CSS
#container {
position: relative;
}
.circle {
position: absolute;
}