在编程变焦后使用鼠标时,d3.js平移和缩放跳跃

Tyl*_*raf 3 javascript d3.js

我正试图在加载时将d3图放在中心位置.所以我跑了

var g = svg.append("g");

//... then later

g.call(zoom.transform, center);
Run Code Online (Sandbox Code Playgroud)

它实际上并不是中心,而是现在正在缩放.但规模有效.问题是,当我滚动到放大或缩小时,它从而1不是开始0.5.所以它跳了起来.

这是我的jsbin.

Mar*_*ark 7

您正在将事件应用于其他对象(g),然后在(the svg)上设置缩放.由于zoom事件是针对它应用的元素引用的,d3现在不是关于初始居中.来自文档:

缩放行为将缩放状态存储在应用缩放行为的元素上,而不是缩放行为本身.这是因为缩放行为可以同时应用于许多元素,并且每个元素都可以独立缩放.缩放状态可以在用户交互时更改,也可以通过zoom.transform以编程方式更改.

更改您的电话以svg.call(zoom.transform, center);解决您的问题.

完整代码:

var svg = d3.select("svg"),
    width = +svg.attr("width"),
    height = +svg.attr("height"),
    transform = d3.zoomIdentity;

var points = d3.range(2000).map(phyllotaxis(10));

var zoom = d3.zoom()
    .scaleExtent([1 / 2, 8])
    .on("zoom", zoomed);

var g = svg.append("g");

g.selectAll("circle")
    .data(points)
  .enter().append("circle")
    .attr("cx", function(d) { return d.x; })
    .attr("cy", function(d) { return d.y; })
    .attr("r", 2.5)
    .call(d3.drag()
        .on("drag", dragged));

svg.call(zoom);

function zoomed() {
  g.attr("transform", d3.event.transform);
}

function center() {
  return d3.zoomIdentity
        .scale(0.5);
}

function dragged(d) {
  d3.select(this).attr("cx", d.x = d3.event.x).attr("cy", d.y = d3.event.y);
}

function phyllotaxis(radius) {
  var theta = Math.PI * (3 - Math.sqrt(5));
  return function(i) {
    var r = radius * Math.sqrt(i), a = theta * i;
    return {
      x: width / 2 + r * Math.cos(a),
      y: height / 2 + r * Math.sin(a)
    };
  };
}

svg.call(zoom.transform, center);
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<svg width="960" height="500"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)