2012-09-19 16 views
5

Come si può rilevare quale animazione CSS è appena terminata in JavaScript?Rileva quale animazione CSS è terminata in JavaScript?

L'ultima necessità è riattivare un'animazione CSS. A causa della nostra gerarchia HTML, preferiamo non controllare la classe dell'elemento, ma agire solo quando termina una particolare animazione. Se hai un metodo che consente di riattivare un'animazione senza rimuovere/aggiungere una classe, faccelo sapere.

Altrimenti ... il nostro codice:

page.find('.button.letter').on('webkitAnimationEnd', function() { 
     $(this).removeClass('tap_animation'); 

     console.log('Hi: ' + this.style.webkitAnimationName); 

     if (!write_mode()) { 
      do_write(this); 
     } 
    }); 

this.style.webkitAnimationName restituisce sempre la stringa vuota.

Stiamo facendo qualcosa di sbagliato?

Abbiamo bisogno del codice per i browser WebKit, in particolare per Mobile Safari.

Grazie!

+0

Se si desidera ciclo un'animazione, che è già supportato in CSS3. Se questo non è ciò che desideri, potresti approfondire un po 'di più? – Shmiddty

+0

Non eseguire il ciclo di un'animazione, ma riattivarla senza rimuovere/aggiungere una classe. Attiviamo un'animazione aggiungendo una classe, quindi un po 'di tempo indeterminato dopo, abbiamo bisogno di riattivarla. Se rimuovere/aggiungere una classe è l'unico metodo, allora dobbiamo risolvere la domanda elencata qui. – Crashalot

risposta

4

Da jQuery è possibile accedere all'oggetto originalEvent, e, da lì, la proprietà animationName:

$('body').on('webkitAnimationEnd', function(e){ 
    var animName = e.originalEvent.animationName; 
    console.log(animName); 
});​ 

(Webkit-only) JS Fiddle demo.

Da lì, è sufficiente utilizzare un if per verificare quale sia il nome dell'animazione/era (passato, suppongo, visto che è terminato).

È possibile che questo aggiornamento, che invia forse un'illustrazione migliore:

$('div').on('webkitAnimationEnd', function(e){ 
    var animName = e.originalEvent.animationName; 
    if (animName == 'bgAnim') { 
     alert('the ' + animName + ' animation has finished'); 
    } 
});​ 

(Webkit-only) JS Fiddle demo.

Questa demo utilizza il seguente codice HTML:

<div><span>text</span></div>​ 

e CSS:

@-webkit-keyframes bgAnim { 
    0%, 100% { 
     color: #000; 
     background-color: #f00; 
    } 
    50% { 
     color: #fff; 
     background-color: #0f0; 
    } 
} 

@-webkit-keyframes fontSize { 
    0%, 100% { 
     font-size: 100%; 
    } 
    50% { 
     font-size: 300%; 
    } 
} 

div { 
    font-weight: bold; 
    -webkit-animation: bgAnim; 
    -webkit-animation-duration: 2s; 
    -webkit-animation-iteration-count: 2; 
} 

span { 
    font-size: 100%; 
    font-weight: bold; 
    -webkit-animation: fontSize; 
    -webkit-animation-duration: 4s; 
    -webkit-animation-iteration-count: 1; 
} 
+0

Sei troppo bello, ma tu e i tuoi 51.4k punti lo sapete già. :) Non ti capita di conoscere un altro modo per ri-attivare le animazioni CSS (dopo qualche azione da parte dell'utente) senza aggiungere/rimuovere classi? – Crashalot

+0

Perché grazie! Per quanto riguarda il riavvio di un'animazione, no; Penso (anche se non ho ancora esplorato l'argomento) che l'aggiunta/rimozione/commutazione delle classi è l'unica strada da percorrere, purtroppo. –

+0

Grazie, David. Abbiamo una domanda correlata, che spero tu conosca anche la risposta: http://stackoverflow.com/questions/12499335/bind-to-custom-css-animation-end-event-with-jquery-or -javascript. Se ne hai la possibilità, ci farebbe piacere i tuoi pensieri! – Crashalot

0

Un listener di eventi per webkitAnimationEnd dovrebbe funzionare. Qualcosa sulla falsariga di:

$object.addEventListener('webkitAnimationEnd', function(){ 
     console.log('End Detected'); 
    }, false); 
+0

Grazie, ma come si rileva * quale * animazione terminata. Più animazioni vengono eseguite sullo stesso oggetto. – Crashalot