【问题标题】:d3 zoom and pan upgrade to version 4d3 缩放和平移升级到版本 4
【发布时间】:2017-03-20 00:58:37
【问题描述】:

如果更新下面的代码以在版本 4 中工作,我们将不胜感激。我已将 zoom.behaviour 更改为 d3.zoom,但我不清楚需要进行的其他更改。它看起来比 v3 更复杂!

<!DOCTYPE html>
<html>
  <head>
   <!-- <script type="text/javascript" src="http://d3js.org/d3.v3.js"></script>-->

   <script data-require="d3@4.0.0" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>

    <style type="text/css">
      body, html {
        width: 100%;
        height: 100%;
        margin: 0;
      }
      svg {
        position: absolute;
        top: 0;
        left: 0;
      }
      p {
        text-align: center;
      }
    </style>
  </head>
  <body>
    <p>Use the mouse to pan (click and move) / zoom (scrollwheel)</p>
  </body>
  <script type="text/javascript">
      var svg = d3.select("body")
        .append("svg")
        .attr("width", "100%")
        .attr("height", "100%")
        .call(d3.zoom().on("zoom", function () {
            svg.attr("transform", "translate(" + d3.event.translate + ")" + " scale(" + d3.event.scale + ")")
        }))
        .append("g")

      svg.append("circle")
        .attr("cx", document.body.clientWidth / 2)
        .attr("cy", document.body.clientHeight / 2)
        .attr("r", 50)
        .style("fill", "#B8DEE6")
  </script>
</html>

【问题讨论】:

    标签: d3.js


    【解决方案1】:

    改变这个:

    .call(d3.zoom().on("zoom", function () {
        svg.attr("transform", "translate(" + d3.event.translate 
        + ")" + " scale(" + d3.event.scale + ")")
    }))
    

    到这里:

    .call(d3.zoom().on("zoom", function () {
            svg.attr("transform", d3.event.transform)
    }))
    

    这里是小提琴:https://jsfiddle.net/gerardofurtado/c8bga82b/

    【讨论】:

    • 非常感谢。您知道是否可以仅缩放 x 轴吗?以前我使用 zoom = d3.zoom.transform() .x(xRange) //.y(y)
    • 这在小提琴中有效,但是在我的 SVG 中,我使用的是 viewbox,这似乎破坏了它?
    【解决方案2】:

    我无法回复您对答案的评论,但这是仅缩放 x 轴的方法:

    svg.attr(
        "transform",
        'translate('+d3.event.transform.x+',0) scale('+d3.event.transform.k+',1)'
    )}))
    

    更新 jsFiddle:https://jsfiddle.net/axge6a04/1/

    【讨论】:

    • 你是最棒的!
    【解决方案3】:

    接受的答案很棒!

    对于那些想要限制平移和放大边界的人(如here)..

    改变这个:

    // width, height = viewport width, height
    .call(d3.zoom().on("zoom", function () {
      var tx = Math.min(0, Math.max(d3.event.translate[0], width - width * d3.event.scale));
      var ty = Math.min(0, Math.max(d3.event.translate[1], height - height * d3.event.scale));
      svg.attr("transform", "translate(" + [tx, ty] + ") scale(" + d3.event.scale + ")");
    });
    

    到这里:

    .call(d3.zoom().on("zoom", function () {
      d3.event.transform.x = Math.min(0, Math.max(d3.event.transform.x, width - width * d3.event.transform.k));
      d3.event.transform.y = Math.min(0, Math.max(d3.event.transform.y, height - height * d3.event.transform.k));
      svg.attr("transform", d3.event.transform);
    }));
    

    【讨论】:

    • 太好了,正是我需要的!许多示例都有zoom.transform([tx, ty]) 来更新缩放对象本身,但该功能消失了。
    猜你喜欢
    • 2017-11-02
    • 2019-07-25
    • 1970-01-01
    • 2013-05-16
    • 2018-01-04
    • 2015-08-11
    • 2019-01-15
    • 2021-10-01
    • 2017-08-22
    相关资源
    最近更新 更多