我想要呈现几个外部SVG文件(路径和多边形的各种形状)。对于每个形状,我想以随机位置和不同的笔触颜色呈现它们。
我可以使用d3.xml()
一次成功阅读一个,更改其属性等。
var sampleSVG = d3.select("body")
.append("svg")
.attr("width", 300)
.attr("height", 300);
var shapes = ["https://dl.dropboxusercontent.com/u/2467665/shapes-24.svg",
"https://dl.dropboxusercontent.com/u/2467665/shapes-23.svg"];
d3.xml("https://dl.dropboxusercontent.com/u/2467665/shapes-24.svg", "image/svg+xml",
function(xml) {
sampleSVG.node().appendChild(xml.documentElement);
var innerSVG = sampleSVG.select("svg");
innerSVG
.select("*")//selects whatever the shape is, be it path or polygon
.attr("transform", "translate("+Math.floor(Math.random() * 100)+","+Math.floor(Math.random() * 100)+") scale(.3)")
.attr("stroke", "purple");
});
从数组中读取多个外部文件的最佳方法是什么?我如何独立操作每个文件的位置和属性?
答案 0 :(得分:1)
您可以使用D3.js作者的queue.js库在渲染导入的svg之前等待所有文件返回。见下面的例子。
var width = 300, height = 300;
var sampleSVG = d3.select("body")
.append("svg")
.attr( {width: width, height: height} );
var shapes = [
{ url: "https://dl.dropboxusercontent.com/u/2467665/shapes-24.svg", color: 'purple' },
{ url: "https://dl.dropboxusercontent.com/u/2467665/shapes-23.svg", color: 'red' }
];
var q = queue();
shapes.forEach(function(shape) {
q.defer(d3.xml, shape.url, "image/svg+xml");
});
q.awaitAll(function(error, results) {
sampleSVG.selectAll('g.shape').data(shapes)
// g tag is created for positioning the shape at random location
.enter().append('g').attr('class', 'shape')
.attr('transform', function() {
return 'translate(' + Math.random()*(width-50) + ',' + Math.random()*(height-50) + ')'
})
.each(function(d,i) {
// the loaded svg file is then appended inside the g tag
this.appendChild(results[i].documentElement);
d3.select(this).select('svg').select("*")
.attr("transform", "scale(0.2)")
.attr("stroke", function() { return d.color; });
})
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.js"></script>
<script src="http://d3js.org/queue.v1.min.js"></script>