初始缩放在d3 v4中不起作用

时间:2018-05-16 09:30:46

标签: javascript d3.js zoom

我已经像这样导入了zoom

import {zoom} from 'd3-zoom';

我的svg和群组container看起来像这样

const svg = select(root)
      .append('svg')
      .attr('width', width)
      .attr('height', height);

const container = svg.append('g');
const zoomScale = 2;

我尝试设置初始缩放级别(通过zoom().scaleTo()这样的功能

zoom().scaleTo(container, zoomScale)

或者像这样

container.call(zoom().scaleTo, zoomScale)

但没有任何反映出来。 有趣的是缩放功能有效,看起来像这样

svg.call(
  zoom().on('zoom', () => {
    const transformation = getEvent().transform;
    const {x, y, k} = transformation;
    container.attr('transform', `translate(${x}, ${y})scale(${k})`);
  })
);

通过在我的容器中添加变换来添加初始缩放也可以,但是在下一个缩放触发器上,缩放从值1开始,在整个图表中可以看到闪烁的东西。我希望避免这种情况。

这里有什么问题?请帮忙。

1 个答案:

答案 0 :(得分:3)

使用d3.zoom()方法(或者,在您的情况下,zoom())设置变量或常量:

const myZoom = zoom().on('zoom', () => {
    const transformation = getEvent().transform;
    const {x, y, k} = transformation;
    container.attr('transform', `translate(${x}, ${y})scale(${k})`);
});

我在这里使用myZoom作为名称只是为了表明它与zoom()不同,但最传统的名称是zoom(当然,你可以选择任何有效的名称)你想要的名字。)

然后,您可以将其用作:

myZoom.scaleTo(container, zoomScale)

使用myZoom.scaleTo(container, zoomScale)zoom().scaleTo(container, zoomScale)之间的主要区别在于myZoom包含对事件处理程序和链中其他方法的引用(如果有)。

另外,不要忘记更改SVG中的调用,这只是:

svg.call(myZoom);