gpt4 book ai didi

javascript - d3js 缩放 svg 和轴

转载 作者:行者123 更新时间:2023-11-28 06:07:17 25 4
gpt4 key购买 nike

我正在尝试使用 d3 将外部 svg 文件绘制到网页中,并使其在滚动时缩放。我关注了http://bl.ocks.org/mbostock/3892919但是当我添加 svg 文件时,它保持固定并且不会缩放。我将绘制几个 svg,这样我将有一个像这样的数组:

var data = []
data.push({
name: "base",
x: 50,
y: 50,
width: 350,
url: 'https://upload.wikimedia.org/wikipedia/commons/1/15/Svg.svg'
});

并用函数绘制它:

function add(elements, offsetX = 0, offsetY = 0) {
for (let e of elements) {
d3.xml(e.url, 'image/svg+xml', function(error, xml) {
if (error) {
console.log('error' + error)
throw error;
}
var svgNode = xml.getElementsByTagName('svg')[0];
d3.select(svgNode).attr('id', e.name)
.attr('x', e.x + offsetX)
.attr('y', e.y + offsetY);
svg.node().appendChild(svgNode);
svg.select('#' + e.name)
.attr('width', e.width);
});
}
}

完整jsfiddle

最佳答案

我查看了可用的平移和缩放示例,这就是我发现的。在 zoomed 函数中,附加的元素应该有平移和缩放,而不仅仅是 x 和 y 轴。

因此,我创建了一个组来附加元素:

var elementsToScale = svg.append("g").attr("id", "elementsToScale")

我在 zoomed 函数中添加了最后几行:

function zoomed() {
svg.select(".x.axis").call(xAxis);
svg.select(".y.axis").call(yAxis);
var translate = d3.event ? d3.event.translate : "0,0"
var scale = d3.event ? d3.event.scale : "1"
svg.select("#elementsToScale").attr("transform", "translate(" + translate + ")" + " scale(" + scale + ")");
}

然后我更改了 add 函数以将元素附加到 elementsToScaleGroup:

d3.xml(el.url, 'image/svg+xml', function(error, xml) {
if (error) {
console.log('error' + error)
throw error;
}
var svgNode = xml.getElementsByTagName('svg')[0];
d3.select(svgNode).attr('id', e.name)
.attr('x', el.x + offsetX)
.attr('y', el.y + offsetY);

elementsToScale.node().appendChild(svgNode);
elementsToScale.select('#' + el.name)
.attr('width', el.width);
});

这是一个working fiddle .

唯一剩下的就是重置时附加的元素的补间。

关于javascript - d3js 缩放 svg 和轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36721415/

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