2015-03-30 140 views
0

这里是我的目标描述:使用CSS动画 - setTimeout的不适变化,打破动画

  1. 我有框display: none
  2. 在某个时刻,我需要opacity动画来显示它。

这里我的解决办法:
1. transition: opacity 0.5s ease-in-out;
2.在第一个步骤设置display: block; opacity: 0
3.在设置display: block; opacity: 1第二步,做在setTimeout()申请的第一步。

问题是,第一步只适用于某些情况 - 有时它有效/有时不适用,浏览器只是跳过第一步。我想改变setTimeout到​​应该可以解决问题,但它不会 - check my example

为什么setTimeout/​​不会强制浏览器应用的第一步?如何强制浏览器在应用第二步之前应用第一步?

回答

1

解决方案:http://jsfiddle.net/sxny7zs2/

.box{display:none}应该.box{display: block;}

当您设置display:none你从DOM删除对象几乎完全。通过重置为display:block,可以完全恢复对象并开始与其他对象交互。 display功能不是用于动画,而是用于消除物体干扰他人。

我怀疑这是小人:

$box.removeClass('is-animate-enter').addClass('is-animate-active');

通过消除is-animate-enter类,你触发display:none;你可以添加你的下一个课前。这意味着对象从视图中卸载。同时当你做is-animate-active你立即设置display:blockopacity:1。就浏览器而言,您正在创建一个新元素,而不是在此修改旧元素。如前所述,当切换display时,您实际上是loadingunloading一个对象,因此没有动画是可能的。

也许.switchClass()可以解决这个问题,但我不知道,重申display命令是loadingunloading而不是动画。

+0

它必须在开始时隐藏+我通过'.box.is-animate-enter'设置'display:block'。我的问题:为什么'setTimeout'只工作somites /原因是什么/如何使它稳定? – 2015-03-31 00:04:46

+0

我不明白你的意思是'有时候有效'。我看到的行为是不变的,有或没有分配“显示”。唯一的区别是它使用'display:block;'来动画,而使用'display:none'则只会闪烁。我将用可能的解释编辑我的解决方案。 – 2015-03-31 00:15:52

+0

如果你使用它,你会看到有时它工作。我用setTimeout而不是requestAnimationFrame更新了一个例子。在我的电脑上,它在大多数情况下在Chrome中运行,并且在FF中不起作用 – 2015-03-31 13:26:27