CSS トランジションが完了したときに (コールバックのような) 通知を受け取ることは可能ですか?
5 に答える
はい、そのようなことがブラウザーでサポートされている場合、遷移が完了するとイベントがトリガーされます。ただし、実際のイベントはブラウザーによって異なります。
- Webkit ブラウザー (Chrome、Safari) の使用webkitTransitionEnd
- Firefox が使用するtransitionend
- IE9+ の使用msTransitionEnd
- Opera の使用oTransitionEnd
webkitTransitionEndただし、常に発火するとは限らないことに注意してください。これは何度も私を捕まえました.アニメーションが要素に影響を与えない場合に発生するようです. これを回避するには、イベント ハンドラーが期待どおりにトリガーされない場合にタイムアウトを使用してイベント ハンドラーを起動するのが理にかなっています。この問題に関するブログ投稿は、こちらから入手できます: http://www.cuppadev.co.uk/the-trouble-with-css-transitions/  <-- 500 Internal Server Error
これを念頭に置いて、私はこのイベントを次のようなコードのチャンクで使用する傾向があります。
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) 
注:遷移イベントの終了名を取得するには、答えとして投稿された方法を使用できます: How do I normalize CSS3 Transition functions across browsers? .
注: この質問は以下にも関連しています: - CSS3 移行イベント
Safariは、トランジションで要素に直接アタッチできるwebkitTransitionEndコールバックを実装していることを知っています。
その例 (複数行に再フォーマット):
box.addEventListener( 
     'webkitTransitionEnd', 
     function( event ) { 
         alert( "Finished transition!" ); 
     }, false );
私は次のコードを使用していますが、ブラウザが使用する特定の終了イベントを検出しようとするよりもはるかに簡単です。
$(".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);
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>CSS3変換および遷移用のプラグインであるjQuery.transitプラグインは、スクリプトからCSSアニメーションを呼び出して、コールバックを提供できます。