【问题标题】:Animating a series of lines in order with JQuery使用 JQuery 按顺序对一系列线条进行动画处理
【发布时间】:2011-06-19 01:09:50
【问题描述】:

我无法找出将一系列动画添加到链的正确 JQuery 方法。我知道,如果您提前知道您的序列,您可以只使用 .animate().animate(),但在我的情况下,每个动画步骤都是动态的。我认为我需要将传统的 forloop 更改为某种类型的 Jquery .each() 循环,以便将所有内容链接起来,以便按顺序运行。

我正在使用 Jquery.svg.anim.js(jquery svg 动画)。

我有一个与下一步相关的绘制时间的点数组。 “G”是一个网格,我的坐标是 G[x][y].x => P.x 和 G[x][y].y => P.x

step[0] = {P:G[0][0], T:500};
step[1] = {P:G[0][1], T:2000};
step[2] = {P:G[3][1], T:100};

然后我通过这个循环运行上面的代码:

for(s=0;s<(step.length-1);s++){
    var line1 = svg.line(step[s].P.x, step[s].P.y, step[s].P.x, step[s].P.y, {stroke: 'blue', strokeWidth: 10});
    $(line1).animate({svgX2: step[s+1].P.x, svgY2: step[s+1].P.y}, step[s].T);
}

这可以在正确的时间长度内将所有线条绘制到适当的位置,但当然因为它没有正确链接,它会一次完成所有动画。 step[] 数组将具有任意长度。如果我需要改变数据结构,我可以在这一点上做到这一点。

如何以 JQuery 方式正确编写此代码,在其中我可以获取一个数组或一些步骤集合并连续遍历每个动画?我最终想在 SVG 网格上按顺序绘制任意序列的线,并在一些延迟后淡出每条线。这最终将适用于类似“西蒙”节拍/定时的游戏,其中序列越来越大,您必须将序列正确地回溯到节拍。


编辑:以下正在按顺序加载它,但由于两个循环,它看起来很丑:

var line = new Array();     
for(s=0;s<(step.length-1);s++){ 
    line[s] = svg.line(step[s].P.x, step[s].P.y, step[s].P.x, step[s].P.y, {stroke: 'blue', strokeWidth: 10});      
}

$.each(line, function(s, thisLine) { 
  $('#myQueue').queue('myQueue',function(next){
           $(thisLine).animate(
            {svgX2: step[s+1].P.x, svgY2: step[s+1].P.y}, //step[s].T
            {duration: step[s].T, queue: false, complete: next} 
        )
       }) 
});
$('#myQueue').dequeue('myQueue');

但是,如果我这样做:

for(s=0;s<(step.length-1);s++){ 
    line = svg.line(step[s].P.x, step[s].P.y, step[s].P.x, step[s].P.y, {stroke: 'blue', strokeWidth: 10});     
    n=s+1;
    $('#myQueue').queue('myQueue',function(next){
           $(line).animate(
            {svgX2: step[n].P.x, svgY2: step[n].P.y},
            {duration: step[s].T, queue: false, complete: next}
           )
    })      
}
$('#myQueue').dequeue('myQueue');

它只会绘制最后一个;这是价值与参考吗?我尝试将新行包装在一个对象中,但这似乎没有帮助。 更新:通过进行一些测试,上述操作不起作用,因为队列内部的操作在添加之后才会运行,“s”值已经一直递增。这意味着具有两个循环的循环正在工作,因为迭代器已重新启动。我想知道如何解决这个问题,希望没有评估。


最终版本:Javascript 和 Jquery 中范围的奥秘似乎开始发挥作用。我现在已经让它工作并构建了我的应用程序的第一次迭代的其余部分。我仍然不确定为什么某些展示位置和流程有效而其他展示位置和流程无效,但供阅读本文的其他人参考:

$.each(step, function(s, thisStep) { 
    $('#myQueue').queue('myQueue',function(next){
        var thisLine = svg.line(step[s].P.x, step[s].P.y, step[s].P.x, step[s].P.y, {stroke: lineColor()/*colours[random(9)]*/, strokeWidth: 10, id: 'line'+(s+1)});
        $(thisLine).animate(
            {svgX2: step[s+1].P.x, svgY2: step[s+1].P.y}, //step[s].T
            {duration: step[s].T, queue: true, complete: next}  
        );          
    }); 
});
$('#myQueue').dequeue('myQueue');

由于我自己对此感到困惑,所以让我尝试为其他浮动的人解释一下:$.each 允许您对数组进行迭代循环。没有计数器,因此如果您不想遍历所有内容,则需要在嵌套顶部添加哨兵检查或执行其他逻辑(我只想根据特定限制进行迭代,所以我使用了遵循“if(!(s

我希望解释对某人有所帮助,或者更熟练 JFoo 的人将在下面添加一些 cmets。

【问题讨论】:

    标签: jquery svg jquery-animate


    【解决方案1】:

    你可以只使用延迟:

    var totalDelay=0;
    
    for(s=0;s<(step.length-1);s++){
        var line1 = svg.line(step[s].P.x, step[s].P.y, step[s].P.x, step[s].P.y, {stroke: 'blue', strokeWidth: 10});
        $(line1).delay(totalDelay).animate({svgX2: step[s+1].P.x, svgY2: step[s+1].P.y}, step[s].T);
        totalDelay+=step[s].T;
    }
    

    您也可以考虑使用自己的 jquery 队列。类似的东西:Single queue for jQuery animate() elements

    【讨论】:

    • 这似乎暂时有效。我认为队列可能会更好,因为您可以将内容拉出或注入(对吗?)。我在加载队列时遇到了一些麻烦,但我也会尝试一下。
    • 我在建立队列时遇到了一点问题。在我的 for- 循环内部,我将每一行设置为一个数组(即,我在循环外声明了“var line = new Array()”,而不是“var line1”)。所以现在我有 "line[s] = svg.line ..." 但是,我想弄清楚如何从 JQuery 引用它,因为我不能做 "$(line[s]).animate ... ”。我应该如何格式化“$()”内部的内容,以便它可以访问数组中的元素?
    • 您不需要将其放入数组中,您可以简单地在每次迭代中排队一个新项目,然后在循环后调用dequeue
    • 我将不得不解决这个问题,我现在通过创建一个行数组,然后使用 Jquery 的每个迭代器来让它工作;当我在没有数组的情况下执行此操作时,它只会为最后一步设置动画,我将继续使用它,并在我遇到困难时在我的原件中发布编辑。到目前为止,谢谢。
    【解决方案2】:

    刚刚问了一个类似的问题,你可以在那里找到答案:

    Animate elements sequentially using CSS3 and jQuery

    我也只是为了自己的好奇心而弄乱了小提琴,但上面的问题可能比我的小提琴有更好的解决方案:

    http://jsfiddle.net/jensbits/XjEjx/

    【讨论】:

    • +1,也打算将其作为一个选项,但既然你已经这样做了,我就把它省略了。
    • 这是一种递归类型的操作,对吧?如何从我的数组中为任意数量的 .queue 加载值?或者我可以在循环中加载它们每个都附加到一些随机选择器 (for(){ $(something).queue() } 然后在循环添加所有内容之后执行 $(something).dequeue() 来运行它?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2015-12-24
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多