2012-04-26 26 views
0

我有一系列raphael动画,我想按特定顺序触发。为什么我的setTimeouts函数不工作?

  1. 淡入曲线。
  2. 淡入球。
  3. 沿曲线动画化球。

我在每个函数之间都有一个setTimeout,但动画只是同时触发。

View it on JSFiddle或在这里:

Raphael("bounce", 640, 480, function() { 
     var r = this, 
      p =     r.path("M0,77.255c0,0,269.393,37.431,412.96,247.653 c0,0,95.883-149.719,226.632-153.309").attr({stroke: "#666", opacity: .0, "stroke-width": 1}), 
      len = p.getTotalLength(), 
     e = r.circle(0, 0, 7).attr({stroke: "none", fill: "#000", opacity:0}).onAnimation(function() { 
       var t = this.attr("transform"); 
      }); 
     r.customAttributes.along = function (v) { 
      var point = p.getPointAtLength(v * len); 
      return { 
       transform: "t" + [point.x, point.y] + "r" + point.alpha 
      }; 
     }; 
     e.attr({along: 0}); 

     var rotateAlongThePath = true; 
     function fadecurve(ca,ba,aa,ab){ 
      ca.animate({opacity:1},2000); 
      setTimeout(fadeball(ba,aa,ab),6000); 
     } 
     function fadeball(ba,aa,ab) { 
       ba.animate({opacity:1},400); 
       setTimeout(run(ba, aa,ab),5000); 
     } 
     function run(ba,aa,ab) { 
       ba.animate({opacity:1},400); 
       ba.animate({along: aa}, ab, ">", function() { 
       ba.attr({along: aa}); 
      }); 
     } 
     fadecurve(p,e,.9,500); 
}); 

回答

2

使用匿名功能,如:

setTimeout(function(){ 
    fadeball(ba,aa,ab); 
},6000); 

随着setTimeout(fadeball(ba,aa,ab),6000);功能fadeball被调用的立即使用,因为()这是什么问题。

请确保调用run函数的方式也:)

+0

谢谢!就是我想要的! – 2012-04-26 16:55:02

+0

@andrewnguyen:欢迎您:) – Sarfraz 2012-04-26 16:56:20

1

您立即调用你的函数,然后该函数的结果传递给setTimeout。你需要,而不是通过一个函数来setTimeout

setTimeout(function(){ 
    fadeball(ba,aa,ab); 
},6000); 
2

问题在于你的函数你的setTimeout内引用

setTimeout(fadeball(ba,aa,ab),6000); 

什么,你在这里做的是执行函数,然后分配结果作为你的setTimeout的第一个参数,如果你使用匿名函数,它会很好。

setTimeout(function(){ 
    fadeball(ba,aa,ab); 
},6000); 
0

JQuery的动画功能有动画完成回调,所以你可以连续射击的动画:

function SecondAnimation() { $('element').animate(....., ThirdAnimation); } 
function ThirdAnimation() { $('element').animate(....., FourthAnimation); } 
function FourthAnimation() { $('element').animate(.....); } 


$('element').animate(....., SecondAnimation); 
+0

'延迟'将需要以及动画不立即连续运行,但这是一个有效的选择。 – 2012-04-26 16:59:05

1

我很抱歉,如果这是题外话,但你这样做的方式是不可扩展。虽然像这样设置重复超时可用于少数功能,但随着步数的增加,多步动画变得越来越麻烦。 jQuery可以对动画进行排序,但通常jQuery的内置动画队列不提供所需的功能(如瀑布属性)。下面是一个更简洁,功能强大且可扩展的替代方案:Frame.js

var ca = p, ba = e, aa = .9, ab = 500; 
    Frame(500, function(next){ 
     ca.animate({opacity:1}, 2000, next); 
    }); 
    Frame(4000, function(next){ 
     ba.animate({opacity:1}, 400, next); 
    }); 
    Frame(5000, function(next){ 
     ba.animate({opacity:1}, 400); 
     ba.animate({along: aa}, ab, ">", next); 
    }); 
    Frame(function(next){ 
     ba.attr({ along: aa }); 
     next(); 
    }); 
    Frame.init(); 
相关问题