2010-12-06 31 views
2

我有简单的HTML与divbutton。此外,我有CSS3转型的CSS类:立即添加和删除相同的CSS类

.animate 
{ 
    -webkit-animation-name: animation; 
    -webkit-animation-duration: 0.3s; 
    -webkit-animation-iteration-count: 2; 
} 

我想通过单击按钮开始动画。所以,我写了一个脚本,它立即删除并再次将.animate类添加到div,但不幸的是,它不起作用。检查出来:

("#button").click(function(){ 
    startAnimation(); 
    }); 

    function startAnimation() 
    { 
     if ($("#test-div").hasClass('animate')==true) 
     { 
      $("#test-div").removeClass('animate'); 
      startAnimation(); 
     } 
     else 
     { 
      $("#test-div").addClass('animate'); 
     } 
    } 

为什么jQuery不能删除并立即添加相同的类?我该如何解决这个问题?

也许,还有另一种方法来通过点击任何选择器来启动css3转换?

谢谢。

UPD。我在jsfiddle.net/PfzZN/1/

+1

我想你会在JavaScript中使用动画,然后试图有超过CSS动画细粒度控制有一个更容易的时间。 – alex 2010-12-06 06:55:50

+2

为什么不只是**不添加课程,如果它已经在那里? – 2010-12-06 06:56:44

回答

8

如果对DOM进行更改的脚本位于同一个线程中,则出于某种原因,直到线程完成后才会应用更改。所以,按照你的方式,浏览器会看到没有发生任何事情,因为'animate'类被删除并添加到同一个线程中。

作为解决方法,这是否足够好?

function startAnimation() 
{ 
    $("#flash-message").removeClass('animate'); 
    setTimeout(function(){ 
     $("#flash-message").addClass('animate') 
    },1); 
} 
0

(我原来的答复是通过编辑“已删除”,因为这是完全错误的。)

这似乎有点像WebKit的执行合法的bug,或者至少一件很意外的上传脚本。因为如果你做一个setTimeout,像这样:

function startAnimation() 
{ 
    $("#flash-message").toggleClass('animate');  
    if (!$("#flash-message").hasClass('animate')) 
    { 
     setTimeout(function() 
     { 
      $("#flash-message").addClass('animate');  
     }, 1); 
    } 
} 

然后它的工作。也就是说,延迟添加类直到后来似乎让Webkit意识到它应该重新开始动画。

不是一个很好的解决方案,但事实上它是1毫秒setTimeout意味着至少它不是一个时间问题......不过很奇怪。