代码之家  ›  专栏  ›  技术社区  ›  Andreas Köberle

CSS3转换事件

  •  185
  • Andreas Köberle  · 技术社区  · 16 年前

    6 回复  |  直到 5 年前
        1
  •  213
  •   Cœur Gustavo Armenta    7 年前

    W3C CSS Transitions Draft

    CSS转换的完成会生成相应的DOM事件。将为经历转换的每个属性激发一个事件。这允许内容开发人员执行与转换完成同步的操作。


    Webkit

    要确定转换何时完成,请为转换结束时发送的DOM事件设置JavaScript事件侦听器函数。该事件是WebKittTransitionEvent的实例,其类型为 webkitTransitionEnd

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

    Mozilla

    transitionend ,在歌剧中, oTransitionEnd ,而在WebKit中 WebKittTransitionEnd网站

    Opera

    有一种类型的转换事件 可用。这个 事件 在完成时发生 过渡。

    Internet Explorer

    事件发生在转换完成时。如果在完成之前删除了转换,则不会触发事件。


    Stack Overflow: How do I normalize CSS3 Transition functions across browsers?

        2
  •  76
  •   Tom    6 年前

    更新

    所有现代浏览器现在都支持unprefixed事件:

    element.addEventListener('transitionend', callback, false);

    https://caniuse.com/#feat=css-transitions


    我使用的是Pete给出的方法,但是现在我已经开始使用以下方法

    $(".myClass").one('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', 
    function() {
     //do something
    });
    

    或者,如果你使用引导,那么你可以简单地做

    $(".myClass").one($.support.transition.end,
    function() {
     //do something
    });
    

    +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
      }
    

    当属性不存在时’不能改变或油漆是’未触发。为了确保我们 总是得到一个回调,让我们设置一个触发事件的超时

    http://blog.alexmaccaw.com/css-transitions

        3
  •  61
  •   Brian M. Hunt    11 年前

    所有现代浏览器 now support 非固定事件:

    element.addEventListener('transitionend', callback, false);

        4
  •  16
  •   Peter    13 年前

    在Opera 12中,当您使用纯JavaScript绑定时,“otTransitionEnd”将起作用:

    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/

        5
  •  6
  •   yckart Matthew Crumley    11 年前

    只是为了好玩,别这样!

    $.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');
    });
    
        6
  •  3
  •   OpherV    9 年前

    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();