我正在研究一种具有一些附加功能的力导向图布局:可选择的链接/节点,工具提示,鱼眼效果,以及 - 对我的问题很重要 - 缩放和平移。
现在,缩放效果非常好:
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");
在重绘方法中,基本上反转了对动态某些元素的缩放。然而,我的问题是(除了这是一个丑陋的黑客),我的边缘宽度是在图形绘制上动态生成的(根据一些图形属性...),所以这种'反转'方法不起作用...... < / p>
答案 0 :(得分:2)
我能找到的唯一解决方案是“丑陋的黑客”,如果(我假设你是)你试图不缩放线,例如,你应该尝试以下,它适用于放大和缩小:
演示:http://jsfiddle.net/SO_AMK/gJMTb/
JavaScript:
function redraw() {
vis.attr("transform", "translate(" + d3.event.translate + ")" + " scale(" + d3.event.scale + ")");
vis.attr("font-size", (nodeFontSize / d3.event.scale) + "px");
vis.selectAll("line.link").style("stroke-width", getStrokeWidth); // Function so it runs for each element individually
}
function getStrokeWidth(){
if (!this.__data__.stroke) { // Doesn't exist, so set it to the original stroke-width
this.__data__.stroke = parseFloat(d3.select(this).style("stroke-width"));
// I found __data__ to be easier than d3's .data()
}
return this.__data__.stroke / d3.event.scale + "px";
}
有关使用style()