【问题标题】:Chart Jumps on drag with d3.zoom d3 v4使用 d3.zoom d3 v4 拖动时图表跳转
【发布时间】:2019-05-03 15:27:19
【问题描述】:

我正在使用 d3 绘制一堆箭头(通过链接连接的节点)。当按下 ctrl 键并单击并拖动背景时,我正在使用 d3.zoom 转换背景。

我想放大箭头,以便在页面加载时它们填满屏幕。这很好用,但是当我平移(通过 ctrl + 拖动背景)时,它会从我的自动缩放位置跳到原点。

(这里我通过计算自动变换/缩放,获取顶部svg元素的子组并设置其变换属性来翻译)

这是我设置缩放的代码:

zoom(width, height){

 // Get autozoom translate and scale
 const autozoom = this.AutoZoom(width, height);

 // Bind zoom event to top level svg and on zooom append transform attribute to svg > g
 topSvg.call(d3.zoom()
  .scaleExtent([1, 2])
  .on("zoom", () =>
    svgG.attr("transform", (e) => {
      return d3.event.transform;
    }))
 );

 //Make the initial transform to translate grop
 if ((autozoom != null) ) {
  svg.attr("transform", `translate(${autozoom .translate})scale(${autozoom.scale})`);
 }
}

当我点击并拖动时,如何阻止图表从翻译位置跳转到原点?

【问题讨论】:

  • 阅读 d3-zoom 文档,有一些功能可以满足您的需求,如果您返回不依赖于e的东西,为什么还要使用箭头功能@
  • 是的,我一直在查看文档。 translateExtent 函数似乎是我想要使用的,因为我想要缩放视图的左上角和右下角。我还没有任何成功。我使用了箭头函数,所以我可以放置断点并进行测试。我忘了把它拿出来。
  • 还有更多名称中带有translate的函数

标签: d3.js


【解决方案1】:

经过一番挖掘,我找到了答案。因此,在具有缩放功能的页面上执行初始缩放时需要完成三件事:

1) 计算平移/缩放 svg 所需的量,然后为 svg 下的组设置变换属性。

  const groupZoom= this.GetSvgZoom(width, height);
  // svgGroup = svg > g
  svgGroup.attr("transform", `translate(${groupZoom.translate})scale(${groupZoom.scale})`); 

2) 现在页面已经移动,您需要通知缩放事件从您翻译的位置开始。

  const extent = this.GetZoomOrigin(width,height);
  d3.zoom().translateTo(svg, extent.translate[0], extent.translate[1]); 
  d3.zoom().scaleTo(svg, extent.scale);

3) 最后将缩放事件绑定到 svg 元素以提供缩放功能

svg.call(d3.zoom()
  .on("zoom", () =>
    svgGroup.attr("transform", d3.event.transform))
 );

【讨论】:

  • 这是什么。GetSvgZoom?
  • 哦,好吧,我想它是一个检索缩放变换的函数: var transform = d3.zoomTransform(selection.node());
猜你喜欢
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多