Eventos de transición CSS3


¿Hay algún evento disparado por un elemento para comprobar si una transición de css3 ha comenzado o finalizado?

Author: Andreas Köberle, 2010-05-08

6 answers

W3C CSS Transitions Draft

La finalización de una transición CSS genera un evento DOM correspondiente. Se activa un evento por cada propiedad que se somete a una transición. Esto permite a un desarrollador de contenido realizar acciones que se sincronizan con la finalización de una transición.


Webkit

Puede establecer un controlador para un evento DOM que se envía al final de un transición. El evento es una instancia de WebKitTransitionEvent y su tipo es webKitTransitionEnd en JavaScript.

box.addEventListener( 'webkitTransitionEnd', 
    function( event ) { alert( "Finished transition!" ); }, false );

Mozilla

Hay un solo evento que se dispara cuando se completan las transiciones. En Firefox, el evento es transitionend, en Opera, oTransitionEnd, y en WebKit es webkitTransitionEnd.

Opera

Hay un tipo de evento de transición disponible. El evento oTransitionEnd se produce en la finalización de la transición.

Internet Explorer

El evento transitionend ocurre al finalizar la transición. Si la transición se elimina antes de completarse, el evento no se activará.


ENTONCES: ¿Cómo normalizo las funciones de transición de CSS3 entre navegadores?

 209
Author: Davor Lucic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:42

Estaba usando el enfoque dado por Pete, sin embargo, ahora he comenzado a usar lo siguiente

$(".myClass").one('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', 
function() {
 //do something
});

Alternativamente, si usa bootstrap, simplemente puede hacer

$(".myClass").one($.support.transition.end,
function() {
 //do something
});

Esto es porque incluyen lo siguiente en bootstrap.js

+function ($) {
  'use strict';

  // CSS TRANSITION SUPPORT (Shoutout: 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 // explicit for ie8 (  ._.)
  }


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

}(jQuery);

Tenga en cuenta que también incluyen una función emulateTransitionEnd que puede ser necesaria para garantizar que siempre se produzca una devolución de llamada.

  // 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
  }

Tenga en cuenta que a veces este evento no se dispara, generalmente en el caso cuando las propiedades no cambian o una pintura no se activa. Para asegurar que siempre recibe una devolución de llamada, vamos a establecer un tiempo de espera que activará el evento manualmente.

Http://blog.alexmaccaw.com/css-transitions

 70
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-09 17:02:17

Todos los navegadores modernos ahora soportan el evento no arreglado:

element.addEventListener('transitionend', callback, false);

Funciona en las últimas versiones de Chrome, Firefox y Safari. Incluso IE10+.

 53
Author: neave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-14 12:29:04

En Opera 12 cuando se enlaza usando el JavaScript simple,' oTransitionEnd ' funcionará:

document.addEventListener("oTransitionEnd", function(){
    alert("Transition Ended");
});

Sin embargo, si se enlaza a través de jQuery, debe usar 'otransitionend'

$(document).bind("otransitionend", function(){
    alert("Transition Ended");
});

En caso de que esté utilizando Modernizr o bootstrap-transition.js simplemente puedes hacer un cambio:

var transEndEventNames = {
    'WebkitTransition' : 'webkitTransitionEnd',
    'MozTransition'    : 'transitionend',
    'OTransition'      : 'oTransitionEnd otransitionend',
    'msTransition'     : 'MSTransitionEnd',
    'transition'       : 'transitionend'
},
transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];

También puedes encontrar información aquí http://www.ianlunn.co.uk/blog/articles/opera-12-otransitionend-bugs-and-workarounds /

 16
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-29 09:20:27

Solo por diversión, ¡no hagas esto!

$.fn.transitiondone = function () {
  return this.each(function () {
    var $this = $(this);
    setTimeout(function () {
      $this.trigger('transitiondone');
    }, (parseFloat($this.css('transitionDelay')) + parseFloat($this.css('transitionDuration'))) * 1000);
  });
};


$('div').on('mousedown', function (e) {
  $(this).addClass('bounce').transitiondone();
});

$('div').on('transitiondone', function () {
  $(this).removeClass('bounce');
});
 6
Author: yckart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-30 15:15:33

Si simplemente desea detectar un solo extremo de transición, sin usar ningún marco de JS, aquí hay una pequeña función de utilidad conveniente:

function once = function(object,event,callback){
    var handle={};

    var eventNames=event.split(" ");

    var cbWrapper=function(){
        eventNames.forEach(function(e){
            object.removeEventListener(e,cbWrapper, false );
        });
        callback.apply(this,arguments);
    };

    eventNames.forEach(function(e){
        object.addEventListener(e,cbWrapper,false);
    });

    handle.cancel=function(){
        eventNames.forEach(function(e){
            object.removeEventListener(e,cbWrapper, false );
        });
    };

    return handle;
};

Uso:

var handler = once(document.querySelector('#myElement'), 'transitionend', function(){
   //do something
});

Entonces, si desea cancelar en algún momento, todavía puede hacerlo con

handler.cancel();

También es bueno para otros usos de eventos:)

 3
Author: OpherV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-06 16:37:41