【问题标题】:d3 force graph with divs and d3 zoom带有 div 和 d3 缩放的 d3 力图
【发布时间】:2017-03-12 03:45:35
【问题描述】:

您好 Stackoverflow 社区! 我无法让 d3 zoom 在我的 d3force 有向图中工作。我可以实现它正在缩放和平移,但这样做会破坏节点和链接之间的对齐,我不知道如何修复它......我创建了一个小提琴来展示我的意思。 https://jsfiddle.net/5jgrf5h8/5/

这是我执行缩放的代码:

svg.call(d3.zoom()
  //.scaleExtent([1 / 2, 4])
  .on("zoom", zoomed))
.on("dblclick.zoom", null);
//.on("wheel.zoom", null);

function zoomed() {
  //link.attr("transform", d3.event.transform);
  link.attr("transform", "translate(" + d3.event.transform.x + "," + d3.event.transform.y + ") scale(" + d3.event.transform.k + ")");
  node.style("transform", "translate(" + d3.event.transform.x + "px," + d3.event.transform.y + "px) scale(" + d3.event.transform.k + ")");

  simulation.alphaTarget(0.001).restart();
  simulation.alphaTarget(0);
}

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    当您在 div 节点上应用 CSS scale 时,它的原点是 0,0,而不是它们当前所在位置的原点。

    试试这个:

    function zoomed() {
    
        // apply CSS scale with respect to current position
        node.each(function(d){
        var self = d3.select(this),
                x = self.style("left"),
            y = self.style("top");
        self.style("transform-origin", "-" + x + " -" + y);
      })
    
      link.attr("transform", "translate(" + d3.event.transform.x + "," + d3.event.transform.y + ") scale(" + d3.event.transform.k + ")");
      node.style("transform", "translate(" + d3.event.transform.x + "px," + d3.event.transform.y + "px) scale(" + d3.event.transform.k + ")");
    
      simulation.alphaTarget(0.001).restart();
      simulation.alphaTarget(0);
    }
    

    更新fiddle here

    【讨论】:

    • 嗨,马克!谢谢你的帮助!我可以看到它有所改进,但它仍然不完美,例如当你缩小它仍然会破坏对齐,特别是当你在缩小时拖动节点时它们仍然表现得很奇怪。您知道如何改进吗?
    • 我现在明白了。而是转换所有节点和链接,我转换了它们的父元素,对于 div,我将转换原点设置为 0px。我更新了我的小提琴jsfiddle.net/5jgrf5h8/7
    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2014-10-03
    • 2017-12-13
    • 2015-11-01
    • 2021-04-07
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多