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 );
this
elementem 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:
webkitTransitionEnd
transitionend
msTransitionEnd
oTransitionEnd
Należy jednak pamiętać, że webkitTransitionEnd
nie 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
transitionEndedHandler
się transitionEnded
(lub zmiana transitionEnded
przez transitionEndedHandler
w addEventListener
i removeEventListener
a rozmowa transitionEnded
w transitionEndedHandler
)
transitionEnded
kiedy 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 transitionend
wydarzeniu, 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>