2012-05-13 21 views
5

Farzedeyim ve çocukları için .animate({opacity:0},400, function(){}); kullanıyorum. Bir animasyonun tamamlanması için kalan süreyi elde etmek mümkün mü? ör. 200 ms geri kaldı ya da animasyon yoksa 0 mı? Teşekkürler.Kalan animasyon süresini elde etmenin bir yolu var mı?

+1

... neden bu değeri gerek? –

+1

@ RokoC.Buljan. Sanırım bir hobi. O koleksiyon animasyonları kez. – gdoron

+0

Çocuklara bazı geri aranmaların sıraya konmasıyla ilgili bir sorunum var - her zaman tetiklenmiyor ve hangi çocuğun sıraya koyulduğunu belirlemek kolay değil, bu yüzden daha güvenilir hale getirmek için setTimeout ile denemek istedim. – Anonymous

cevap

6

ben kalan süreyi almak için adım işlevini kullanarak bir örnek oluşturdu
[gdoron tarafından gönderildi olarak] step fonksiyonunu nasıl kullanabileceğinizi daha iyi anlamanıza yardımcı olmak için:

(animasyonu durdurmak ve kalan süreyi geri almak için get state! düğmesini tıklatın!)

demo with opacity

Mesafe örneği jQuery

demo with distance :

var time = 4000; 
var distance = 300; 
var currentTime = 0; 

$('#ball').animate({ 
    left: distance 
}, { 
    duration: time, 
    step: function (now, fx) { 

     currentTime = Math.round((now * time)/distance); 
     var data = fx.prop + ' ' + Math.round(now) + '; <b>' + currentTime + 'ms</b> '; 

     $('body').append('<p>' + data + '</p>'); 
    }, 
    easing: 'linear' 
}); 

$('#getTime').click(function() { 
    $('#ball').stop(); 
    $('body').prepend('<p>currentTime is:' + currentTime + ' ms; REMAINING: ' + (time - currentTime) + 'ms</p>'); 
}); 
  • Sen Şu anda animasyonlu (left) özelliği alma animation step içeride fx.prop kullandığını görebilirsiniz. kolayca alabilirsiniz (ne olursa olsun ... opaklığı) animasyon zaman ve mesafe bilerek döndü now değere bazı basit matematik ((now*time)/distance) ve sayesinde devleti 'durdurulmuş/durdurulmuş':
  • Sen nasıl görebilirsiniz .
+0

Teşekkürler bu çok yararlı! Ve adım fonksiyonunu sadece değişken yazımla sınırlandırırsak performansa fazla vurmayacak gibi görünüyor. Her neyse, her 1 ms veya bir şey çağrılmayacak. – Anonymous

+0

@ user1125062 Yapmamalıyız, çünkü sadece animasyonumuzu yürütmekte olan bir şeye erişiyoruz. –

3

İhtiyacın neden hiçbir fikrim yok, ama step Bu değeri ayıklamak yardımcı olabilir:

Adım İşlevini

.animate ikinci versiyonu() Bir adım seçeneği sağlar - Animasyonun her adımında tetiklenen bir geri çağırma işlevi. Bu işlev, özel animasyon türlerini etkinleştirmek veya animasyonu meydana geldiğinde değiştirmek için kullanışlıdır. İki argümanı (şimdi ve fx) kabul eder ve bu, animasyonlu DOM öğesine ayarlanır. Şimdi

: özelliğinin sayısal değer her aşamada hareketli olan
FX: örneğin hareketli eleman, bir başlangıç ​​elem gibi özelliklerin bir dizi içerir jQuery.fx prototip nesnesine başvuru, ve sırasıyla animasyonlu özelliğin ilk ve son değeri için sonlandırın ve animasyonlu mülk için teklif verin.

docs

+0

hmmm, ama bununla ne yapmam gerekiyor? :) – Anonymous

+0

@ user1125062. Mevcut değeri, ilk değeri, son değeri vb. Alabilirsin, sadece onunla oyna. Her neyse, yapmaya çalıştığınız şeyi yapmanın başka yolları olduğundan eminim ... – gdoron

+0

SetInterval veya bu yöntem olmadan, hayır, AFAIK. Bunu elde etmenin tek yolu bunlar. – inhan

3

Dinleyin, herkesin hakkında konuşmaya devam ettiği step işlevini boş verin. Bir keresinde ne yaptığınıza ve kendi yazmamın tam tersini koydu. Bu, toplam animasyon zamanına (bu sayıyı jQuery'ye verdiğinizden beri zaten bilinmelidir) ve katsayısının mevcut ve hedef opaklık. Daha sonra, bu bölümü toplam animasyon süresiyle çarpın, toplamın toplam süreden çıkarılmasını sağlayın. Bu kadar basit.

Sözde kod: Sadece meraktan

func calculate-time-left-in-a-running-fade-in-animation: 
{ 
    var current_opacity = $elem.css('opacity'); 
    var target_opacity = this.getTargetOpacity(); 

    var total = this.getTotalAnimationTime(); 

    var quotient = current_opacity/target_opacity; 
    return total - quotient * total; 
} 
+0

İlginç bir yaklaşım, bununla ilgili değil! Hassasiyet önemliyse de, adım tek yoldur. – Anonymous

+0

Öznitelik değerinin kendiliğinden geri alınması veya şimdi değişkenin kullanılması, animasyon duraklatıldığı sürece aynı şeydir. JQuery adımında @roXon, canlandırmanın her adımında çok fazla yükün olacağını gösterdi. Hatta aslında yaptığı gibi küresel değişkenleri tanıtabilir. Animasyonu hesaplamadan önce duraklatmayı (örneğin, örnekte olduğu gibi) durdurmayı ve sonradan animasyonu programa göre sürdürmeyi düşünüyorsanız, o zaman kesinlikle hiçbir fark yoktur. Bu hesaplanan değeri çalışan bir animasyon altında almanın aynı sonuçları üreteceğini bile söyleyebilirim. –

+0

Adım mantığının depolanan ürünü, kalan sürenin hesaplanan değeri, canlı bir liste gibi değildir, değer kendisini en üst düzeyde doğru değere güncellemez. Ve her nerede kullanırsanız kullanın, her zaman kullandığınız "eski" bir hesaplama olmayacaktır. Hatta teoride, hassasiyeti engelleyen, bu bilgi boşluğunu, adım fonksiyonunu birleştirmekten sorumlu bir orta erkeğe sahip olacaksınız. Fakat bunun yerine, aynı zamanda, aynı zamanda, hesaplamak için ihtiyacınız olan zamana, aynı zamanda, daha doğru bir sonuç vermez miydiniz? Hem kodun okunabilirliği hem de iş yükünün işlenmesinde daha ucuz. –

İlgili konular