7

我有多个元素,每个元素都以(有点)持续时间进行动画处理。我正在使用 CSS3 过渡制作动画,使用 jQuery 库和David Walshtransitionend的帮助函数。

我的问题是transitionEnd事件没有被触发!(在 Chrome 和 Firefox 中)

我的代码:

var $children = $container.find('.slideblock').children();

if(Modernizr.csstransitions && Modernizr.csstransforms3d) {

    if($.browser.webkit === true) {
        $children.css('-webkit-transform-style','preserve-3d')
    }

    $children.each(function(i){
        $(this).on(whichTransitionEvent,function () {
            $(this).remove();
        });
        $(this).show().css('animation','slideOutToRight ' + ((Math.random() / 2) + .5) + 's');
    });

}

更新

whichTransitionEvent变量指向一个自执行函数,该函数返回一个包含事件名称的字符串:

var whichTransitionEvent = (function (){
    var t;
    var el = document.createElement('fakeelement');
    var transitions = {
      'transition'       :'transitionEnd',
      'OTransition'      :'oTransitionEnd',
      'MSTransition'     :'msTransitionEnd',
      'MozTransition'    :'transitionend',
      'WebkitTransition' :'webkitTransitionEnd'
    }

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

console.log(whichTransitionEvent);        // returns "webkitTransitionEvent" in Chrome
console.log(typeof whichTransitionEvent); // returns "string"
4

3 回答 3

18

不要将“过渡”与“动画”混淆。

CSS 动画有不同的回调。

这是动画的回调:

 $(document).one("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", 
                "#robot", 
    function (event)
    {
        // complete
    });
于 2015-08-31T02:33:44.120 回答
8

尝试在 Chrome 29 和 Firefox 23 中复制此功能,您的原始功能以同样的方式失败,即我看到两者都console.log(whichTransitionEvent)返回'transitionEnd'

重新排序transitions散列中的元素可以解决问题,这表明两者都具有无前缀标准属性以及它们自己的前缀属性。

下面的重构函数,它为我触发了正确的事件:

function whichTransitionEvent(){
  var t;
  var el = document.createElement('fakeelement');
  var transitions = {
    'WebkitTransition' :'webkitTransitionEnd',
    'MozTransition'    :'transitionend',
    'MSTransition'     :'msTransitionEnd',
    'OTransition'      :'oTransitionEnd',
    'transition'       :'transitionEnd'
  }

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

让我知道这是否有帮助

于 2013-09-07T11:50:37.150 回答
-1

你正在传递一个函数而不是一个字符串,所以你正在做相当于......

$(this).on(function(){...}, function() {...})

要解决这个问题,我建议在脚本的开头设置字符串,这样它就不会被多次调用。

if(Modernizr.csstransitions && Modernizr.csstransforms3d) {
    var transitionEnd = whichTransitionEvent();
    if($.browser.webkit === true) {
        $children.css('-webkit-transform-style','preserve-3d')
    }

    $children.each(function(i){
        $(this).on(transitionEnd,function () {
            $(this).remove();
        });
        $(this).show().css('animation','slideOutToRight ' + ((Math.random() / 2) + .5) + 's');
    });

}
于 2012-09-03T18:27:18.477 回答