Как сделать jquery бесконечной анимацией? - PullRequest
18 голосов
/ 17 января 2011

Я пытаюсь реализовать функцию jQuery с бесконечным циклом для анимации фона тела с 3 цветами. Я не могу придумать хорошее и чистое решение. Как то так?

$(document).ready(function(){                
     $('body').animate({backgroundColor:'#ffcc00'}, 500, function(){
        $('body').animate({backgroundColor:'#eeeeee'}, 500, function(){
           $('body').animate({backgroundColor:'#3b5998'}, 500);
       });
   });
});

Есть идеи?

Ответы [ 10 ]

21 голосов
/ 17 января 2011
$(document).ready(function(){
    function animate() {
        $('body').animate({backgroundColor:'#ffcc00'}, 500, function(){
            $('body').animate({backgroundColor:'#eeeeee'}, 500, function(){
                $('body').animate({backgroundColor:'#3b5998'}, 500, function(){
                    animate();
                });
            });
        });
    }
    animate();
});
11 голосов
/ 17 января 2011

Вы можете устранить вложенность, но решение немного толще:

var cols = "#ffcc00,#eeeeee,#3b5998".split(",")
var cPos = 0

$(document).ready(function() {
   swapC()
}    

function swapC() {
    $('body').animate({ backgroundColor:cols[cPos] }, 500)
    cPos++
    if (cPos == cols.length) {
        cPos = 0
    }
    window.setTimeout(function() { swapC() }, 500)
}
8 голосов
/ 02 июня 2012
$(document).ready(function(){
    colors = ['#FFB30C', '#58EC00', '#0087EC', '#EEEEEE', '#FF5A00' ]
    var i = 0;
    animate_loop = function() {
            $('body').animate({backgroundColor:colors[(i++)%colors.length]
            }, 500, function(){
                        animate_loop();
            });
    }
    animate_loop();
});

Демо: http://jsfiddle.net/bHEVr/

6 голосов
/ 22 июня 2011
$(".elementsToAnimate").each(function setAnim(){
    $(this).
            animate({backgroundColor:'#ffcc00'},500).
            animate({backgroundColor:'#eeeeee'},500).
            animate({backgroundColor:'#3b5998'},500,setAnim);
});
3 голосов
/ 07 мая 2015

Я бы предпочел использовать подход, основанный на событиях:

$(document).ready(function(){
  $('body').on('color1', function () {
    $(this).animate({backgroundColor:'#ffcc00'}, 500, function(){
      $(this).trigger('color2');
    });
  });

  $('body').on('color2', function () {
    $(this).animate({backgroundColor:'#eeeeee'}, 500, function(){
      $(this).trigger('color3');
    });
  });

  $('body').on('color3', function () {
    $(this).animate({backgroundColor:'#3b5998'}, 500, function(){
      $(this).trigger('color1');
    });
  });

  // Kick-off the infinite loop by firing one of the events
  $('body').trigger('color2');
});

Смотреть это решение в действии:

http://jsfiddle.net/perituswebdesign/f5qeo6db/1/

3 голосов
/ 17 января 2011

Вызовите функции animate в функции обратного вызова animate ().

См. Этот пример на форуме jQuery

jQuery.fn.fadeInOut = function() {
        var newOpacity = this.is(":visible") ?  0 : 1;
        this.animate({ opacity: newOpacity }, function() {
                $(this).fadeInOut();
        });
        return this;
};

$("#mydiv").fadeInOut();
1 голос
/ 17 января 2011
function blabla(){
 $('body').animate({backgroundColor:'#ffcc00'}, 500, function(){
        $('body').animate({backgroundColor:'#eeeeee'}, 500, function(){
           $('body').animate({backgroundColor:'#3b5998'}, 0,function (){
               setTimeout(blabla,500);
           });
       });
   });

}

UNTESTED

0 голосов
/ 01 октября 2015

Я знаю, что это годы спустя, но я думаю, что это может все еще быть проблемой для кого-то, как это было для меня с jquery v1.10.2.В любом случае, после нескольких часов попыток справиться с этим, я использовал следующий код для многослойных фонов с этим плагином :

// Self-calling functions for animation auto-repeat
var cssanimfx={
    bgb:function(o){
      o=$(o?o:this);
      o.css({backgroundPosition:'0px 0px'}).animate({backgroundPosition:"3000px -3000px"},500000,'linear',cssanimfx[o.attr('id')]);
    },
    bgm:function(o){o=$(o?o:this);o.css({backgroundPosition:'0px 0px'}).animate({backgroundPosition:"3000px -3000px"},250000,'linear',cssanimfx[o.attr('id')])},
    bgf:function(o){o=$(o?o:this);o.css({backgroundPosition:'0px 0px'}).animate({backgroundPosition:"3000px -3000px"},50000,'linear',cssanimfx[o.attr('id')])}
    // ...
}
// Initialize animation
for(id in cssanimfx)cssanimfx[id]('#'+id);

Схема именования выглядит следующим образом:Я создаю вложенные DIV s и даю им ID s в HTML.В части JS одни и те же ID используются для ввода свойств в объекте, содержащем все функции самозвонка при завершении анимации. Демо здесь.

0 голосов
/ 14 мая 2014

Попробуйте это: http://jsfiddle.net/hBBbr/

$(document).ready(function(){

animate_loop = function animate_loop(){
        $( "#animated_banner" ).animate({
            opacity: 0.1, 

          }, 1000,function(){
               $( "#animated_banner").animate({ opacity: 1},1000)
                 animate_loop();
        } );    
}

animate_loop();  

});
0 голосов
/ 16 января 2013

Я настоятельно рекомендую jQuery плагин синхронизации (2 КБ) ( GitHub & Docs ).

Предоставляет простую в использовании бесконечную анимацию и многое другое.Посмотрите:

$(document).ready(function(){    

 $('body').animate({backgroundColor:'#ffcc00'}).wait(500)
          .animate({backgroundColor:'#eeeeee'}).wait(500)
          .animate({backgroundColor:'#3b5998'}).wait(500)
});
...