javascript - 在力布局上应用比例变换后,拖动无法正常工作

标签 javascript d3.js svg

我有一个基于以下强制布局构建的项目。我将整个元素附加到根 SVG 中,与此类似。

我现在正在尝试对其应用缩放。由于我无法使用包装 g 标签,因此我尝试在 SVG 上应用缩放变换。尽管它被缩放,但拖动行为不正确。鼠标出现的点和元素出现的点是不同的。

graph =  {
  "nodes": [
    {"x": 469, "y": 410},
    {"x": 493, "y": 364},
    {"x": 442, "y": 365},
    {"x": 467, "y": 314},
    {"x": 477, "y": 248},
    {"x": 425, "y": 207},
    {"x": 402, "y": 155},
    {"x": 369, "y": 196},
    {"x": 350, "y": 148},
    {"x": 539, "y": 222},
    {"x": 594, "y": 235},
    {"x": 582, "y": 185},
    {"x": 633, "y": 200}
  ],
  "links": [
    {"source":  0, "target":  1},
    {"source":  1, "target":  2},
    {"source":  2, "target":  0},
    {"source":  1, "target":  3},
    {"source":  3, "target":  2},
    {"source":  3, "target":  4},
    {"source":  4, "target":  5},
    {"source":  5, "target":  6},
    {"source":  5, "target":  7},
    {"source":  6, "target":  7},
    {"source":  6, "target":  8},
    {"source":  7, "target":  8},
    {"source":  9, "target":  4},
    {"source":  9, "target": 11},
    {"source":  9, "target": 10},
    {"source": 10, "target": 11},
    {"source": 11, "target": 12},
    {"source": 12, "target": 10}
  ]
}

var width = 960,
    height = 500;

var force = d3.layout.force()
    .size([width, height])
    .charge(-400)
    .linkDistance(40)
    .on("tick", tick);

var drag = force.drag()
    .on("dragstart", dragstart);

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);

var link = svg.selectAll(".link"),
    node = svg.selectAll(".node");



  force
      .nodes(graph.nodes)
      .links(graph.links)
      .start();

  link = link.data(graph.links)
    .enter().append("line")
      .attr("class", "link");

  node = node.data(graph.nodes)
    .enter().append("circle")
      .attr("class", "node")
      .attr("r", 12)
      .on("dblclick", dblclick)
      .call(drag);


function tick() {
  link.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; });

  node.attr("cx", function(d) { return d.x; })
      .attr("cy", function(d) { return d.y; });
}

function dblclick(d) {
  d3.select(this).classed("fixed", d.fixed = false);
}

function dragstart(d) {
  d3.select(this).classed("fixed", d.fixed = true);
}
.link {
  stroke: #000;
  stroke-width: 1.5px;
}

.node {
  cursor: move;
  fill: #ccc;
  stroke: #000;
  stroke-width: 1.5px;
}

.node.fixed {
  fill: #f00;
}

svg{
  transform:scale(2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.2/d3.min.js"></script>

最佳答案

你可以使用svg viewBox viewport, viewBox, and preserveAspectRatio

讲的是viewbox的使用

关于javascript - 在力布局上应用比例变换后,拖动无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41836647/

相关文章:

javascript - 将带有 SVG 层的传单图导出为图像

javascript - axios response.data.pipe 不是函数

javascript - 如何在内容展开时更改 <div> 高度?

Javascript - 数组一直被解释为字符串

javascript - 如何使用 HTML 绘制数字线

javascript - 在 d3 中,如何从 SVG 线中获取内插线数据?

html - 为什么div里面有svg时还要额外增加4px高度?

javascript - D3 Force Layout - 无重叠链接

javascript - 更新d3数据到子节点

javascript - 在浏览器中生成、查看和保存 SVG 客户端