我赞成并同意@Jason 的回答,这将尝试通过一些说明和一个简单的演示来完成前面的内容,该演示可用作多种过渡行为的游乐场。
检查您的代码,您有各种动画正在进行,但只需要命名其中两个以摆脱所有转换“colisions”,
两个事件侦听器:
text.on('mouseover', function(d) {
d3.select(this).transition("texTr").duration(100).style('fill', 'yellow');
});
enter_text.on('mouseover', function(d) {
d3.select(this).transition("enterTexTr").duration(100).style('fill', 'yellow');
});
长话短说,没有名称 D3 认为代码中的所有转换都是相同的,因此它会停止正在进行的转换(一个示例可以是字母转换)并将其替换为一个新的转换(例如由事件监听器),因为转换名称是相同的。
但有时期望的行为是显式停止某些元素的过渡;这可以使用.interrupt("transitionName")
:
.on("mouseover", function() {
d3.select(this).interrupt("fadeOut")
.attr("fill", "orange")
})
.on("mouseout", function(d) {
d3.select(this).transition("fadeOut")
.duration(5000)
.attr("fill", "rgb(0, 0, " + (d * 10) + ")");
})
在这种情况下,如果没有中断命令,我们将无法触发fill orange
直到fadeOut
结束(5 秒!)。
这是你可以玩的FIDDLE :)