css3トランジションが開始または終了したかどうかを確認するために、要素によって発生するイベントはありますか?
6 に答える
W3CCSS移行ドラフト
CSSトランジションが完了すると、対応するDOMイベントが生成されます。遷移が発生するプロパティごとにイベントが発生します。これにより、コンテンツ開発者はトランジションの完了と同期するアクションを実行できます。
Webkit
トランジションがいつ完了するかを判断するには、トランジションの最後に送信されるDOMイベントのJavaScriptイベントリスナー関数を設定します。イベントはWebKitTransitionEventのインスタンスであり、そのタイプは
webkitTransitionEndです。
box.addEventListener( 'webkitTransitionEnd', 
    function( event ) { alert( "Finished transition!" ); }, false );
Mozilla
遷移が完了したときに発生する単一のイベントがあります。Firefoxでは、イベントは
transitionend、OperaではoTransitionEnd、、WebKitではですwebkitTransitionEnd。
オペラ
利用可能な移行イベントには1つのタイプがあります。イベントは、移行の
oTransitionEnd完了時に発生します。
インターネットエクスプローラ
イベントは、移行の
transitionend完了時に発生します。トランジションが完了する前に削除された場合、イベントは発生しません。
アップデート
最新のブラウザはすべて、プレフィックスなしのイベントをサポートするようになりました。
element.addEventListener('transitionend', callback, false);
https://caniuse.com/#feat=css-transitions
私はピートによって与えられたアプローチを使用していましたが、現在は次の方法を使用し始めています
$(".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 (  ._.)
  }
  $(function () {
    $.support.transition = transitionEnd()
  })
}(jQuery);
また、コールバックが常に発生するようにするために必要な emulateTransitionEnd 関数も含まれていることに注意してください。
  // 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
  }
このイベントが発生しない場合があることに注意してください。通常は、プロパティが変更されないか、ペイントがトリガーされない場合です。常にコールバックを取得できるように、イベントを手動でトリガーするタイムアウトを設定しましょう。
最新のブラウザはすべて、プレフィックスなしのイベントをサポートするようになりました。
element.addEventListener('transitionend', callback, false);
Chrome、Firefox、Safari の最新バージョンで動作します。IE10+でも。
Opera 12では、プレーンJavaScriptを使用してバインドすると、「oTransitionEnd」が機能します。
document.addEventListener("oTransitionEnd", function(){
    alert("Transition Ended");
});
ただし、jQueryを介してバインドする場合は、「otransitionend」を使用する必要があります
$(document).bind("otransitionend", function(){
    alert("Transition Ended");
});
Modernizrまたはbootstrap-transition.jsを使用している場合は、次のように変更するだけです。
var transEndEventNames = {
    'WebkitTransition' : 'webkitTransitionEnd',
    'MozTransition'    : 'transitionend',
    'OTransition'      : 'oTransitionEnd otransitionend',
    'msTransition'     : 'MSTransitionEnd',
    'transition'       : 'transitionend'
},
transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];
ここにもいくつかの情報がありますhttp://www.ianlunn.co.uk/blog/articles/opera-12-otransitionend-bugs-and-workarounds/
楽しみのために、これをしないでください!
$.fn.transitiondone = function () {
  return this.each(function () {
    var $this = $(this);
    setTimeout(function () {
      $this.trigger('transitiondone');
    }, (parseFloat($this.css('transitionDelay')) + parseFloat($this.css('transitionDuration'))) * 1000);
  });
};
$('div').on('mousedown', function (e) {
  $(this).addClass('bounce').transitiondone();
});
$('div').on('transitiondone', function () {
  $(this).removeClass('bounce');
});
JS フレームワークを使用せずに単一の遷移終了のみを検出する場合は、次の便利なユーティリティ関数を使用します。
function once = function(object,event,callback){
    var handle={};
    var eventNames=event.split(" ");
    var cbWrapper=function(){
        eventNames.forEach(function(e){
            object.removeEventListener(e,cbWrapper, false );
        });
        callback.apply(this,arguments);
    };
    eventNames.forEach(function(e){
        object.addEventListener(e,cbWrapper,false);
    });
    handle.cancel=function(){
        eventNames.forEach(function(e){
            object.removeEventListener(e,cbWrapper, false );
        });
    };
    return handle;
};
使用法:
var handler = once(document.querySelector('#myElement'), 'transitionend', function(){
   //do something
});
その後、ある時点でキャンセルしたい場合でも、それを行うことができます
handler.cancel();
他のイベント用途にも適しています:)