javascript - SVG Circle 元素在比例变换时跳跃

标签 javascript d3.js svg

下面是使用 D3 绘制一个圆并在鼠标悬停时对其进行缩放的代码。它做了它应该做的事情,但也将 cricle 带到其他地方,这意味着圆圈缩放并跳转(翻译)到其他位置。我无法理解其原因。

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 + ')');
        })

最佳答案

这与 D3 无关(无论是 v3 还是 v4)。这里的问题是 scale 以 SVG 的原点 (0,0) 为中心,即左上角。因此,任何不在该位置 (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>
	<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>
	<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>
	<circle cx="150" cy="75" r="20" fill="teal"></circle>
</svg>

编辑:使用 getter,您可以更改属性而无需对其进行硬编码。例如,获取圆的半径并在鼠标悬停时将其加倍,并在鼠标移开时将其除以一半:

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>
	<circle cx="150" cy="75" r="20" fill="teal"></circle>
</svg>

关于javascript - SVG Circle 元素在比例变换时跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42070321/

相关文章:

javascript - 这个内部 react 类组件的工作方式不同

javascript - 如何确定如何导入模块

javascript - 使用js在选择时获取所选项目

reactjs - 使用 D3 可滚动 X 轴 React BarChart

javascript - 组织结构图 - 树形、在线、动态、可折叠、图片 - 在 D3 中

javascript - D3 从flare.csv 中过滤树状图的根数据

javascript - 过渡动画 d3.js 的关闭路径

javascript - html2canvas 下载带有 SVG 背景图像的图像

javascript - 在 D3.js 中如何将 <g> 居中放置在 <svg> 中?

javascript - 如何在浏览器窗口较小时显示滚动条?