gpt4 book ai didi

javascript - 如何向加载到 D3.js 的外部 SVG 添加缩放 + 拖动行为?

转载 作者:行者123 更新时间:2023-12-01 02:28:51 25 4
gpt4 key购买 nike

我想要做的是将现有的 SVG(XML 格式)加载到 D3 中。

它工作得很好,直到我开始向 SVG 添加缩放 + 拖动行为。

实际上添加行为似乎可行,但是当我拖动 SVG 中的对象时,会出现奇怪的跳跃(或闪烁)。一次缩放后情况会变得更糟,然后对象移动得比应有的要多得多。

我想您在尝试代码示例后就会立即明白我的意思。

如何让“缩放 + 拖动”发挥应有的作用?

提前致谢

var main_chart_svg = document.body;

d3.xml("https://upload.wikimedia.org/wikipedia/commons/a/a0/Circle_-_black_simple.svg", function(error, documentFragment) {
if (error) {console.log(error); return;}

var svgNode = documentFragment
.getElementsByTagName("svg")[0];

main_chart_svg.appendChild(svgNode);

d3.selectAll('circle').style('fill', 'green'); //only in order to show, that selections work

//this is where my problem happens
d3.select('svg').call(d3.zoom().on("zoom", function () {
d3.select('svg').attr("transform", d3.event.transform)
}));
});
<script src="https://d3js.org/d3.v4.min.js"></script>

最佳答案

您正在对 svg 元素执行缩放/平移转换。它通常应用于包含您要缩放的内容的 g 元素。要使用 g,在您的情况下,您需要将此元素插入到现有的 svg 中:

<!DOCTYPE html>
<html>

<head>
<script data-require="d3@4.0.0" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>
</head>

<body>
<script>
var main_chart_svg = document.body;

d3.xml("https://upload.wikimedia.org/wikipedia/commons/a/a0/Circle_-_black_simple.svg", function(error, documentFragment) {
if (error) {
console.log(error);
return;
}

var svgNode = documentFragment
.getElementsByTagName("svg")[0];

main_chart_svg.appendChild(svgNode);

var svg = d3.select('svg'),
g = svg.append('g');

g.node().appendChild(svg.select('circle').node());

d3.selectAll('circle').style('fill', 'green'); //only in order to show, that selections work

//this is where my problem happens
d3.select('svg').call(d3.zoom().on("zoom", function() {
g.attr("transform", d3.event.transform)
}));
});
</script>
</body>

</html>

或者,如果您不想这样做,您可以直接将缩放应用于圆圈:

<!DOCTYPE html>
<html>

<head>
<script data-require="d3@4.0.0" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>
</head>

<body>
<script>
var main_chart_svg = document.body;

d3.xml("https://upload.wikimedia.org/wikipedia/commons/a/a0/Circle_-_black_simple.svg", function(error, documentFragment) {
if (error) {
console.log(error);
return;
}

var svgNode = documentFragment
.getElementsByTagName("svg")[0];

main_chart_svg.appendChild(svgNode);

var svg = d3.select('svg'),
c = d3.select('circle');


c.style('fill', 'green'); //only in order to show, that selections work

//this is where my problem happens
d3.select('svg').call(d3.zoom().on("zoom", function() {
c.attr("transform", d3.event.transform)
}));
});
</script>
</body>

</html>

关于javascript - 如何向加载到 D3.js 的外部 SVG 添加缩放 + 拖动行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48479297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com