2013-09-13 3 views
2

У меня есть анимированная иконка с jQuery. Первый цикл хорош, но когда он перезапускается для следующего цикла, все ускоряется. Кто-нибудь знает, почему?Анимация значка с jQuery

Я не знаю, если это лучший способ сделать это, но я не знаю другого пути.
Причина, по которой это не gif для альфа-прозрачности.

Пример: http://jsbin.com/ESuGAXe/1/edit?js,output

JQuery:

jQuery(function() { 
    var plusicon = jQuery('.icon.plus'); 
    animateIcon(plusicon, 3000); 

    function animateIcon(plusicon, duration) { 
     jQuery('.sprite1', plusicon).stop(true).animate({'opacity':0}, duration, function() { 
      jQuery('.sprite2', plusicon).stop(true).animate({'opacity':0}, duration, function() { 
       jQuery('.sprite3', plusicon).stop(true).animate({'opacity':0}, duration, function() { 
        animateIcon(); 
       }); 
       jQuery('.sprite1', plusicon).stop(true).animate({'opacity':1}, duration); 
      }); 
      jQuery('.sprite3', plusicon).stop(true).animate({'opacity':1}, duration); 
     }); 
     jQuery('.sprite2', plusicon).stop(true).animate({'opacity':1}, duration); 
    } 
}); 
+1

Почему бы вам не создать gif? Сэкономит вам массу проблем – Stefan

+0

@Stefan Мне нужна альфа-прозрачность. Gif поддерживает только прозрачность. – Patrik

+0

Я могу предложить вам использовать Spritely => http://spritely.net/ –

ответ

5

После завершения последнего шага вы вызвать функцию, чтобы заставить его повторить, но на этот раз без каких-либо аргументов (и, следовательно, не продолжительность), изменить внутреннюю один к этому:

animateIcon(plusicon, duration); 

Это рекурсия, в конечном счете приведет к ошибке, уборщик способом было бы обернуть его в себе tInterval() следующим образом:

function animateIcon(plusicon, duration) { 
    jQuery('.sprite1', plusicon).stop(true).animate({'opacity':0}, duration, function() { 
    jQuery('.sprite2', plusicon).stop(true).animate({'opacity':0}, duration, function() { 
     jQuery('.sprite3', plusicon).stop(true).animate({'opacity':0}, duration); 
     jQuery('.sprite1', plusicon).stop(true).animate({'opacity':1}, duration); 
    }); 
    jQuery('.sprite3', plusicon).stop(true).animate({'opacity':1}, duration); 
    }); 
    jQuery('.sprite2', plusicon).stop(true).animate({'opacity':1}, duration); 
} 

setInterval(function(){animateIcon(plusicon, 3000);}, 9000); /*enough time for all steps to complete*/ 
+1

Да, конечно. Как я мог этого не видеть. Благодарю. – Patrik

+1

Я отправлял тот же текст, что и Джейсон. Быстрее меня. – franchez

+0

Dangit, я знаю, как это чувствует, я постараюсь добавить больше ценности :) –

Смежные вопросы