gpt4 book ai didi

javascript - d3.js 带有 exit() 和 enter() 的子转换

转载 作者:行者123 更新时间:2023-11-29 19:33:04 24 4
gpt4 key购买 nike

问题简短: 如何在 this.selection.exit() 的子转换中访问整个 this.selection

我正在尝试制作一个 d3.js 过渡序列。我知道如何使用 transition.transition() 函数来创建一个序列,但这是我的问题。

顺序应该是:[删除.exit()节点]→[移动节点]→[添加.enter()节点]

代码是:

        this.selection.exit().remove();
this.selection
.style("left", this.styleLeft)
.style("top", this.styleTop)
.style("width", this.styleWidth)
.style("height", this.styleHeight);
this.selection.enter().append("div")
.attr("class", "node")
.style("left", this.styleLeft)
.style("top", this.styleTop)
.style("width", this.styleWidth)
.style("height", this.styleHeight);

如果我将 transition() 添加到上面的每个命令,所有转换将同时开始。 .delay() 似乎无法同时处理多个转换。

所以我想将子转换与 .transition() 一起使用,但是如果我将第二个命令应用于第一个命令,我只有 .exit()选择。

编辑 1:

它如何不起作用的示例:

        this.selection.exit().transition()
.duration(1000).style("opacity", 0).remove();

this.selection.transition().delay(1010)
.duration(1000)
.style("left", this.styleLeft)
.style("top", this.styleTop)
.style("width", this.styleWidth)
.style("height", this.styleHeight)

this.selection.enter().append("div")
.attr("class", "node")
.style("opacity", 0)
.style("left", this.styleLeft)
.style("top", this.styleTop)
.style("width", this.styleWidth)
.style("height", this.styleHeight)
.transition()
.delay(2020)
.duration(1000)
.style("opacity", 1);

此处错误:最后一个转换没有开始,因此所有新节点都是不透明的。但如果我禁用第二个转换,它会起作用。

编辑 2:

http://jsfiddle.net/dq6d117g/6/

如果在转换期间再次调用该函数,则会出现问题。

此外,延迟应该与动画一样长。如果没有动画,延迟应该为 0。这就是我想使用结束事件的原因。

最佳答案

根据 Mike Bostock 的 answer here,您可以使用 d3.transition().each() 对预先存在的选择进行链接转换。 ,但是,在我的测试中它没有跳过不需要的转换,所以我添加了条件来跳过空选择的转换:

http://jsfiddle.net/dq6d117g/8/

var transition=d3.transition().duration(2000);

if (!selection.exit().empty()) transition=transition.each(function(){
selection.exit()
.transition()
.style("opacity", 0)
.remove();
}).transition();

if (!selection.empty()) transition=transition.each(function(){
selection.transition()
.style("height", function (d) {
return (d.value * 10) + "px";
});
}).transition();

transition.each(function(){
selection.enter()
.append("div")
.attr("class", "bar")
.attr("id", function (d) {
return d;
})
.style("opacity", 0)
.style("height", function (d) {
return (d.value * 9) + "px";
})
.text(function (d) {
return d.id
})
.transition()
.style("opacity", 1)
.style("height", function (d) {
return (d * 10) + "px";
});
});

关于javascript - d3.js 带有 exit() 和 enter() 的子转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26421388/

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