2012-02-13 35 views
180

我想淡出一個元素(將其不透明度轉換爲0),然後在完成時從DOM中刪除該元素。當CSS3轉換完成時回調

在jQuery中,這是直截了當的,因爲您可以指定「移除」在動畫完成後發生。但是,如果我希望使用CSS3轉換進行動畫製作,無論如何要知道轉換/動畫何時完成?

+3

應該與此類似:http://stackoverflow.com/questions/6186454/is-there-a-callback-on-completion-of-a-css3-動畫 – 2012-02-13 03:41:35

+5

Duplicate:http://stackoverflow.com/questions/2087510/callback-on-css-transition – 2012-08-13 00:48:49

回答

307

對於您可以使用以下通過jQuery來檢測一個過渡期結束轉換:

​​

Mozilla有一個很好的參考:

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions#Detecting_the_start_and_completion_of_a_transition

對於動畫這是非常相似:

$("#someSelector").bind("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", function(){ ... }); 

請注意,您可以同時將所有瀏覽器預定義的事件字符串傳遞給bind()方法,以支持在支持它的所有瀏覽器上觸發事件。

更新:

每通過鴨留下的評語:你使用jQuery的.one()方法,以確保處理器只觸發一次。例如:

​​

更新2:

jQuery的bind()方法已被棄用,而on()方法是優選作爲jQuery 1.7bind()

您還可以在回調函數上使用off()方法來確保它只會被觸發一次。以下是這相當於使用one()方法的示例:

$("#someSelector") 
.on("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", 
function(e){ 
    // do something here 
    $(this).off(e); 
}); 

參考文獻:

+9

值得注意的是,回調將被解僱爲*每個*子元素,也是如此。如果您想知道爲什麼您的回調被觸發的次數比您預期的要多,那麼記住這一點非常重要。到目前爲止,我還沒有意識到任何解決方法。 – Lev 2013-12-16 20:25:21

+19

@Lev通過比較事件的currentTarget和它的目標,你可以很容易地解決這個問題。因此,像: 函數(事件){ 如果(event.target === event.currentTarget){ /*做的東西* /}} 呀 – 2013-12-20 04:12:35

+3

,我想通了這一點後不久,我寫的評論。 > _ <感謝您發佈它;我相信它會幫助別人! :) – Lev 2013-12-20 09:36:07

16

另一種選擇是使用jQuery Transit Framework來處理你的CSS3轉換。轉換/效果在移動設備上表現良好,並且您不必在CSS文件中添加一行混亂的CSS3轉換以執行動畫效果。

這裏是將過渡元素的不透明度爲0的例子,當你點擊它,將被刪除,一旦完成過渡:

$("#element").click(function() { 
    $('#element').transition({ opacity: 0 }, function() { $(this).remove(); }); 
}); 

JS Fiddle Demo

+0

回調不起作用 - 可能是由於更改在運輸的API我不知道,但小提琴的例子不起作用。它會在動畫運行之前觸發hide方法(在chrome中試用) – 2013-11-21 22:38:26

+0

@JonathanLiuti使用FireFox 25,IE11,Chrome 31進行測試。工作正常。 – ROFLwTIME 2013-11-22 16:40:19

+0

是@ROFLwTIME你是完全正確的 - 看起來我的鉻只是瘋了。在徹底重新啓動Chrome之後,今天重新測試了小提琴,並且按預期工作。我的錯 !對不起'這個。 – 2013-11-23 10:06:33

7

對於任何人,這可能是得心應手因爲,這裏是一個jQuery依賴函數,我通過CSS類應用CSS動畫獲得成功,然後從之後獲得回調。它可能無法正常工作,因爲我在Backbone.js應用程序中使用它,但可能有用。

var cssAnimate = function(cssClass, callback) { 
    var self = this; 

    // Checks if correct animation has ended 
    var setAnimationListener = function() { 
     self.one(
      "webkitAnimationEnd oanimationend msAnimationEnd animationend", 
      function(e) { 
       if(
        e.originalEvent.animationName == cssClass && 
        e.target === e.currentTarget 
       ) { 
        callback(); 
       } else { 
        setAnimationListener(); 
       } 
      } 
     ); 
    } 

    self.addClass(cssClass); 
    setAnimationListener(); 
} 

我用它有點像從http://mikefowler.me/2013/11/18/page-transitions-in-backbone/

cssAnimate.call($("#something"), "fadeIn", function() { 
    console.log("Animation is complete"); 
    // Remove animation class name? 
}); 

原始理念和這似乎得心應手:http://api.jqueryui.com/addClass/


更新

經過上面的代碼和其他選項的努力,我會建議對任何CSS動畫結束聆聽非常謹慎。隨着多個動畫的進行,這可能會非常快速地進行事件監聽。我強烈建議爲每個動畫製作一個動畫庫,如GSAP,即使是小動畫。

4

接受的答案目前在Chrome中爲動畫啓動兩次。大概這是因爲它承認webkitAnimationEnd以及animationEnd。下面將肯定只能觸發一次:

/* From Modernizr */ 
function whichTransitionEvent(){ 

    var el = document.createElement('fakeelement'); 
    var transitions = { 
     'animation':'animationend', 
     'OAnimation':'oAnimationEnd', 
     'MSAnimation':'MSAnimationEnd', 
     'WebkitAnimation':'webkitAnimationEnd' 
    }; 

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

$("#elementToListenTo") 
    .on(whichTransitionEvent(), 
     function(e){ 
      console.log('Transition complete! This is the callback!'); 
      $(this).off(e); 
     }); 
+2

我會建議調用函數whichAnimationEvent()來代替,因爲它處理動畫事件。 – 2016-09-07 11:09:45