Javascript D3使用for循环链接动画
我想在for循环上链接d3动画。实现这一目标的最佳方式是什么:Javascript D3使用for循环链接动画,javascript,d3.js,Javascript,D3.js,我想在for循环上链接d3动画。实现这一目标的最佳方式是什么: for (var i=0; i<dat.length-1; i++) { var a = function(g,dat,i){ /* g.transition().duration(i * 19) .attr("cy", dat[i+1].y1) .attr("cx", dat[i+1].x1
for (var i=0; i<dat.length-1; i++) {
var a = function(g,dat,i){
/*
g.transition().duration(i * 19)
.attr("cy", dat[i+1].y1)
.attr("cx", dat[i+1].x1)
.attr("r", 10);*/
console.log("transform " + dat[i+1].x1);
};
var t = setTimeout(a(g,dat,i), i*20);
}
for(var i=0;i可以使用transition.delay()来链接转换。
for(变量i=0;i
我找到了一个适合我的解决方案。我觉得它仍然是难看的代码,但至少它是有效的
首先,我为数据集中的每个数据创建一个不可见的对象:
g.data(dat)
.enter()
.append("circle")
.attr("class", function(d,i) { return "default " + d.pn; })
.attr("cx", function(d,i) { return d.x1; })
.attr("cy", function(d,i) { return d.y1; })
.attr("r", function(d,i) { return d.r; })
.style("opacity", 0);
然后我将为每个元素安排一个转换:
g.each(function(d,i){
var delay = Math.floor((i+1) / nrOfElements);
//console.log(delay);
d3.select(this)
.transition()
.delay(delay * speed)
.duration(speed + DELAY_OFFSET)
.style("opacity", 100)
.attr("cx", function(d) { return i<dat.length-1 ? dat[i+1].x1 : dat[i].x1; })
.attr("cy", function(d) { return i<dat.length-1 ? dat[i+1].y1 : dat[i].y1; })
.attr("r", function(d) { return i<dat.length-1 ? dat[i+1].r : dat[i].r; })
.style("stroke", "blue") // TODO: setAttributes
.each("end", function() {
// Reset to privious attributes
d3.select(this)
.attr("cx", function(d) { return dat[i].x1; })
.attr("cy", function(d) { return dat[i].y1; })
.attr("r", function(d) { return dat[i].r; })
;
if(i<dat.length-nrOfElements) d3.select(this).style("opacity", 0);
})
;
});
g.each(函数(d,i){
var延迟=数学下限((i+1)/nROFEMENT);
//控制台日志(延迟);
d3.选择(本)
.transition()
.延迟(延迟*速度)
.持续时间(速度+延迟\u偏移)
.style(“不透明度”,100)
.attr(“cx”,函数(d){返回i但如果这样做,最后一次转换将覆盖所有隐私,因此只能看到一个动画。
g.each(function(d,i){
var delay = Math.floor((i+1) / nrOfElements);
//console.log(delay);
d3.select(this)
.transition()
.delay(delay * speed)
.duration(speed + DELAY_OFFSET)
.style("opacity", 100)
.attr("cx", function(d) { return i<dat.length-1 ? dat[i+1].x1 : dat[i].x1; })
.attr("cy", function(d) { return i<dat.length-1 ? dat[i+1].y1 : dat[i].y1; })
.attr("r", function(d) { return i<dat.length-1 ? dat[i+1].r : dat[i].r; })
.style("stroke", "blue") // TODO: setAttributes
.each("end", function() {
// Reset to privious attributes
d3.select(this)
.attr("cx", function(d) { return dat[i].x1; })
.attr("cy", function(d) { return dat[i].y1; })
.attr("r", function(d) { return dat[i].r; })
;
if(i<dat.length-nrOfElements) d3.select(this).style("opacity", 0);
})
;
});