Je dois détecter si une transition CSS est terminée avant de permettre à une fonction de se répéter, pour éviter de gâcher les marges.
Alors, comment j’ai quelque chose comme
if (transitionend == true) { // do stuff } else { // do nothing }
Le code ci-dessous déclenchera l’événement transitionend pour le ou les éléments que vous avez dans la variable $ element. Il existe quatre noms d’événements différents, car ils couvrent toutes les incohérences entre les navigateurs. Remplacez le commentaire ‘// votre gestionnaire d’événements’ par le code que vous souhaitez exécuter lorsque l’événement est déclenché.
$element.on('transitionend webkitTransitionEnd oTransitionEnd', function () { // your event handler });
Je pense que ce lien pourrait vous être utile.
Un seul événement est déclenché à la fin des transitions. Dans Firefox, l’événement est transitionend, dans Opera, OTransitionEnd et dans WebKit, il s’agit de webkitTransitionEnd.
el.addEventListener("transitionend", updateTransition, true);
Utilisez les données jQuery pour attacher des données avec état à l’élément. Utilisez une valeur booléenne pour “bloquer” les événements et inverser la variable booléenne une fois la transition terminée. Utilisez le code de xram pour connecter simultanément tous les événements de transition entre navigateurs.
Donc pour votre exemple …
Vous pouvez créer une méthode qui gardera à l’esprit lorsque la fin de la transition a été appelée la dernière fois et ne déclenche donc le rappel qu’une seule fois.
function transitionEndsOnce($dom, callback) { var tick = Date.now(); $dom.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function(e) { var diff = Date.now() - tick; tick = Date.now(); if (diff > 20) { // this number can be changed, but normally all the event sortinggger are done in the same time return callback && callback(e); } }); }
puis utilisez-le simplement de cette façon
transitionEndsOnce($('...'), function(e){ console.log('transition ends once'); });