【问题标题】:Looping transition in D3D3中的循环过渡
【发布时间】:2014-04-23 00:54:09
【问题描述】:

基本说明:我有点 D3 新手。

我的目标是让一条线从 A 点移动到 B 点,然后立即重新出现在 A 点并重复该过渡。我尝试了很多不同的方法,但这是我最接近的一次。

var svg = d3.select("body")
        .append("svg")
        .attr("width", 500)
        .attr("height", 500);

// code, code, code, irrelevant code...

function timeForTimeline(){ // har
    var timeline = svg.append("line")
        .attr("stroke", "steelblue")
        .attr({
            'x1': 0,
            'y1': 130,
            'x2': 168,
            'y2': 130
        });
    (function repeat() {
        timeline = timeline
            .transition()
            .duration(4000)
            .ease("linear")
            .attr({
                'x1': 0,
                'y1': 430,
                'x2': 168,
                'y2': 430   
            })
            .each("end", function(){
                d3.select(this)
                    .transition()
                    .duration(0)
                    .attr({
                        'x1': 0,
                        'y1': 130,
                        'x2': 168,
                        'y2': 130
                    })
                    .each("end", repeat);
            });
    })();
};

结果是一个出色的起始过渡,随后线在 A 点和 B 点之间快速跳转,而 duration(4000) 位未生效。我还尝试删除底部的行 (d3.select(this).remove()),然后在每次调用 repeat() 的顶部添加一个新行。我也尝试过重置 x1、x2、y1 和 y2 并完全跳过过渡。我并不是说我尝试正确,但我的结果要么根本没有线,要么是无限的线,要么是一条到达 B 点并停留在那里的线。

关于如何实现我的(可能非常简单)目标的任何其他建议?非常感谢您的帮助!

【问题讨论】:

    标签: javascript svg d3.js


    【解决方案1】:

    在我看来,您不需要指定起始坐标两次。您可以在重复函数中分配初始坐标并立即调用它,如下所示:

    function timeForTimeline() {
        var timeline = svg.append("line")
            .attr("stroke", "steelblue");
    
        repeat();
    
        function repeat() {
          timeline.attr({
            'x1': 0,
            'y1': 130,
            'x2': 168,
            'y2': 130
          })
          .transition()
          .duration(4000)
          .ease("linear")
          .attr({
            'x1': 0,
            'y1': 430,
            'x2': 168,
            'y2': 430   
          })
          .each("end", repeat);
        }
    }
    

    这是fiddle

    【讨论】:

    • 在第 4 版中,这已更改为 .on 而不是 .each
    • .each.on 交换在v4 或v5 中不起作用
    • 对于 d3v4,变化很大。 .each 变成了 .on(至少对于过渡事件),.ease("linear") 变成了 .ease(d3.easeLinear),并且 .attr({}) 被删除,支持多个 .attr。请参阅stackoverflow.com/a/50208860/6184972 了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2017-12-17
    相关资源
    最近更新 更多