2012-03-02 34 views
2

這確實做了延誤,但似乎並沒有應用該樣式的變化,直到最後:如何動畫CSS盒陰影深度(使用jQuery或CSS3轉換)?

for (i=20;i>=0;i--) {    
    var boxShadow = i+"px "+i+"px "+i+"px #888"; 
    $('article').css("box-shadow", boxShadow); 
    sleep(20); 
} 
function sleep(ms) 
{ 
    var dt = new Date(); 
    dt.setTime(dt.getTime() + ms); 
    while (new Date().getTime() < dt.getTime()); 
} 

這完全不適用的拖延:

for (i=20;i>=0;i--) {    
    var boxShadow = i+"px "+i+"px "+i+"px #888"; 
    $('article').delay(500).css("box-shadow", boxShadow); 
} 

可以這樣做更多輕鬆與css3轉換?我只是在延遲樣本中做出一些小的jquery錯誤?

謝謝任何​​能夠幫助的人。

回答

4

您可以使用類和setTimeout利用CSS3過渡爲您的動畫效果:

CSS -

#some-element { 
    -webkit-transition : all 0.5s linear; 
     -moz-transition : all 0.5s linear; 
     -ms-transition : all 0.5s linear; 
     -o-transition : all 0.5s linear; 
      transition : all 0.5s linear; 
} 
#some-element.ani-state { 
    -webkit-box-shadow : 0 0 24px #000; 
     -moz-box-shadow : 0 0 24px #000; 
      box-shadow : 0 0 24px #000; 
} 

我用all,因爲鉻的過渡聲明...鉻的一些版本使用-webkit-box-shadow和更新版本使用box-shadowall如果不更改元素的任何其他屬性(或者如果您想要動畫那些屬性更改),則不是什麼大問題。

JS -

$(function() { 

    var $someElement = $('#some-element'); 

    $someElement.on('click', function() { 
     $someElement.addClass('ani-state'); 
     setTimeout(function() { 
      $someElement.removeClass('ani-state'); 
     }, 500); 
    }); 
}); 

這裏是一個演示:http://jsfiddle.net/jasper/tvfPq/1/

注意,在演示中,我用了兩個box-shadowsbox-shadow : 0 0 24px #000, inset 0 0 24px #999;

+0

延遲已經CSS轉換的一部分: '轉變:物業持續時間計時功能的延遲;'所以如果你想你的過渡到有500ms的延遲,你只是包括。 'transition:所有0.5s線性500ms;' – scurker 2012-03-02 18:40:49

+0

@scurker注意'setTimeout'內部是'.removeClass()',所以我將元素返回到原始狀態。動畫立即開始。 setTimeout的超時設置爲CSS轉換的持續時間,以便它完全完成,然後恢復到原始狀態。 – Jasper 2012-03-02 18:45:33

+0

我誤解了原來的問題。看起來像這樣做的最好方法是使用@keyframes,如果你想在動畫過程中將動畫恢復到原始狀態。 – scurker 2012-03-02 18:58:59