CSS移行時のコールバック


回答:


82

SafariがwebkitTransitionEndコールバックを実装していることを知っています。このコールバックは、遷移を伴う要素に直接アタッチできます。

それらの例(複数行に再フォーマット):

box.addEventListener( 
     'webkitTransitionEnd', 
     function( event ) { 
         alert( "Finished transition!" ); 
     }, false );

他のブラウザと同じものはありますか?
meo

6
はい、Mozillaの「transitionend」とOperaの「oTransitionEnd」。
qqryq 2011年

2
最後の偽りは何をしますか?
meo

@meo thisコールバック内の要素と関係があります。しかし、これは必須パラメーターなので、この場合は要件を満たしています。
Doug Neiner、2011年

8
@DougNeiner最後のfalseはですuseCaptureMode。イベントが発生すると、2つのフェーズがあります。最初のフェーズはキャプチャモード、2番目のフェーズはバブルモードです。キャプチャモードでは、イベントはbody要素から指定された要素に下降します。その後、バブルモードに入り、その逆を行います。最後のfalseパラメータは、イベントリスナーをバブルモードで発生させることを指定します。これの1つの用途は、バブルハンドラーで必要になる直前にイベントハンドラーをアタッチすることです。=)37signals.com/svn/posts/…–
rybosome

103

はい、そのようなものがブラウザでサポートされている場合、遷移が完了するとイベントがトリガーされます。ただし、実際のイベントはブラウザによって異なります。

  • Webkitブラウザー(Chrome、Safari)の使用 webkitTransitionEnd
  • Firefoxは transitionend
  • IE9 +は msTransitionEnd
  • Operaは oTransitionEnd

ただし、これが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移行イベント


2
これは、受け入れられた答えよりもはるかに完全な答えです。なぜこれはもっと賛成されないのですか?
ウェス

呼び出すことを忘れないtransitionEndedHandlertransitionEnded(または変更transitionEndedによってtransitionEndedHandleraddEventListenerremoveEventListener通話transitionEndedtransitionEndedHandler
ミケル

ありがとう@Miquel; transitionEndedという意味で使った ばかりだと思うtransitionEndedHandler
Mark Rhodes

この問題のChromiumの問題は次の場所にあると思います。現在、「修正しない」とマークされています。
Willster、2015年

現在、名前を変える必要はありませんcaniuse.com/#feat=css-transitions
Juan Mendes

43

私は次のコードを使用していますが、ブラウザが使用する特定の終了イベントを検出するよりもはるかに簡単です。

$(".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);

2
イベントが発生するたびにリスト全体を検索しなければならないため、これが遅くなります。
phreakhead 2014

3
@phreakheadこれらのアプローチのパフォーマンスは非常に似ています
トム


5

これは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>


1
これは今日の正解です。もうプレフィックスを付ける必要はありません。caniuse.com/#feat=css-transitions
ファンメンデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.