【问题标题】:"Stuttering" drag when using d3.behavior.drag() and transform使用 d3.behavior.drag() 和变换时“口吃”拖动
【发布时间】:2012-10-16 05:22:16
【问题描述】:

我正在尝试使用 d3.js 的 d3.behavior.drag() drag 事件来更新我的数据模型(不立即设置元素位置),然后运行我的“绘制”函数以根据更新后的模型更新所有元素。此外,我在包含的 group 元素上使用了 translate transform 以移动与拖动对象关联的所有元素(我从下面链接的示例中删除了额外的元素)。这会导致被拖动的元素在被拖动时会卡住,拖得越快,情况就会越糟糕。

this stripped-down example on 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()​;

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    我和达尔文有同样的问题。拖动处理程序位于附加了 D3 数据的子对象上,但需要将转换应用于父组(而不是 d3)。

    我通过将原点函数设置为返回 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);   });
    

    【讨论】:

      【解决方案2】:

      Nautat 为您的案例提供了很好的解决方案。

      我的情况稍微复杂一些。我的数据绑定在我要转换的 g 节点之下。在这种情况下,我不能简单地将 .call(drag) 移动到 g 级别。

      我提交了一个拉取请求以使基础坐标空间可定制: https://github.com/mbostock/d3/pull/1055

      【讨论】:

        【解决方案3】:

        您在 rect 元素上调用 drag,但您正在转换其父元素:g 元素。

        问题在于拖动组件使用鼠标相对于父级的位置来确定新的d3.event.xd3.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);
        }
        

        查看更正的小提琴:http://jsfiddle.net/EMNGq/14/

        【讨论】:

        • 在 D3 的第 4 版中,有container 函数允许设置一些其他节点来确定坐标。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-21
        • 1970-01-01
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多