CSS转换回调

cetgtptt  于 2023-04-01  发布在  其他
关注(0)|答案(5)|浏览(207)

当CSS转换完成时,是否可以获得通知(如回调)?

vd2z7a6w

vd2z7a6w1#

是的,如果浏览器支持这些功能,那么当转换完成时会触发一个事件。然而,实际的事件在浏览器之间是不同的:

  • Webkit浏览器(Chrome、Safari)使用webkitTransitionEnd
  • Firefox使用transitionend
  • IE9+使用msTransitionEnd
  • Opera使用oTransitionEnd

然而,你应该注意到webkitTransitionEnd并不总是触发!这已经让我陷入了很多次,并且似乎发生在动画对元素没有影响的情况下。为了解决这个问题,在没有按预期触发事件处理程序的情况下使用超时来触发事件处理程序是有意义的。关于这个问题的博客文章可以在这里找到:服务器内部错误 *
考虑到这一点,我倾向于在一段代码中使用这个事件,看起来有点像这样:

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 transition events

xzabzqsa

xzabzqsa2#

我知道Safari实现了一个webkitTransitionEnd回调,您可以直接将其附加到具有转换的元素。
他们的例子(重新格式化为多行):

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

8xiog9wr3#

我使用下面的代码,比试图检测浏览器使用的特定结束事件要简单得多。

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

jslywgbw4#

这可以通过transitionend事件轻松实现。参见文档here
举个简单的例子:

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>
ltskdhd1

ltskdhd15#

jQuery.transit plugin是一个用于CSS3转换和过渡的插件,可以从脚本调用CSS动画并给予你一个回调。

相关问题