2017-02-06 37 views
1

下面是使用D3在鼠标悬停上使用圆形和缩放它的代码。它做它应该做的事情,但也将cricle带到别的地方,这意味着圈子尺度和跳转(翻译)到其他位置。我无法理解它的原因。SVG圆形元素按比例变换跳转

this.node = this.chartLayer.append("g") 
     .attr("class", "nodes") 
     .selectAll("circle") 
     .data(data.nodes) 
     .enter().append("circle") 
     .attr("r", 10) 
     .attr("fill", (d) => { return this.colors(d.group); }) 
     .on('mouseover', function(d) { 
      d3.select(this).attr('transform', 'scale(' + 2 + ')'); 
     }) 

回答

1

这与D3(无论是v3还是v4)无关。这里的问题是,scale居中在SVG的起点(0,0)处,即SVG的左上角。因此,任何不在该位置(0,0)的元素似乎都会移动。

看一看这(将鼠标悬停在圈子):

var circle = d3.select("circle"); 
 
circle.on('mouseover', function(d) { 
 
    d3.select(this).attr('transform', 'scale(' + 2 + ')'); 
 
})
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<svg> 
 
\t <circle cx="150" cy="75" r="20" fill="teal"></circle> 
 
</svg>

解决方案:翻译规模之前的元素原点:

var circle = d3.select("circle"); 
 
circle.on('mouseover', function(d) { 
 
    d3.select(this).attr('transform', 'translate(-150,-75) scale(' + 2 + ')'); 
 
})
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<svg> 
 
\t <circle cx="150" cy="75" r="20" fill="teal"></circle> 
 
</svg>

D3解决方案(更好的方式):只需改变圆的半径:

var circle = d3.select("circle"); 
 
circle.on('mouseover', function(d) { 
 
    d3.select(this).attr('r', 40); 
 
})
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<svg> 
 
\t <circle cx="150" cy="75" r="20" fill="teal"></circle> 
 
</svg>

编辑:使用干将,你可以改变属性没有硬编码。例如,得到了圆的半径和它mouseover加倍,然后除以一半mouseout

var circle = d3.select("circle"); 
 
circle.on('mouseover', function(d) { 
 
    var r = d3.select(this).attr('r') 
 
    d3.select(this).attr('r', r*2); 
 
}).on('mouseout', function(d) { 
 
    var r = d3.select(this).attr('r') 
 
    d3.select(this).attr('r', r/2); 
 
});
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<svg> 
 
\t <circle cx="150" cy="75" r="20" fill="teal"></circle> 
 
</svg>

+0

伟大的答案@赫拉尔多 - 朵。我喜欢半径解决方案,但有没有办法在鼠标悬停后将比例因子应用于半径,并在mouseout时恢复正常? – cpz

+0

我想我将不得不跟踪鼠标悬停节点及其半径,并使用存储的值恢复。 – cpz

+0

我写了这个答案只是为了向你展示“规模”的问题。如果您有强制定向图表,只需根据数据或任何硬编码值更改半径。检查编辑。 –