JSFiddle:http: //jsfiddle.net/Umugb/19/
我编写了下面的代码来在 svg 上拖动一组元素。每个g
元素都有一个circle
可拖动的(但除此之外没有其他元素)。但是,当我拖动圆圈时,我想g
用它来翻译其余的圆圈。
问题是拖拽出了问题。如果我取出变换,而只是将circle
's cx 和 cy 更改为 new_cx 和 new_cy,那么圆可以按预期移动。但是,使用变换时,所有元素都以异常大的绝对值从页面飞出 d3.event.dx/dy。
下面的代码有什么明显的问题吗?或者有人对为什么会发生这种情况有进一步的了解吗?
var drag = d3.behavior.drag().on("drag", translate);
function translate() {
var g = $("#" + this.parentNode.id);
var circle = d3.select(this);
var r = parseInt(circle.attr("r"));
var box_width = Math.max(g[0].getElementsByClassName('circletext')[0].getBBox().width, 2*r);
var cx = parseInt(circle.attr("cx"));
var cy = parseInt(circle.attr("cy"));
if (g.attr("transform")) {
var translate = g.attr("transform").split('translate')[1].split(',');
cx = cx + parseInt(translate[0].slice(1));
cy = cy + parseInt(translate[1].slice(0,-1));
}
var new_cx = Math.max(r, Math.min(width - box_width + r, d3.event.dx + cx));
var new_cy = Math.max(r, Math.min(height - r, d3.event.dy + cy));
d3.select("#" + this.parentNode.id).
attr("transform",
"translate(" + (new_cx-cx) + "," + (new_cy-cy) + ")");
编辑:在顶部更新了 JSFiddle