2012-08-10 160 views
3

我想在有限的时间内快速连续地向上和向下动画一个div。这工作在jquery使它发生,但它是如此凌乱:清理简单的动画jQuery代码

$('.wiggle').delay(1800).show(50).animate({ 
       top: '15' 
           }, 40, function() { 
           $('.wiggle').animate({ 
           top: '12' 
           }, 40, function() { 
            $('.wiggle').animate({ 
            top: '15' 
            }, 40, function() { 
             $('.wiggle').animate({ 
             top: '12' 
             }, 40, function() { 
              $('.wiggle').animate({ 
              top: '15' 
              }, 40, function() { 
               $('.wiggle').animate({ 
               top: '12' 
               }, 40, function() { 
                $('.wiggle').animate({ 
                top: '15' 
                }, 40, function() { 
                 $('.wiggle').animate({ 
                 top: '12' 
                 }, 40, function() { 
                  $('.wiggle').animate({ 
                  top: '15' 
                  }, 40, function() { 
                   $('.wiggle').animate({ 
                   top: '12' 
                   }, 40, function() { 
                    $('.wiggle').animate({ 
                    top: '14' 
                    }, 40, function() { 
                     $('.wiggle').hide(50) 
                    }); 
                   }); 
                  }); 
                 }); 
                }); 
               }); 
              }); 
             }); 
            }); 
           }); 
          }); //end wiggle 

我知道这是不好的。我想创建一个独特的功能来实现这一点,但是我失去了从何处开始。

+2

你可怜的栈堆... ..你在杀死它。 – gbtimmon 2012-08-10 19:12:21

+1

@ gbtimmon,这就是她问这个问题的原因。 – Brad 2012-08-10 19:13:18

+0

你可以使用jqueryUI的效果库来简化:http://jqueryui.com/demos/effect/ – asawyer 2012-08-10 19:16:33

回答

1

我建议你决定整体多久你想的效果运行,然后封装行动统一到一个单一的功能,将照顾递归的和停止:

function wiggle(selector, duration_of_wiggle) { 
    var wiggle_active = true; 
    var target = $(selector); 
    setTimeout(function() { 
     wiggle_active = false; 
     target.hide(); 
    }, duration_of_wiggle); 
    var one_wiggle_down = function() { 
     if (!wiggle_active) 
      return; 
     target.animate({ 
      top: '15' 
     }, 40, one_wiggle_up); 
    };  
    var one_wiggle_up = function() { 
     if (!wiggle_active) 
      return; 
     target.animate({ 
      top: '12' 
     }, 40, one_wiggle_down); 
    }; 
    one_wiggle_down(); 
}; 

wiggle('.wiggle', 1000); 

这里试试:http://jsfiddle.net/P4H9c/1/

+0

噢,这样好多了。完善 – 2012-08-10 19:32:48

0

开始通过保存到一个变种选择该给予的更好的性能

var $wiggle = $('.wiggle'); 

$wiggle.delay(1800).show(50).animate({ 
      top: '15' 
          }, 40, function() { 
          $wiggle.animate({ //and so on.. 

二提高选择的对象。如果与它的送花儿给人的元素相关的HTML是一样的,让我们一div你能做到这一点

var $wiggle = $('div.wiggle') 

第三,我在你的代码中看到你要完成一个反弹效应或将向下和向上裹在方法的功能和类似

function bounce(wiggle) { 
    for (i = 1; i < 5; i++) { 
     if (i % 2 == 0) { 
     wiggle.animate({ 
      top: '12px' 
     }, 75); 
    } 
    else if (i % 3 == 0) { 
     paquete.animate({ 
      top: '15px' 
     }, 75); 
    } 
    } 
    wiggle.hide(); 
} 

然后你只需调用的函数

var $wiggle = $('.wiggle'); 

bounce($wiggle); 
+3

这并没有清理那个烂摊子。 – PeeHaa 2012-08-10 19:14:51

+0

我可以通过从div中获取css并将其更改为“top:+1”或“-1”来创建一个可以处理它的.fn。 – 2012-08-10 19:18:10

+0

我明白了:使用模块 - 谢谢! – 2012-08-10 19:33:25

1

未经检验的做了,但我认为你必须设置一个福nction类似于下面的东西(不知道这不正是你想要什么,因为它是相当难以启齿的“烂摊子”,但它应该给你一个想法):

function doWiggle($elem, numberOfTimesToWiggle) 
{ 
    $elem.animate({ 
     top: '15' 
    }, 40, function() { 
     top: '12' 
    }, 40, function() { 
     doWiggle($elem, (numberOfTimesToWiggle-1)); 
    }); 

} 

setTimeout(function() { 
    show(5); 
    doWiggle($('.wiggle'), 20); 
},1000); 
+0

酷 - 我现在看到 – 2012-08-10 19:34:16

4
$('.wiggle').delay(1800).show(50).wiggle(12); 

$.fn.wiggle = function(i) { 

    var $elem = $(this); 

    if (i > 0) { 

     $elem.animate({ 
      top: i % 2 == 0 ? 15 : 12 
     }, 40, function() { 

      $elem.wiggle(i--); 
     }); 
    } 
} 
+0

这个答案没有错。 +1给你先生:-) – PeeHaa 2012-08-10 19:24:55

+0

适合我!谢谢 – 2012-08-10 21:39:39