D3选择性变焦

fgy*_*ica 3 javascript zoom d3.js force-layout

我正在研究一种力导向的图形布局,其中包含一些附加功能:可选择的链接/节点,工具提示,鱼眼效果,以及 - 对我的问题很重要 - 缩放和平移.

现在,缩放工作非常好,如下所示:

d3 ... .append('svg:g').call(d3.behavior.zoom().on("zoom", redraw))... 
Run Code Online (Sandbox Code Playgroud)

重绘功能看起来像这样......

function redraw() {
  trans = d3.event.translate;
  scale = d3.event.scale;
  vis.attr("transform", "translate(" + trans + ")" + " scale(" + scale + ")");
}
Run Code Online (Sandbox Code Playgroud)

但是,此方法会缩放整个SVG图形,包括字体大小,图形边缘,节点周围的线条笔划宽度等.

是否有可能缩放某些元素?到目前为止,我看到的唯一解决方案是放一条这样的线(从这里开始http://jsfiddle.net/56RDx/2/)

node.attr("font-size", (nodeFontSize / d3.event.scale) + "px");
Run Code Online (Sandbox Code Playgroud)

在重绘方法中,基本上反转某些元素的动态缩放.然而,我的问题是(除了这是一个丑陋的黑客),我的边缘宽度是在图形绘制上动态生成的(根据一些图形属性...),所以这种'反转'方法不起作用......

小智 8

  1. 您可以向要触发缩放的元素添加一个类:

    d3 ... .append('svg:g').classed("some_classname", true).call(d3.behavior.zoom().on("zoom", redraw))...
    
    Run Code Online (Sandbox Code Playgroud)

    然后做:

    function redraw() {
      trans = d3.event.translate;
      scale = d3.event.scale;
      vis.selectAll("some_classname").attr("transform", "translate(" + trans + ")" + " scale(" + scale + ")");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者你可以为你不想触发缩放的所有元素添加一个类然后使用CSS3:not pseudo-class:

    function redraw() {
      trans = d3.event.translate;
      scale = d3.event.scale;
      vis.selectAll("*:not(.some_classname)").attr("transform", "translate(" + trans + ")" + " scale(" + scale + ")");
    }
    
    Run Code Online (Sandbox Code Playgroud)