请参阅演示:jsFiddle
1。什么可能导致这种滞后?如何防止它?
2。有没有更好的方法来编码这个动画序列,这可能会阻止任何滞后?
HTML :
<div id="newResFormWrap">
<form id="newResForm" action="" method="post" name="newRes">
<div id="newResFormCont">
<h3>title</h3>
<p>form!</p>
<div class="button" id="cancelNewRes">Cancel</div>
</div>
</form>
</div>
<div class="button" id="addRes">show</div>
jQuery的:
$("#newResForm").css({opacity: 0});
$("#addRes").click(function () {
toggleNewRes()
});
$("#cancelNewRes").click(function () {
toggleNewRes()
});
//toggleNewRes
function toggleNewRes() {
if ($("#newResFormWrap").css('display') == "none") {//if hidden
$("#addRes").animate({ opacity: 0 }, 'fast', function() {
$("#newResFormWrap").toggle('fast', function (){
$("#newResForm").animate({ opacity: 100 },2000);
});
});
} else { //if visible
$("#newResForm").animate({ opacity: 0 }, 100,function() {
$("#newResFormWrap").toggle('fast', function (){
$("#addRes").animate({ opacity: 100 });
});
});
}
}
答案 0 :(得分:25)
确保在使用stop()
开始新动画时清除队列:
$("#newResForm").stop().animate({ opacity: 0 }, 100,function() {
$("#newResFormWrap").toggle('fast', function (){
$("#addRes").animate({ opacity: 100 });
// ...
造成延迟的原因是你的长2秒动画$("#newResForm").animate({ opacity: 100 },2000)
尚未完成。 JQuery默认将动画放入队列,等待一个队列在下一个开始之前完成。您使用stop()
清除队列,如果您有两个相互矛盾的动画(如打开和关闭动画,或鼠标悬停/鼠标移动动画),这将特别有用。实际上,您可能会发现使用stop()
开始所有动画链是一个好习惯,除非您知道您希望它们与之前在其他地方发生的动画一起排队。
进入更高级的主题,您甚至可以命名不同的队列,例如,为了stop()
,您的悬停动画和展开/折叠动画会被单独处理。有关更多详细信息,请参阅http://api.jquery.com/animate/处的queue
选项(如果给出字符串)。
答案 1 :(得分:1)
在动画调用之前添加.stop()
:
function toggleNewRes() {
if ($("#newResFormWrap").css('display') == "none") {//if hidden
$("#addRes").stop().animate({ opacity: 0 }, 'fast', function() {
/...
});
} else { //if visible
$("#newResForm").stop().animate({ opacity: 0 }, 100,function() {
/...
});
}
}
答案 2 :(得分:1)
尝试使用stop()
:
if ($("#newResFormWrap").is(':visible')) {//this way is eaiser to check
$("#addRes").stop(true,false).animate({ opacity: 0 }, 'fast', function() {
$("#newResFormWrap").toggle('fast', function (){
$("#newResForm").animate({ opacity: 100 },2000);
});
});
}
答案 3 :(得分:1)
一些事情。首先查看此JSFiddle以查看其实际效果。
你遇到的问题是你的动画淡入需要2秒钟。因此,当您在2秒内关闭它时会遇到延迟。
我重新校准了你的时间,以确保没有延迟。看看你是否喜欢它们并随意改变它们。
if ($("#newResFormWrap").css('display') == "none") {//if hidden
$("#addRes").animate({ opacity: 0 }, 'fast', function() {
$("#newResFormWrap").toggle(0, function (){
$("#newResForm").animate({ opacity: 100 },400);
});
});
} else { //if visible
console.log('click');
$("#newResForm").animate({ opacity: 0 }, 0, function() {
console.log('animated');
$("#newResFormWrap").toggle(0)
});
$("#addRes").animate({ opacity: 100 }, 'fast');
}