我正在尝试使用d3.js的d3.behavior.drag() drag事件来更新我的数据模型(不立即设置元素位置),然后运行我的"绘图"功能,根据更新的模型更新所有元素.另外,我正在使用transform包含组元素的翻译来移动与拖动对象相关联的所有元素(我从下面链接的示例中删除了额外的元素).这会导致拖动的元素在拖动时停滞不前,拖动它的速度越快,效果越差.
请参阅jsFiddle上的这个精简示例.
这是示例的代码:
blocks = [
{ x: 0, y: 0 }
];
drag = d3.behavior.drag()
.origin(Object)
.on("drag", function(d) {
d.x = d3.event.x;
d.y = d3.event.y;
draw();
});
svg = d3.select("body")
.append("svg:svg")
.attr("width", 600)
.attr("height", 600);
function draw() {
g = svg.selectAll("g")
.data(blocks);
gEnter = g.enter().append("g");
g.attr("transform", function(d) { return "translate("+d.x+","+d.y+")"; });
gEnter.append("rect")
.attr("height", 100)
.attr("width", 100)
.call(drag);
}
draw()?;
Run Code Online (Sandbox Code Playgroud)
nau*_*tat 36
您呼叫drag的上rect元素,但你正在改变它的父:该g元素.
问题是拖动组件使用相对于父级的鼠标位置来确定新的d3.event.x和d3.event.y.因此,如果您transform在用户拖动时移动(即)父级,则事情会变得混乱.
解决方案是调用drag您正在移动的相同元素; 在这种情况下g元素:
function draw() {
g = svg.selectAll("g")
.data(blocks);
gEnter = g.enter().append("g")
.call(drag);
g.attr("transform", function(d) { return "translate("+d.x+","+d.y+")"; });
gEnter.append("rect")
.attr("height", 100)
.attr("width", 100);
}
Run Code Online (Sandbox Code Playgroud)
见纠正的小提琴:http://jsfiddle.net/EMNGq/14/
我和达尔文有同样的问题.拖动处理程序位于附加了D3数据的子对象上,但转换需要应用于父组(而不是d3).
我通过将origin函数设置为返回x:0,y:0然后在事件中使用x值而不是dx来解决它.
例如
var drag = d3.behavior.drag()
.origin(function(d,i) { return {x:0, y:0}; })
.on("drag", function (d) { movePosition(d3.event.x); });
Run Code Online (Sandbox Code Playgroud)