【问题标题】:How to make the transform:translate-drag function of d3 more smooth?如何让d3的transform:translate-drag功能更流畅?
【发布时间】:2017-01-13 19:40:28
【问题描述】:

this JSFiddle 我已经在svg 中实现了元素。我希望这组元素是可拖动的,我已经使用d3.dragtransform: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() {});

【问题讨论】:

  • 冒险猜测d3.event.x 是相对于父级的,通过移动父级而不是拖动的元素,您可以将d3.event.x 更改为下一个“刻度”
  • 也许看看drag.subject

标签: javascript css d3.js svg


【解决方案1】:

而不是将拖动侦听器附加到外来对象 div:

d3.select("#input-container-div").call(dragcontainer);

像这样将它添加到 svg 组中:

d3.select(d3.select("#input-container-div").node().parentNode.parentNode).call(dragcontainer);

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

var x = d3.event.x;
var y = d3.event.y;

使用 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 + ")");

工作代码here

【讨论】:

  • 是的,它有效。也许如果我摆脱 div 并将 foreignObject 替换为 它会很干净。在 svg 中使用 div 是好是坏?
  • 如果你使用 g 而不是 foreignObject 那么你不能使用 divs.. 我认为最好不要使用 divs 而使用 SVG DOM 元素,除非你有很好的理由想要使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2012-02-17
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多