Обратный звонок при переходе CSS - PullRequest
96 голосов
/ 18 января 2010

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

Ответы [ 5 ]

103 голосов
/ 06 июля 2012

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

  • Использование браузеров Webkit (Chrome, Safari) webkitTransitionEnd
  • Использование Firefox transitionend
  • Использование IE9 + msTransitionEnd
  • Opera использует oTransitionEnd

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

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

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

82 голосов
/ 18 января 2010

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

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

box.addEventListener( 
     'webkitTransitionEnd', 
     function( event ) { 
         alert( "Finished transition!" ); 
     }, false );
43 голосов
/ 13 декабря 2012

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

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

В качестве альтернативы, если вы используете начальную загрузку, вы можете просто сделать

$(".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);
6 голосов
/ 06 июля 2012

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

4 голосов
/ 16 ноября 2018

Этого легко достичь с помощью события 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>
...