gpt4 book ai didi

javascript - 如何在 d3.js 中对不同元素进行链式转换?

转载 作者:行者123 更新时间:2023-11-30 20:49:24 25 4
gpt4 key购买 nike

我想对不同的元素进行链式过渡。在整个程序中,我想运行一系列转换。在元素 x 上的第一个过渡完成后,我想从元素 y 上的过渡开始,依此类推。过渡的持续时间应该有所不同。

“解决”它的一种方法是根据先前转换的持续时间总和来延迟所有后面的转换。但这非常难看,因为它非常困惑且不准确。

这是我尝试完成的示例:

<!DOCTYPE html>
<meta charset="utf-8">
<head>
<script src="https://d3js.org/d3.v4.js"></script>
</head>
<body>
<script>
let sel = d3.select("body")
let selFirst = sel.append("h1").attr("class", "first").text("first");
let selSecond = sel.append("h2").attr("class", "second").text("second");
let selThird = sel.append("h3").attr("class", "third").text("third");

let trans = d3.transition("body");
let firstTrans = trans.each(function() {selFirst.transition().style("opacity", 0).transition().style("opacity",1); })
let secondTrans = firstTrans.each(function() {selSecond.transition().style("opacity", 0).transition().style("opacity",1); })
let thirdTrans = secondTrans.each(function() {selThird.transition().style("opacity", 0).transition().style("opacity",1); })

</script>
</body>
</html>

See this JSfiddle

最佳答案

感谢 Gerardo Furtado,这是一个可能的解决方案。

第 1 步:您必须使用相同的类标记所有相应的元素,即 chained-transition

    let sel = d3.select("body")
let selFirst = sel.append("h1").attr("class", "chained-transition first").text("first");
let selSecond = sel.append("h1").attr("class", "chained-transition second").text("second");
let selThird = sel.append("h1").attr("class", "chained-transition third").text("third");

第 2 步:现在您可以创建一个选区,其中包含应连续过渡的所有元素。要为每个选择设置不同的持续时间,您可以将所需的持续时间(以毫秒为单位)附加到每个元素。 (如果您还没有在步骤 1 中创建元素时完成此操作,可以与其他数据一起创建)

    let chainedSel = d3.selectAll(".chained-transition").data([1000,2000,3000]);

第 3 步:创建一个函数,该函数一次接受一个选择,对其进行转换(及其持续时间)并使用下一个元素调用自身。下面的代码是一个用整个链式选择调用的函数。它向下过滤到相应的(下一个)元素。

    transitionNext(chainedSel);

// function gets the chained selection with
// all the corresponding elements.
// It start with the first one by default.
function transitionNext(_selection, _index = 0){
console.log("index: " + _index);
// start off with the first element (_index === 0)
let newSel =
_selection.filter(function(d,i) { return _index === i;});

newSel.transition()
.duration(d => d) // take the corresponding duration
.style("opacity", 0)
.transition()
.duration(d => d) // as above
.style("opacity",1)
.style("color", "green")
// this function is called after the transition is finished
.on ("end", function() {
_index = _index + 1;
// call function and filter the next element
if (_selection.size() > _index) { transitionNext(_selection, _index);}
});
}

完整的例子在这里:

        let sel = d3.select("body")
let selFirst = sel.append("h1").attr("class", "chained-transition first").text("first");
let selSecond = sel.append("h1").attr("class", "chained-transition second").text("second");
let selThird = sel.append("h1").attr("class", "chained-transition third").text("third");

let chainedSel = d3.selectAll(".chained-transition").data([1000,2000,3000]);

transitionNext(chainedSel);

function transitionNext(_selection, _index = 0){
console.log("index: " + _index);
let newSel =
_selection.filter(function(d,i) { return _index === i;});

newSel.transition()
.duration(d => d)
.style("opacity", 0)
.transition()
.duration(d => d)
.style("opacity",1)
.style("color", "green")
.on ("end", function() {
_index = _index + 1;
if (_selection.size() > _index) { transitionNext(_selection, _index);}
});
}
<script src="https://d3js.org/d3.v4.js"></script>

具有重复函数调用的版本仅传递一个元素的选择而不是所有元素是 here .

关于javascript - 如何在 d3.js 中对不同元素进行链式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351341/

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