102 votes

Rappel sur la transition CSS

Est-il possible de recevoir une notification (comme un rappel) lorsque une transition CSS a été complétée?

0 votes

105voto

Mark Rhodes Points 3114

Oui, si de telles choses sont prises en charge par le navigateur, alors un événement est déclenché lorsque la transition est terminée. Cependant, l'événement réel diffère entre les navigateurs :

  • Les navigateurs Webkit (Chrome, Safari) utilisent webkitTransitionEnd
  • Firefox utilise transitionend
  • IE9+ utilise msTransitionEnd
  • Opera utilise oTransitionEnd

Cependant, vous devez savoir que webkitTransitionEnd ne se déclenche pas toujours ! Cela m'a pris au piège plusieurs fois, et semble se produire si l'animation n'aurait aucun effet sur l'élément. Pour contourner cela, il est logique d'utiliser une temporisation pour déclencher le gestionnaire d'événements dans le cas où il ne se déclenche pas comme prévu. Un article de blog sur ce problème est disponible ici : http://www.cuppadev.co.uk/the-trouble-with-css-transitions/ <-- Erreur interne du serveur 500

Avec ceci à l'esprit, j'ai tendance à utiliser cet événement dans un bloc de code qui ressemble un peu à ceci :

var transitionEndEventName = "XXX"; //déterminez, par exemple, "webkitTransitionEnd"..
var elemToAnimate = ... //la chose que vous voulez animer..
var done = false;
var transitionEnded = function(){
     done = true;
     //faire vos trucs de fin de transition..
     elemToAnimate.removeEventListener(transitionEndEventName,
                                        transitionEnded, false);
};
elemToAnimate.addEventListener(transitionEndEventName,
                                transitionEnded, false);

//code de déclenchement de l'animation ici..

//assurez-vous de nettoyer si l'événement ne se déclenche pas..
setTimeout(function(){
    if(!done){
        console.log("une temporisation est nécessaire pour appeler la fin de la transition..");
        transitionEnded();
    }
}, XXX); //note : XXX devrait être le temps requis pour que l'animation se termine plus une période de grâce (par exemple, 10ms) 

Remarque : pour obtenir le nom de fin d'événement de transition, vous pouvez utiliser la méthode postée comme réponse dans : Comment normaliser les fonctions de transition CSS3 entre les navigateurs ?.

Remarque : cette question est également liée à : - Événements de transition CSS3

2 votes

Voici une réponse beaucoup plus complète que celle acceptée. Pourquoi n'a-t-elle pas plus de votes positifs ?

0 votes

N'oubliez pas d'appeler transitionEndedHandler dans transitionEnded (ou de changer transitionEnded par transitionEndedHandler dans addEventListener et removeEventListener et d'appeler transitionEnded dans transitionEndedHandler)

0 votes

Merci @Miquel; je pense que j'avais simplement utilisé transitionEnded quand je voulais dire transitionEndedHandler .

82voto

Doug Neiner Points 34940

Je sais que Safari implémente un callback webkitTransitionEnd que vous pouvez attacher directement à l'élément avec la transition.

Leur exemple (reformaté sur plusieurs lignes):

box.addEventListener( 
     'webkitTransitionEnd', 
     function( event ) { 
         alert( "Transition terminée!" ); 
     }, false );

0 votes

Y a-t-il la même chose pour d'autres navigateurs que WebKit?

7 votes

Oui, 'transitionend' pour Mozilla & 'oTransitionEnd' dans Opera.

2 votes

Que fait le false à la fin?

43voto

Tom Points 3867

Je suis en train d'utiliser le code suivant, c'est beaucoup plus simple que d'essayer de détecter quel événement de fin spécifique un navigateur utilise.

$(".myClass").one('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', 
function() {
 //faire quelque chose
});

Alternativement, si vous utilisez bootstrap alors vous pouvez simplement faire

$(".myClass").one($.support.transition.end,
function() {
 //faire quelque chose
});

Cela est parce qu'ils incluent le code suivant dans bootstrap.js

+function ($) {
  'use strict';

  // SUPPORT DES TRANSITIONS CSS (Rappel : http://www.modernizr.com/)
  // ============================================================

  function transitionEnd() {
    var el = document.createElement('bootstrap')

    var transEndEventNames = {
      'WebkitTransition' : 'webkitTransitionEnd',
      'MozTransition'    : 'transitionend',
      'OTransition'      : 'oTransitionEnd otransitionend',
      'transition'       : 'transitionend'
    }

    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }

    return false // explicite pour ie8 (  ._.)
  }

  // http://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
    var called = false, $el = this
    $(this).one($.support.transition.end, function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
    setTimeout(callback, duration)
    return this
  }

  $(function () {
    $.support.transition = transitionEnd()
  })

}(jQuery);

2 votes

Ceci est plus lent car il doit parcourir toute la liste à chaque fois que l'événement se produit pour voir s'il s'agit du bon.

3 votes

@phreakhead Les performances de l'une ou l'autre de ces approches seront très similaires

12voto

Yehuda Schwartz Points 1211

Ceci peut être facilement réalisé avec l'événement transitionend. Voir la documentation ici.

Un exemple simple:

document.getElementById("button").addEventListener("transitionend", myEndFunction);

function myEndFunction() {
    this.innerHTML = "L'événement de transition est terminé";
}

#button {transition: top 2s; position: relative; top: 0;}

Cliquez pour démarrer l'animation

6voto

Brian Points 1396

Le plugin jQuery.transit, un plugin pour les transformations et les transitions CSS3, peut appeler vos animations CSS depuis un script et vous donner un rappel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X