我按照有关拖动项目组https://gist.github.com/enjalot/1378144
的教程进行操作这就是我的http://jsfiddle.net/EwGPu/
var circle = svg.append('svg:g').selectAll('circle')
.data(nodes, function(d) { return d.id; });
var g = circle.enter().append('svg:g').call(drag);
g.append('svg:circle').attr('class', 'node')
.attr('cx', function (d) { return d.x; })
.attr('cy', function (d) { return d.y; })
.attr('r', 30)
.style('fill', function(d) { return d3.rgb(colors(d.id)).brighter().toString(); })
.style('stroke', function(d) { return d3.rgb(colors(d.id)).darker().toString(); });
g.append('svg:text')
.attr('x', function (d) { return d.x + 0; })
.attr('y', function (d) { return d.y + 4; })
.attr('class', 'id')
.text(function(d) { return d.id; });
var drag = d3.behavior.drag()
.on('drag', function (d,i) {
d.x += d3.event.dx;
d.y += d3.event.dy;
d3.select(this).attr("transform", function (d, i) {
return "translate(" + [d.x,d.y] + ")";
})
});
然而,当我尝试拖动一个项目时,第一次拖动会将项目移出其当前坐标,但稍后会对所有内容进行正常拖动。我无法弄清楚为什么第一次拖动时的奇怪行为
答案 0 :(得分:2)
问题在于您使用两种方式设置坐标 - 组的transform
属性以及圈子的cx
和cy
属性。没有任何拖拽,位置完全由后者决定。在拖动时,您正在设置组的翻译,这将在的其他属性上生效。也就是说,您正在将之前为(0,0)的组转换为圆的当前位置,导致坐标跳跃,因为cx
cy
位置保持不变。
如果你只使用其中一种方法,它会让你有些头疼。我已将您的jsfiddle here修改为仅使用transform
。这样,拖动按预期工作,没有任何跳转。此外,您只需指定文本的相对偏移量而不是绝对值。