让我们假装一个div是不透明度的动画:0;不透明度:1;我想保持不透明度:1;动画结束后
这就是动画填充模式:转发;确实.
@keyframes myAnimation { from { opacity:0; } to { opacity:1; } } div { opacity:0; animation-name:myAnimation; animation-delay:1s; animation-duration:2s; animation-fill-mode:forwards; } <div>just a test</div>
>注1:我没有包含供应商前缀来简化
>注2:这只是一个例子,请不要回答“只使用jQuery fadeIn函数”等
有些事情要知道
在this answer,我看到Chrome 16,Safari 4,Firefox 5支持动画填充模式.
但是动画独自is supported by Chrome 1和Opera也是.因此,即使不支持填充模式,Modernizr的一般测试也可能返回正.
要瞄准动画填充模式,我在Modernizr上添加了一个新的测试:
Modernizr.addTest('animation-fill-mode',function(){ return Modernizr.testAllProps('animationFillMode'); });
现在我有一个.no-animation-fill-mode类为CSS和Modernizr.animationFillMode为JavaScript.
我也从CSS3 animations specs读到:
an animation specified in the document style sheet will begin at the
document load
最后,这个问题
在动画结束的确切秒数下运行一个简单的jQuery函数是否可行
$(document).ready(function(){ if(!Modernizr.animation){ $('div').delay(1000).fadeIn(2000); }else if(!Modernizr.animationFillMode){ $('div').delay(3000).show(); } });
在CSS中:
.no-animation-fill-mode div { animation-iteration-count:1; } /* or just animation:myAnimation 2s 1s 1; for everyone */
还是有什么已知的polyfill特定于动画填充模式?
另外,如果我使用速记语法会发生什么
animation:myAnimation 2s 1s forwards;
在支持动画但不是动画填充模式的浏览器上?
非常感谢!
解决方法
在您的示例中,您可以通过定义最初的元素的结束状态,并使用链接的动画(如果在需要该动作之前有延迟),可以获得与animation-fill-mode相同的结果:forward
@keyframes waitandhide { from { opacity:0; } to { opacity:0; } } @keyframes show { from { opacity:0; } to { opacity:1; } } div { opacity:1; animation: waitandhide 2s 0s,show 2s 2s; } <div>just a test</div>
现在,较慢的浏览器可能会将您的初始元素状态闪烁,再次隐藏它们.但是根据我的经验,我只看到这些在很老的机器上,并且有大量的css渲染页面.
显然,上面这些会使你的css更多一些(因为你必须重复样式),而且在处理复杂的动画时会更复杂.然而:
>它应该适用于几乎任何动画情况.
>它将避免需要JavaScript(保存$().fadeIn fallback).
>它将适用于支持css动画的所有浏览器.
>您不会遇到JS / CSS变得不同步的风险.
关于使用短格式,最好不要如果你想要尽可能广泛的浏览器兼容性.然而,如我上面的例子所示,我选择使用短格式,因为它们更清晰,我可以理解不想长时间写(或阅读)长时间的版本.因此,我建议使用较少的生成您的css: