javascript - d3.js V4 zoom 在计算缩放后跳转

标签 javascript d3.js

我希望能够在以编程方式在页面加载时将 SVG 对象居中并缩放到它们之后平移和缩放它们。 (实际用例是放大到办公室的平面图。)

对于我的简单示例,我有 2 个加载初始过渡的矩形。 (这大大简化了我的实际用例。)

自动转换后,当用户尝试平移或缩放时 - 矩形会跳回到它们的初始位置。

This堆栈溢出问题很接近,但解决方案对我不起作用。在父 SVG (#rectSVG) 上调用 d3.select 似乎很接近,但上边距和左边距现在不正确。

javascript 文件:

var rectData = [
   { "x_axis": 10, "y_axis": 10, "color" : "green" },
   { "x_axis": 500, "y_axis": 10,  "color" : "purple"}
   ];

var svgContainer = d3.select("body").append("svg")
                                    .attr("width", 1800)
                                    .attr("height", 1200)
                                    .attr("id","rectSVG")
                                    .append("g")
                                    .attr("id","groupRect");

var rectangle = svgContainer.selectAll("rect")
                            .data(rectData)
                            .enter()
                            .append("rect")
                            .attr("x", function (d) { return d.x_axis; })
                            .attr("y", function (d) { return d.y_axis; })
                            .attr("fill",function (d) { return d.color; })
                            .attr("width", 200)
                            .attr("height", 100);

var centerScale = 1;
translate = [500, 500];

  d3.select("#groupRect").transition()
        .attr("transform", "translate("+translate+")scale(" + centerScale + ")")
        .duration(650);

var svgZoomMM =  d3.select("#rectSVG");

var _zoom = d3.zoom()
  .scaleExtent([1, 1000]) 
      .on("zoom", function() {  
    d3.select("#groupRect")    
    .attr("transform", d3.event.transform);
  });

  svgZoomMM.call(_zoom);

HTML 文件:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script src="https://d3js.org/d3.v4.min.js"></script>
    <title>test</title>
</head>
<body>
  <script src="test.js"></script>
</body>
</html>

最佳答案

它跳转的原因是因为您通过选择 rectSVG 并对其进行了手动转换。缩放变换事件 (d3.event.transform) 不知道 react 已经被翻译了(你可以通过检查 d3.event.transform.x 和 d3.event.transform.y 来验证)。为了告诉缩放变换事件图形已经变换,您需要创建一个新的变换事件,例如 var t = d3.zoomIdentity.translate(500, 500).scale(1); 并将其应用于可缩放的 SVG svgZoomMM.transition().duration(650).call(_zoom .transform, t);

工作示例 https://jsfiddle.net/qj2r70wa/

关于javascript - d3.js V4 zoom 在计算缩放后跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49928931/

相关文章:

javascript - CSS3 Marquee/Ticker 动画最后没有空格

javascript - 检查当前迭代元素是否是最后一个?

javascript - 如何在粘性菜单上只显示主菜单

javascript - selectAll ("rect") 选择所有矩形,但不对某些矩形应用鼠标悬停功能

javascript - react native MapView : undefined is not an object

javascript - 检测 body 与 Backbone 滚动( Marionette )

d3.js - 可以为力导向布局指定自定义力函数吗?

javascript - 树形图——防止标签重叠节点

javascript - 在 d3.js 中更改某行的颜色

javascript - nvd3折线图自动设置填充不透明度