如何使d3的transform:translate-drag函数更平滑?

Sac*_*lla 2 javascript css svg d3.js

这个JSFiddle中,我已经在svg中实现了元素。我希望这组元素是可拖动的,并且已尝试使用d3.drag和使用它transform:translate。阻力不平稳。它忽悠忽隐忽现。

它背后的原因是什么?如何克服?

拖动功能如下:

var dragcontainer = d3.drag()
  .on("start", function() {})
  .on("drag", function(d, i) {
    var x = d3.event.x;
    var y = d3.event.y;
      d3.select(this.parentNode.parentNode).attr("transform", "translate(" + x + "," + y + ")");
  })
  .on("end", function() {});
Run Code Online (Sandbox Code Playgroud)

Cyr*_*ian 6

而不是将拖动侦听器附加到异物div:

d3.select("#input-container-div").call(dragcontainer);
Run Code Online (Sandbox Code Playgroud)

像这样将其添加到svg组:

d3.select(d3.select("#input-container-div").node().parentNode.parentNode).call(dragcontainer);
Run Code Online (Sandbox Code Playgroud)

其次,而不是使用d3.event.x / d3.event.y

var x = d3.event.x;
var y = d3.event.y;
Run Code Online (Sandbox Code Playgroud)

使用dx和dy获取鼠标移动差异并将其存储以供将来拖动。

像这样:

  this.x = this.x || 0;//reset if not there
  this.y = this.y || 0;

    this.x += d3.event.dx;
    this.y += d3.event.dy;
  d3.select(this).attr("transform", "translate(" + this.x + "," + this.y + ")");
Run Code Online (Sandbox Code Playgroud)

这里的工作代码