【发布时间】:2012-10-16 14:03:44
【问题描述】:
我正在开发具有一些附加功能的强制导向图布局:可选链接/节点、工具提示、鱼眼效果,以及 -- 对我的问题很重要 -- 缩放和平移。
现在,缩放效果很好,如下所示:
d3 ... .append('svg:g').call(d3.behavior.zoom().on("zoom", redraw))...
重绘函数看起来像这样...
function redraw() {
trans = d3.event.translate;
scale = d3.event.scale;
vis.attr("transform", "translate(" + trans + ")" + " scale(" + scale + ")");
}
但是,此方法会缩放整个 SVG 图形,包括字体大小、图形边缘、节点周围的线条笔划宽度等。
是否有可能不缩放某些元素?到目前为止我看到的唯一解决方案是写这样一行(从这里获取http://jsfiddle.net/56RDx/2/)
node.attr("font-size", (nodeFontSize / d3.event.scale) + "px");
在重绘方法中,基本上是在运行时反转某些元素的缩放。然而,我的问题是(除了这是一个丑陋的黑客之外),我的边缘宽度是在图形绘制上动态生成的(根据一些图形属性......),所以这种“反转”方法不起作用......
【问题讨论】:
-
为什么不在单个 SVG 形状上将
scale()设置为较小的数量? -
你有演示吗?你想不缩放什么?
-
@A.M.K 代码有点庞大,很难将其放入演示中......但这是许多使用功能的来源:bl.ocks.org/2514276#index.html
-
@A.M.K 我将如何仅针对某些 SVG 形状将 ''scale()'' 设置为较小的数量?
-
没关系,这行不通,请看我下面的答案。
标签: javascript d3.js zooming force-layout