CSS3移行が終了したときのコールバック


202

要素をフェードアウトし(その不透明度を0に移行)、終了したらDOMから要素を削除します。

jQueryでは、アニメーションの完了後に「削除」を指定できるため、これは簡単です。しかし、CSS3トランジションを使用してアニメーション化したい場合、トランジション/アニメーションがいつ完了したかを知る方法はありますか?



回答:


334

遷移の場合、以下を使用してjQuery経由で遷移の終了を検出できます。

$("#someSelector").bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", function(){ ... });

Mozillaには優れたリファレンスがあります。

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions#Detecting_the_start_and_completion_of_a_transition

アニメーションの場合は非常に似ています。

$("#someSelector").bind("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", function(){ ... });

すべてのブラウザー接頭辞付きイベント文字列をbind()メソッドに同時に渡して、それをサポートするすべてのブラウザーでのイベント発生をサポートできることに注意してください。

更新:

Duckが残したコメントごとに、jQueryの.one()メソッドを使用して、ハンドラーが1回だけ起動されるようにします。例えば:

$("#someSelector").one("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", function(){ ... });

$("#someSelector").one("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", function(){ ... });

アップデート2:

jQuery bind()メソッドは非推奨になりました。on()メソッドはの時点で推奨されていjQuery 1.7ます。bind()

またoff()、コールバック関数でmethodを使用して、1回だけ呼び出されるようにすることもできます。one()メソッドの使用と同等の例を次に示します。

$("#someSelector")
.on("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd",
 function(e){
    // do something here
    $(this).off(e);
 });

参照:


13
トランジットするすべての子要素に対してコールバックが発生することは注目に値します。これは、コールバックが予想よりも多く発生する理由を疑問に思っている場合に備えて、非常に重要です。現在のところ、回避策はわかりません。
レフ

22
@LevイベントのcurrentTargetをそのターゲットと比較することで、これを簡単に軽減できます。したがって、次のようなものです:function(event){if(event.target === event.currentTarget){/ *何かを行う* /}}
Jim Jeffers

5
ええ、私はコメントを書いた直後にそれを理解しました。> _ <投稿していただきありがとうございます。それは他の人を助けると確信しています!:)
Lev

9
私たちは、使用.on()するのではなく.bind()jQueryのV1.7用+ api.jquery.com/bind
OLO

4
現在のすべてのブラウザーは、接頭辞なしのイベントをサポートしています。 caniuse.com/#feat=css-transitions「transitionend webkitTransitionEnd」がある場合、Chromeで2回トリガーされることにも注意してください。
マイケルS.

17

別のオプションは、jQuery Transit Frameworkを使用してCSS3遷移を処理することです。トランジション/エフェクトはモバイルデバイスで適切に実行され、アニメーションエフェクトを実行するためにCSSファイルに面倒なCSS3トランジションを1行追加する必要はありません。

要素をクリックすると要素の不透明度が0に遷移し、遷移が完了すると削除される例を次に示します。

$("#element").click( function () {
    $('#element').transition({ opacity: 0 }, function () { $(this).remove(); });
});

JS Fiddleデモ


コールバックが機能していません-多分それは私が知らないトランジットのapiの変更が原因ですが、フィドルの例は機能していません。アニメーションが実行される前に非表示メソッドをトリガーします(
Chromeで

@JonathanLiutiは、FireFox 25、IE11、Chrome 31を使用してテストされました。正常に動作します。
ROFLwTIME 2013年

いや@ROFLwTIMEあなたは完全に正しいです-それは私のクロムがちょうど狂っていたようです。クロームを完全に再起動した後、今日フィドルを再テストしましたが、期待どおりに機能しています。私の悪い!申し訳ありませんが、これは
Jonathan Liuti 2013年

14

あります animationend観察できるイベントます。こちらのドキュメントを参照してください。CSS transitionアニメーションの場合も、transitionendイベントを使用できます

追加のライブラリは必要ありません。これらはすべてバニラJSで動作します

document.getElementById("myDIV").addEventListener("transitionend", myEndFunction);
function myEndFunction() {
	this.innerHTML = "transition event ended";
}
#myDIV {transition: top 2s; position: relative; top: 0;}
div {background: #ede;cursor: pointer;padding: 20px;}
<div id="myDIV" onclick="this.style.top = '55px';">Click me to start animation.</div>


2
これは境界線のリンクのみの回答です。ここにできるだけ多くの情報を含めるように回答を拡張し、参照用にのみリンクを使用してください。
さようならStackExchange 2018年

4
これはjQueryに依存しない最初のものなので、投票してください。枝のために木全体を切り倒す意味はありません。
アーロンメイソン

7

これが便利な人のために、CSSクラスを介してCSSアニメーションを適用し、その後コールバックを取得するために成功したjQuery依存関数を次に示します。Backbone.jsアプリで使用していたため、完全には機能しない可能性がありますが、役に立つかもしれません。

var cssAnimate = function(cssClass, callback) {
    var self = this;

    // Checks if correct animation has ended
    var setAnimationListener = function() {
        self.one(
            "webkitAnimationEnd oanimationend msAnimationEnd animationend",
            function(e) {
                if(
                    e.originalEvent.animationName == cssClass &&
                    e.target === e.currentTarget
                ) {
                    callback();
                } else {
                    setAnimationListener();
                }
            }
        );
    }

    self.addClass(cssClass);
    setAnimationListener();
}

ちょっとこう使った

cssAnimate.call($("#something"), "fadeIn", function() {
    console.log("Animation is complete");
    // Remove animation class name?
});

http://mikefowler.me/2013/11/18/page-transitions-in-backbone/からのオリジナルのアイデア

そして、これは便利なようです:http : //api.jqueryui.com/addClass/


更新

上記のコードと他のオプションに取り組んだ後、CSSアニメーションの終了をリッスンすることに非常に注意することをお勧めします。複数のアニメーションが進行していると、イベントを聞くのに非常に速く混乱する可能性があります。小さなアニメーションも含め、すべてのアニメーションにGSAPのようなアニメーションライブラリを強くお勧めします。


それを共有してくれてありがとう、私はそれを使用して追加を編集しました e.stopImmediatePropagation(); self.trigger(this.whichAnimationEvent()); //for purge existing event callback.apply(self);
BomAle

5

受け入れられた回答は現在、Chromeのアニメーションに対して2回起動されます。これはwebkitAnimationEndと同様に認識しているためと考えられanimationEndます。以下は間違いなく一度だけ発火します:

/* From Modernizr */
function whichTransitionEvent(){

    var el = document.createElement('fakeelement');
    var transitions = {
        'animation':'animationend',
        'OAnimation':'oAnimationEnd',
        'MSAnimation':'MSAnimationEnd',
        'WebkitAnimation':'webkitAnimationEnd'
    };

    for(var t in transitions){
        if( transitions.hasOwnProperty(t) && el.style[t] !== undefined ){
            return transitions[t];
        }
    }
}

$("#elementToListenTo")
    .on(whichTransitionEvent(),
        function(e){
            console.log('Transition complete!  This is the callback!');
            $(this).off(e);
        });

3
アニメーションイベントを処理するので、代わりに関数whichAnimationEvent()を呼び出すことをお勧めします。
JakobLøkkeMadsen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.