Обратный вызов перехода CSS

Возможно ли получить уведомление (например, обратный вызов) при завершении перехода по CSS?

Ответ 1

Я знаю, что Safari реализует обратный вызов webkitTransitionEnd, который вы можете прикрепить непосредственно к элементу с переходом.

Их пример (переформатированный в несколько строк):

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

Ответ 2

Да, если такие вещи поддерживаются браузером, то событие завершается после завершения перехода. Фактическое событие, однако, отличается в разных браузерах:

  • Браузеры Webkit (Chrome, Safari) используют webkitTransitionEnd
  • Firefox использует transitionend
  • IE9+ использует msTransitionEnd
  • Опера использует oTransitionEnd

Однако вы должны знать, что webkitTransitionEnd не всегда срабатывает! Это поймало меня несколько раз и, кажется, происходит, если анимация не будет влиять на элемент. Чтобы обойти это, имеет смысл использовать тайм-аут для запуска обработчика событий в случае, если он не был запущен, как ожидалось. Сообщение в блоге об этой проблеме доступно здесь: http://www.cuppadev.co.uk/the-trouble-with-css-transitions/ <- 500 Внутренняя ошибка сервера

Имея это в виду, я склонен использовать это событие в куске кода, который выглядит примерно так:

var transitionEndEventName = "XXX"; //figure out, e.g. "webkitTransitionEnd".. 
var elemToAnimate = ... //the thing you want to animate..
var done = false;
var transitionEnded = function(){
     done = true;
     //do your transition finished stuff..
     elemToAnimate.removeEventListener(transitionEndEventName,
                                        transitionEnded, false);
};
elemToAnimate.addEventListener(transitionEndEventName,
                                transitionEnded, false);

//animation triggering code here..

//ensure tidy up if event doesn't fire..
setTimeout(function(){
    if(!done){
        console.log("timeout needed to call transition ended..");
        transitionEnded();
    }
}, XXX); //note: XXX should be the time required for the
        //animation to complete plus a grace period (e.g. 10ms) 

Примечание: чтобы получить конечное имя события перехода, вы можете использовать метод, опубликованный в ответе: Как нормализовать функции перехода CSS3 в разных браузерах? ,

Примечание: этот вопрос также связан с: - событиями перехода CSS3

Ответ 3

Я использую следующий код, намного проще, чем пытаться определить, какое конкретное конечное событие использует браузер.

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

Альтернативно, если вы используете bootstrap, вы можете просто сделать

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

Это связано с тем, что они включают следующее в 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 (  ._.)
  }

  // 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);

Ответ 4

плагин jQuery.transit, плагин для преобразований и переходов CSS3, может вызывать ваши анимации CSS из script и давать вам обратный вызов.

Ответ 5

Это может быть легко достигнуто с помощью Event-объекта transitionend см. Документацию здесь. Простой пример:

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

function myEndFunction() {
	this.innerHTML = "Transition event ended";
}
#button {transition: top 2s; position: relative; top: 0;}
<button id="button" onclick="this.style.top = '55px';">Click me to start animation</button>