gpt4 book ai didi

animation - d3 : How to properly chain transitions on different selections

转载 作者:行者123 更新时间:2023-12-02 19:26:56 25 4
gpt4 key购买 nike

我正在使用流行的 d3 库的 V3,基本上想要有三个转换,依次进行:第一个转换应应用于退出选择,第二个应用于更新选择,第三个应用于进入选择。它们应该以这样的方式链接起来:当其中一个选择为空时,将跳过其各自的转换。 IE。当没有退出选择时,更新选择应立即开始。到目前为止,我已经想出了这段代码(使用 delay 函数)。

// DATA JOIN
var items = d3.select('#data').selectAll('.item');
items = items.data(data, function(d){
return d.twitter_screenname;
});


// EXIT
items.exit().transition().duration(TRANSITION_DURATION).style('opacity', 0).remove();

// UPDATE
// Divs bewegen
items.transition().duration(TRANSITION_DURATION).delay(TRANSITION_DURATION * 1)
.style('left', function(d, i) {
return positions[i].left + "px";
}).style('top', function(d, i) {
return positions[i].top + "px";
});

// ENTER
// Divs hinzufügen
var div = items.enter().append('div')
.attr('class', 'item')
.style('left', function(d, i) {
return positions[i].left + "px";
}).style('top', function(d, i) {
return positions[i].top + "px";
});

div.style('opacity', 0)
.transition().duration(TRANSITION_DURATION).delay(TRANSITION_DURATION * 2)
.style('opacity', 1);

首先它不允许“跳过”转换,其次我认为有比延迟更好的方法。我看过http://bl.ocks.org/mbostock/3903818但我不太明白发生了什么。

此外,不知何故,仅编写 items.exit().transition().duration(TRANSITION_DURATION).remove() 不适用于 items,可能是因为它们不是 SVG 元素,而是 div

最佳答案

当然。这里有两种方法。

首先,您可以使用显式 delay ,然后使用 selection.empty 进行计算跳过空转换。 (这只是对已有内容的一个小修改。)

var div = d3.select("body").selectAll("div")
.data(["enter", "update"], function(d) { return d || this.textContent; });

// 2. update
div.transition()
.duration(duration)
.delay(!div.exit().empty() * duration)
.style("background", "orange");

// 3. enter
div.enter().append("div")
.text(function(d) { return d; })
.style("opacity", 0)
.transition()
.duration(duration)
.delay((!div.exit().empty() + !div.enter().empty()) * duration)
.style("background", "green")
.style("opacity", 1);

// 1. exit
div.exit()
.style("background", "red")
.transition()
.duration(duration)
.style("opacity", 0)
.remove();

http://bl.ocks.org/mbostock/5779682

这里的一个棘手的事情是,您必须在为输入元素创建转换之前更新元素上创建转换;那是因为enter.append将输入元素合并到更新选择中,并且您希望将它们分开;请参阅Update-only Transition example了解详情。

或者,您可以使用 transition.transitionchain transitions ,和transition.each将这些链式转换应用到现有选择。在transition.each的上下文中,selection.transition继承现有的转换而不是创建一个新的转换。

var div = d3.select("body").selectAll("div")
.data(["enter", "update"], function(d) { return d || this.textContent; });

// 1. exit
var exitTransition = d3.transition().duration(750).each(function() {
div.exit()
.style("background", "red")
.transition()
.style("opacity", 0)
.remove();
});

// 2. update
var updateTransition = exitTransition.transition().each(function() {
div.transition()
.style("background", "orange");
});

// 3. enter
var enterTransition = updateTransition.transition().each(function() {
div.enter().append("div")
.text(function(d) { return d; })
.style("opacity", 0)
.transition()
.style("background", "green")
.style("opacity", 1);
});

http://bl.ocks.org/mbostock/5779690

我认为后者更惯用,尽管使用transition.each将过渡应用于选择(而不是使用默认参数导出过渡)并不是一个广为人知的功能。

关于animation - d3 : How to properly chain transitions on different selections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17086415/

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