Czy można otrzymać powiadomienie (np. Oddzwonienie) po zakończeniu przejścia CSS?
Odpowiedzi:
Wiem, że Safari implementuje wywołanie zwrotne webkitTransitionEnd , które możesz dołączyć bezpośrednio do elementu z przejściem.
Ich przykład (ponownie sformatowany do wielu wierszy):
box.addEventListener(
'webkitTransitionEnd',
function( event ) {
alert( "Finished transition!" );
}, false );
thiselementem wewnątrz wywołania zwrotnego. Ale jest to wymagany parametr, więc w tym przypadku spełnia on tylko wymaganie.
useCaptureMode. Kiedy zdarzenie ma miejsce, są dwie fazy - pierwsza faza to tryb przechwytywania, druga to tryb bąbelkowy. W trybie przechwytywania zdarzenie schodzi z elementu body do określonego elementu. Następnie przechodzi w tryb bąbelkowy, w którym działa odwrotnie. Ten ostatni fałszywy parametr określa, że detektor zdarzeń ma działać w trybie bąbelkowym. Jednym z zastosowań tego jest dołączanie programów obsługi zdarzeń tuż przed ich użyciem w trybie bąbelkowym. =) 37signals.com/svn/posts/…
Tak, jeśli takie rzeczy są obsługiwane przez przeglądarkę, to po zakończeniu przejścia wyzwalane jest zdarzenie. Faktyczne zdarzenie różni się jednak w zależności od przeglądarki:
webkitTransitionEndtransitionendmsTransitionEndoTransitionEndNależy jednak pamiętać, że webkitTransitionEndnie zawsze strzela! Przyłapało mnie to wiele razy i wydaje się, że ma miejsce, gdyby animacja nie miała wpływu na element. Aby obejść ten problem, warto użyć limitu czasu do uruchomienia procedury obsługi zdarzeń w przypadku, gdy nie została ona wyzwolona zgodnie z oczekiwaniami. Wpis na blogu dotyczący tego problemu jest dostępny tutaj: http://www.cuppadev.co.uk/the-trouble-with-css-transitions/ <- 500 Wewnętrzny błąd serwera
Mając to na uwadze, zwykle używam tego zdarzenia w kawałku kodu, który wygląda trochę tak:
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)
Uwaga: aby uzyskać nazwę końca zdarzenia przejścia, możesz użyć metody opublikowanej jako odpowiedź w: Jak znormalizować funkcje przejścia CSS3 w różnych przeglądarkach? .
Uwaga: to pytanie dotyczy również: - zdarzeń przejścia CSS3
transitionEndedHandlersię transitionEnded(lub zmiana transitionEndedprzez transitionEndedHandlerw addEventListeneri removeEventListenera rozmowa transitionEndedw transitionEndedHandler)
transitionEndedkiedy miałem na myśli transitionEndedHandler.
Używam następującego kodu, jest znacznie prostszy niż próba wykrycia, którego konkretnego zdarzenia końcowego używa przeglądarka.
$(".myClass").one('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd',
function() {
//do something
});
Alternatywnie, jeśli używasz bootstrap, możesz po prostu to zrobić
$(".myClass").one($.support.transition.end,
function() {
//do something
});
Dzieje się tak, ponieważ zawierają one następujące elementy w pliku 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 plugin , plugin do przekształceń CSS3 i przejściami, mogą dzwonić animacje CSS ze skryptu i daje zwrotnego.
Można to łatwo osiągnąć dzięki transitionendwydarzeniu, patrz dokumentacja tutaj
Prosty przykład:
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>