Відповіді:
Я знаю, що Safari реалізує зворотний виклик webkitTransitionEnd, який можна приєднати безпосередньо до елемента з переходом.
Їх приклад (переформатований на кілька рядків):
box.addEventListener(
'webkitTransitionEnd',
function( event ) {
alert( "Finished transition!" );
}, false );
thisелементом всередині зворотного дзвінка. Але це необхідний параметр, тому в цьому випадку його просто виконання вимоги.
useCaptureMode. Коли відбувається подія, існують дві фази - перша фаза - це режим зйомки, друга - режим міхура. У режимі захоплення подія опускається від елемента тіла до вказаного елемента. Потім він переходить в режим бульбашок, де робить зворотний. Цей заключний помилковий парам вказує, що ви хочете, щоб слухач події відбувався в режимі міхура. Одним із способів цього є приєднання обробників подій безпосередньо до того, як вони знадобляться в бульбашковому режимі. =) 37signals.com/svn/posts/…
Так, якщо такі речі підтримуються браузером, тоді подія запускається, коли перехід завершується. Фактична подія, однак, відрізняється між браузерами:
webkitTransitionEndtransitionendmsTransitionEndoTransitionEndОднак ви повинні знати, що 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
transitionEndedHandlerв transitionEnded(або зміни transitionEndedна transitionEndedHandlerв addEventListenerі removeEventListenerй виклик transitionEndedв transitionEndedHandler)
transitionEndedколи я мав в виду transitionEndedHandler.
Я використовую наступний код, набагато простіше, ніж намагатися визначити, яку конкретну кінцеву подію використовує браузер.
$(".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);
Плагін jQuery.transit , плагін для CSS3 перетворень і переходів, можна назвати ваші CSS - анімацію зі сценарію і дати вам зворотний виклик.
Це легко досягти завдяки 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>