2012-05-13 11 views
5

Supponiamo di avere qualche div, e io uso .animate({opacity:0},400, function(){}); per i suoi figli. È mai possibile quindi ottenere il tempo rimanente per completare un'animazione? ad es. 200 ms rimanenti o 0 se non ci sono animazioni? Grazie.C'è un modo per ottenere il tempo di animazione rimanente?

+1

Solo per curiosità ... perché è necessario che il valore? –

+1

@ RokoC.Buljan. È un hobby, immagino. È il momento delle animazioni della collezione. – gdoron

+0

Ho problemi con l'accodamento di alcuni callback ai bambini - non sempre si attiva e non è facile determinare a quale coda accodare, quindi ho voluto provare con setTimeout per renderlo più affidabile. – Anonymous

risposta

6

Per aiutarvi a capire meglio come è possibile utilizzare la funzione step [come inserito da gdoron]
ho creato un esempio utilizzando l'istruzione di funzione per ottenere il tempo rimanente:

(fare clic sul pulsante get state! per interrompere l'animazione e recuperare il tempo rimanente!)

demo with distance
demo with opacity

Distanza esempio jQuery:

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>'); 
}); 
  • Si può vedere come ho usato il fx.prop all'interno del animation step per ottenere la (left) proprietà che è attualmente animato.
  • si può vedere come: conoscere il tempo di animazione e la distanza (opacità, qualunque cosa ...) si può facilmente recuperare il 'fermato/pausa' stato da qualche semplice matematica ((now*time)/distance) e grazie alla now valore restituito .
+0

Grazie questo è molto utile! E sembra che non colpisca molto le prestazioni se limitiamo la funzione di passo alla sola scrittura variabile. Ad ogni modo non verrà chiamato ogni 1 ms o qualcosa del genere. – Anonymous

+0

@ user1125062 Non dovrebbe, perché stiamo solo accedendo a qualcosa che sta già facendo girare la nostra animazione. –

3

Non ho idea del motivo per cui avete bisogno, ma il step posso aiutare a estrarre questo valore:

Fase Funzione

La seconda versione di .animate() fornisce un'opzione di passaggio - una funzione di callback che viene attivata in ogni fase dell'animazione. Questa funzione è utile per abilitare i tipi di animazione personalizzati o per modificare l'animazione mentre si sta verificando. Accetta due argomenti (now e fx) e questo è impostato sull'elemento DOM che viene animato.

ora: il valore numerico della proprietà di essere animato ad ogni passo
fx: un riferimento al prototipo oggetto jQuery.fx, che contiene una serie di proprietà quali elem per l'elemento animata, inizio e terminano rispettivamente per il primo e l'ultimo valore della proprietà animata e prop per la proprietà da animare.

docs

+0

hmmm, ma cosa dovrei fare con quello? :) – Anonymous

+0

@ user1125062. È possibile ottenere il valore corrente, il primo valore, l'ultimo valore, ecc ', basta giocare con esso. Ad ogni modo sono sicuro che ci sono altri modi per fare ciò che stai cercando di fare ... – gdoron

+0

Senza un setInterval o questo metodo, no, AFAIK. Questi sono gli unici modi per ottenerlo. – inhan

3

Ascolta, non importa la funzione step di cui tutti continuano a parlare. Una volta avevo bisogno di quello che hai fatto e ho scritto il mio che semplicemente ha invertito il tempo lasciato a dare un'occhiata al tempo di animazione totale (dovrebbe già essere noto a te dato che una volta hai dato questo numero a jQuery) e al del opacità corrente e di destinazione. Quindi basta moltiplicare quel quoziente con il tempo di animazione totale, avere la somma sottratta dal tempo totale. Semplice come quella.

pseudo-codice:

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

Approccio interessante, non pensarci! Sebbene se la precisione fosse importante, il passo è l'unica strada da percorrere. – Anonymous

+0

Recuperare il valore dell'attributo o utilizzare la variabile now è la stessa cosa, purché l'animazione sia in pausa. Nell'esempio del passaggio di jQuery @roXon ha dato che ci sarà un sacco di spese generali in corso, ad ogni passo dell'animazione. Potrebbe persino introdurre variabili globali come in effetti l'esempio. Se si intende sospendere l'animazione prima del calcolo (sempre come nell'esempio) e riprendere l'animazione in seguito, non c'è assolutamente alcuna differenza. Direi anche che ottenere questo valore calcolato sotto un'animazione in esecuzione produce gli stessi risultati. –

+0

Il prodotto memorizzato della logica di passo, il valore calcolato del tempo rimanente, non è come una lista dal vivo, il valore non si aggiorna al valore più accurato. E non sarà nient'altro che un "vecchio" calcolo che usi ogni volta che lo usi. Avrai anche un intermediario responsabile di colmare questa lacuna informativa, la funzione di passo, che in teoria dovrebbe ostacolare la precisione. Ma se invece fai lo stesso calcolo esattamente quando hai bisogno di sapere il tempo rimanente, non sarebbe nemmeno più preciso? E anche più economico, sia per la leggibilità del codice che per l'elaborazione dei costi generali. –

Problemi correlati