【问题标题】:D3js zoom with reset function具有重置功能的 D3js 缩放
【发布时间】:2018-11-16 18:42:07
【问题描述】:

我在一个项目中使用 D3js,需要缩放功能和重置缩放的能力。我的问题是缩放功能就像从未发生过重置一样。这是我的代码:

function load() {
  var svg = d3.select("body")
    .append("svg")
    .attr("width", "100%")
    .attr("height", "100%");
  var zoom = d3.zoom().on("zoom", function() {
    d3.select("#vis").attr("transform", d3.event.transform);
  });
  var vis = svg.call(zoom).append("g").attr("id", "vis");
  d3.select("body").on("keypress", function() {
    if (d3.event.shiftKey) {                                                                                                        
      if (d3.event.key == "R") {                                                                                                    
        vis.transition().duration(500).attr("transform", d3.zoomIdentity);
      }
    }
  });
  vis.append("rect")
    .attr("x", 10)
    .attr("y", 10)
    .attr("width", 100)
    .attr("height", 100);
}

以下是该问题的运行示例: http://bl.ocks.org/nicmcd/a74b0bfba61f50d932dedd6534ad7d9e

如何获得重置操作以重置缩放功能的内部状态,以便将来的事件以重置状态为基础?

【问题讨论】:

    标签: javascript d3.js svg zooming


    【解决方案1】:

    我的代码有两个问题。首先,转换需要来自svg 而不是vis。其次,重置转换不能使用attr()手动完成,必须使用call()完成。这是修改后的代码:

      function load() {
        var svg = d3.select("body")
          .append("svg")
          .attr("width", "100%")
          .attr("height", "100%");
    
        var zoom = d3.zoom().on("zoom", function() {
          vis.attr("transform", d3.event.transform);
        });
    
        var vis = svg.append("g").attr("id", "vis");
        svg.call(zoom);
    
        d3.select("body").on("keypress", function() {
          svg.transition().duration(500).attr("transform", d3.zoomIdentity)          
        });
    
        vis.append("rect")
          .attr("x", 10)
          .attr("y", 10)
          .attr("width", 100)
          .attr("height", 100);
      }
    

    这是一个工作示例: http://bl.ocks.org/nicmcd/4c730aa64c04bf100a58f224b90c2ff4

    感谢 Andrew Reid 指出错误。

    【讨论】:

    • 我花了一整天在自己的代码中调试这个问题。我发现了许多不起作用的 SE 答案。你的是第一个这样做的。谢谢!!
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2016-05-07
    • 2016-12-25
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多