D3中的循环过渡

And*_*ise 8 javascript svg d3.js

基本论述:我有点像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);
            });
    })();
};
Run Code Online (Sandbox Code Playgroud)

结果是一个很好的起始转换,然后在A点和B点之间快速跳转,而不会使该duration(4000)位生效.我也尝试删除底部的行(d3.select(this).remove())然后在每次调用的顶部追加一个新的重复().我也尝试过重置x1,x2,y1和y2并完全跳过转换.我并不是说我正确地尝试了这些,但我的结果要么根本没有线,无限的线,要么是到达B点的一条线并且停留在那里.

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

jsh*_*ley 14

在我看来,你不需要两次指定起始坐标.你可以在repeat函数中分配初始坐标并立即调用它:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴

  • 在版本4中,这改为.on而不是.each (8认同)