我正在尝试做一个简单的动画.
>你展示div.它动画正确.
>你隐藏div.正确.
>你再次展示div.它显示但没有动画.当你第一次打断它时,它会被卡住.
所以在[add | remove]类中发生的插值CSS不知何故被卡在那里.第二次,[add | remove]类实际上正在运行,但是它从类中设置的css被忽略了(我认为被黯然失色).如何在不使用.animate和硬编码样式值的情况下解决这个问题?重点是将动画终点放在css类中.
谢谢!
<!doctype html>
<style type="text/css">
div {
width: 400px;
height: 200px;
}
.green {
background-color: green;
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
$('#show').bind({
click: function() {
showAndRun()
}
})
$('#hide').bind({
click: function() {
$('div').stop(true, false).fadeOut('slow')
}
})
function showAndRun() {
function pulse() {
$('div').removeClass('green', 2000, function() {
$(this).addClass('green', 2000, pulse)
})
}
$('div').stop(true, false).hide().addClass('green').fadeIn('slow', pulse)
}
})
</script>
<input id="show" type="button" value="show" /><input id="hide" type="button" value="hide" />
<div style="display: none;"></div>
你也可以看看它做了什么here at jsbin
最佳答案 我找到了解决方案.不过不确定我是否对此感到满意.单击show时,它实际上是CSS的非常糟糕的“重置”
动画永远循环.所以我不能依赖jQuery队列(有限长度).我必须通过回调实现循环,如代码所示.导致的问题:你不能.stop(true,true).第一个true清除队列,但在当前正在运行的动画之后队列中没有任何内容.所以这没用.第二个true跳转到队列中的最后一个动画.再无用,因为我们实际上将继续留在循环的一件事上.第二个arg必须是false才能中断,否则就是无限循环.
中断的问题.它将css留在原处.你现在已经陷入了随机css道具,无论你的动画插入的是什么(在我的例子中是背景颜色).我也希望中断是即时的.所以别无他法.
在我的例子中,动画期间的背景颜色是在element.style上设置的(通过浏览器工具中的检查发现),它会覆盖正在发生的任何其他事情.直到第一个动画开始运行,这个道具才存在.然后它被打断了,假定的临时风格卡在那里(我猜).
所以你再次运行动画.绿色课程已应用. jQuery计算出要进行的颜色范围.原来它从#shadeofgreen到#thesameshadeofgreen,因为卡住的element.styles值会覆盖类提供的任何内容.因此动画在两种相同颜色之间滑动.它正在运行!但是没有颜色可以改变.
所以在我的情况下修复并不可怕,但我仍然不确定我喜欢它,因为我不确定它是否可以轻松应用于各种情况.
更改
$('div').stop(true, false).hide().addClass('green').fadeIn('slow', pulse)
至
$('div').stop(true, false).removeAttr('style').hide().addClass('green').fadeIn('slow', pulse)
关键是
.removeAttr('style').hide().addClass('green')
这基本上是你的css重置.保证在您需要时始终在那里,因为它恰好在事物再次显示之前发生.
请注意,将!important放在绿色css类中的颜色上是行不通的,因为(似乎)将覆盖element.styles(jQuery动画使用的),并且您将无法获得所需的结果.
当然,我仍然愿意接受建议.我可能错过了一些东西,因为我只是在本周最开始看CSS和jQuery.
您可以在固定代码here on jsbin中看到.removeAttr(‘style’)的效果.