我有一个具有某些组和拖动行为的SVG。效果很好,但是当我两次拖动元素时,它们又从“初始”位置开始。我需要新鲜的眼睛来解决这个问题!
示例:jsfiddle
还有一个摘要:
var items = [{name:"A",x:50,y:50},{name:"B",x:150,y:50}];
var size = 96;
var svg = d3.select("#container")
.append("svg");
var items = svg.selectAll("g")
.data(items)
.enter()
.append("g")
.attr("transform",function(d,i){
return "translate(" + (10+i*size+10*i) + "," + 10 + ")";
});
items.call(d3.drag()
// .subject(function(d) { return d; })
// .on("start",dragstarted)
.on("drag",draggedGroup)
.subject(function() {
var t = d3.select(this);
return {x: t.attr("x"),y: t.attr("y")};
})
//.on("end",dragended)
);
items
.append("rect")
.attr("x",function(d){return d.x;})
.attr("y",function(d){return d.y;})
.attr("height",size)
.attr("width",size)
.style("stroke","#0F0")
.style("fill","transparent")
.style("stroke-width",3.5);
items.append("line")
.style("stroke","#0FF")
.attr("x1",function(d){return d.x;})
.attr("y1",function(d){return d.y;})
.attr("x2",function(d){return d.x+size;})
.attr("y2",function(d){return d.y+size;})
items.append("line")
.style("stroke",function(d){return d.x+size;})
.attr("y1",function(d){return d.x;})
.attr("y2",function(d){return d.y+size;})
items .append("text")
.attr("x",function(d){return d.x+size/2})
.attr("y",function(d){return d.y+size/2})
//.attr("text-anchor","start")
.style("fill","white")
.text(function(d){
return d.name;
})
function dragstarted(d){
console.log("Moving "+d.name);
// d3.select(this).raise().classed("active",true);
}
function draggedGroup(d,i,a){
const pos = [d3.event.x,d3.event.y];
const pdist = [d3.event.dx,d3.event.dy];
d3.select(this).attr("transform","translate("+pos[0]+","+pos[1]+")")
}
function dragended(d){
// d3.select(this).raise().classed("active",false);
console.log("Stop moving "+d.name)
}
body{
background-color:black;
padding:10px;
}
svg{
width:500px;
height:400px;
}
#container{
width:500px;
height:400px;
background-color: #00F;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="container"></div>
我的分组项目:
var items = svg.selectAll("g")
.data(items)
.enter()
.append("g")
.attr("transform",i){
return "translate(" + d.x + "," + d.y + ")";
});
items.append("rect")
.attr("x",function(d){return d.x;})
.attr("y",function(d){return d.y;})
.attr("height",size)
.attr("width",size)
.style("stroke","#0F0")
.style("fill","transparent")
.style("stroke-width",3.5);
items.append("line")
.style("stroke","#0FF")
.attr("x1",function(d){return d.x;})
.attr("y1",function(d){return d.y;})
.attr("x2",function(d){return d.x+size;})
.attr("y2",function(d){return d.y+size;})
items.append("line")
.style("stroke",function(d){return d.x+size;})
.attr("y1",function(d){return d.x;})
.attr("y2",function(d){return d.y+size;})
items .append("text")
.attr("x",function(d){return d.x+size/2})
.attr("y",function(d){return d.y+size/2})
//.attr("text-anchor","start")
.style("fill","white")
.text(function(d){
return d.name;
})
行为
items.call(d3.drag()
.on("drag",draggedGroup)
.subject(function() {
var t = d3.select(this);
return {x: t.attr("x"),y: t.attr("y")};
})
);
拖动功能
function draggedGroup(d,a){
const pos = [d3.event.x,d3.event.y];
d3.select(this).attr("transform","+pos[1]+")")
}
为什么第二次尝试拖动元素时它会从第一个位置重新开始?请参阅jsfiddle上的示例以了解实际效果。
错误似乎出在拖动功能的这一行:
d3.select(this).attr("transform","translate("+(pos[0])+","+(pos[1])+")")
编辑
我尝试更新 STOP 函数以将起始值更新为
d3.select(this).attr("transform",function(d){
d.x += d3.event.x;
d.y += d3.event.y;
return "translate("+d3.event.x+","+d3.event.y+")"
})
现在,如果我在拖动开始时将d.x,d.y放在控制台中,则会显示输出
x:640 y:299
,但框始终以初始位置开始。我很困惑
感谢您的帮助!