您基本上有两个选择。首先,您可以使用正常的链式转换模式,根据先前转换的持续时间计算后续转换的延迟:
d3.select("svg").append("circle")
.attr("transform", "translate(20,20)")
.attr("r", 20)
.attr("fill", "black")
.transition().duration(1000)
.attr("fill", "orange")
.transition().delay(1500).duration(500)
.attr("fill", "blue");
第二次转换的延迟 1500 是第一次转换的持续时间 1000 加上第二次转换开始之前的延迟 500。如果您有权访问这些数字(例如,从绑定到元素的数据),您应该能够很容易地计算后续转换的延迟。
另一种方法是使用transition.each() https://github.com/mbostock/d3/wiki/Transitions#each为“结束”事件附加一个处理程序并使用它来设置第二个转换:
d3.select("svg").append("circle")
.attr("transform", "translate(100,20)")
.attr("r", 20)
.attr("fill", "black")
.transition().duration(1000)
.attr("fill", "orange")
.each("end", function() {
d3.select(this)
.transition().delay(500).duration(500)
.attr("fill", "blue");
});
这里第二个转换的延迟是相对于第一个转换的,即仅在第一个转换完成时才开始。然而,这种方法确实需要您进行这些嵌套调用,这可能可行也可能不可行,具体取决于您要寻找的内容。
如果您可以立即开始转换,则一切都会按预期进行:
d3.select("svg").append("circle")
.attr("transform", "translate(180,20)")
.attr("r", 20)
.attr("fill", "black")
.transition().duration(1000)
.attr("fill", "orange")
.transition().duration(1000)
.attr("fill", "blue");
这里,当第一个转换完成时,第二个转换开始。
完整演示here http://jsfiddle.net/zjuzgfgu/1/.