如何使用d3js拖动完整的svg?

单击svg上的任何位置时,我都尝试具有拖动行为。

这是我尝试过的JSFiddle:https ://jsfiddle.net/d2fx196n/2/

我尝试过的直观的事情是这样的:

svg = d3.select("body")
  .append("svg:svg")
  .attr("width", 200)
  .attr("height", 200)
  .style("border", "solid")
  .call(drag);

是否有一种简单的方法将拖动行为应用于整个svg,从而使每个对象移动相同?

编辑:我想要更精确的是通过单击svg中的任何位置(甚至是“背景”)来拖动svg内的所有内容。当我拖动时,svg中的所有内容都应一起移动。

EDIT2:基本上,我想具有可以在这里看到的相同行为:http : //jsfiddle.net/superboggly/2hfx3/,但也有行

酷蓝

战略

您可以将svg的内容包装在ag中并对其进行转换,然后在拖动时更新转换。

策略

  1. d3.event公开dxdy因此您可以在拖动时将其添加到变换中。
  2. d3 Math模块中有一个方便的用于转换的API,您可以使用它来避免解析g元素的transform属性的麻烦。

代码

    var drag = d3.behavior.drag()
          //.origin(function (d) { return d; })
          .on("dragstart", dragstarted)
          .on("drag", dragged)
          .on("dragend", dragended),

        data = {
          "nodes": [
              { "id": "0", "x": 50, "y": 50 },
              { "id": "1", "x": 100, "y": 50 },
              { "id": "2", "x": 50, "y": 100 },
              { "id": "3", "x": 100, "y": 100 }
          ],
          "edges": [
              { "id": "0", "source": "0", "target": "1" },
              { "id": "1", "source": "2", "target": "3" }
          ]
        },

        log = d3.select("body").append("div")
          .style({ "background-color": "1px solid #ccc" })
          .text("waiting..."),

        svg = d3.select("body")
          .append("svg:svg")
          .attr("width", 200)
          .attr("height", 200)
          .style("border", "solid")
          .call(drag)
          .append("g"),

        nodes = data.nodes,

        links = data.edges;

    for (var i in data.edges) {
      for (var j in nodes) {
        if (nodes[j].id == data.edges[i].source) {
          data.edges[i].source = nodes[j];
        } else if (nodes[j].id == data.edges[i].target) {
          data.edges[i].target = nodes[j];
        }
      }
    }

    var lines = svg.selectAll(".line")
        .data(links)
        .enter()
        .append("line")
        .attr("x1", function (d) { return d.source.x })
        .attr("y1", function (d) { return d.source.y })
        .attr("x2", function (d) { return d.target.x })
        .attr("y2", function (d) { return d.target.y })
        .attr("stroke-width", "4")
        .style("stroke", "#000000");

    var circles = svg.selectAll("circle.nodes")
        .data(nodes)
        .enter()
        .append("svg:circle")
        .attr("cx", function (d) { return d.x; })
        .attr("cy", function (d) { return d.y; })
        .attr("r", "8px")
        .attr("fill", "#FF0000");


    function dragstarted(d) {
      d3.event.sourceEvent.stopPropagation();
      d3.event.sourceEvent.preventDefault;
      console.log("start")
      log.text("start")
    }

    function dragged(e) {
      var t = d3.transform(svg.attr("transform")).translate;
      svg.attr("transform", "translate(" + [t[0] + d3.event.dx, t[1] + d3.event.dy] + ")")
      console.log("drag: " + d3.transform(svg.attr("transform")).translate);
      log.text("drag: " + d3.transform(svg.attr("transform")).translate)
    }

    function dragended(d) {
      console.log("end")
      log.text("end")
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用d3js获取svg元素的宽度?

来自分类Dev

如何通过d3js实现svg模式?

来自分类Dev

如何在d3.js中拖动SVG矩形?

来自分类Dev

d3js缩放+拖动导致冲突

来自分类Dev

在d3js气泡图中拖动气泡

来自分类Dev

D3js的节点和链接拖动行为

来自分类Dev

D3js重置拖动行为的来源

来自分类Dev

在d3js气泡图中拖动气泡

来自分类Dev

D3js:拖动滑块可触摸

来自分类Dev

d3js svg水滴或泪珠

来自分类Dev

如何使用d3js实现联合绘图

来自分类Dev

如何使用d3js间隔定义刻度

来自分类Dev

如何使用d3js间隔定义刻度

来自分类Dev

如何使用d3js实现关节图

来自分类Dev

如何使用d3.js正确拖动?

来自分类Dev

D3js:如何生成独立的SVG文件?(Node.js)

来自分类Dev

如何将点击事件分配给d3js中的每个svg元素

来自分类Dev

D3js SVG的空行显示填充伪像,如何解决?

来自分类Dev

将使用D3js创建的SVG转换为PNG

来自分类Dev

d3js v5:使用JSON文件中的组创建SVG

来自分类Dev

使用d3js对SVG路径进行动画处理

来自分类Dev

d3js - 使用 javascript 操作创建服务器端 SVG

来自分类Dev

使用d3js排序

来自分类Dev

使用d3js排序

来自分类Dev

d3js绘制svg矩形和线条问题

来自分类Dev

D3JS SVG视图框属性

来自分类Dev

d3js将对象附加到svg

来自分类Dev

d3js SVG:title工具提示未显示

来自分类Dev

使用d3.behavior.drag,如何使拖动图像在svg元素外部可见