如何在 jquery 中中断动画?
How to break an animation in jquery?
我在列表项上制作了悬停效果。每当我将鼠标悬停在列表项上时,就会发生动画,这是使用 .animate()
完成的。当我将鼠标悬停在列表项之外时,悬停动画在到达其最终点之前不会被覆盖。
当我的光标离开列表项时,阻止列表项执行 hoverIn 效果并使其执行 hoverOut 效果的最佳方法是什么?
var hoverInOptions = {
'margin-left': '+=50px',
'font-size': '+=2px',
}
var hoverOutOptions = {
'margin-left': '-=50px',
'font-size': '-=2px'
};
$('#menu li').hover(
function() {
$(this).animate(hoverInOptions, 2000);
},
function() {
$(this).animate(hoverOutOptions, 200);
}
);
#menu li {
display: block;
width: 150px;
height: 24px;
background-color: #FF9933;
border: 1px solid #309;
padding: 10px;
margin: 4px 10px;
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="menu">
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
<li>Fifth item</li>
</ul>
您可以考虑 jQuery 的 stop()
。
Stop the currently-running animation on the matched elements.
.stop( [clearQueue ] [, jumpToEnd ] )
由于您的动画是相对于现有位置的(增加或减少边距),我使用 stop(true,true)
清除队列并跳转到当前动画的末尾。
var hoverInOptions = {
'margin-left': '+=50px',
'font-size': '+=2px',
}
var hoverOutOptions = {
'margin-left': '-=50px',
'font-size': '-=2px'
};
$('#menu li').hover(
function() {
$(this).stop(true,true).animate(hoverInOptions, 200);
},
function() {
$(this).stop(true,true).animate(hoverOutOptions, 200);
}
);
#menu li {
display: block;
width: 150px;
height: 24px;
background-color: #FF9933;
border: 1px solid #309;
padding: 10px;
margin: 4px 10px;
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="menu">
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
<li>Fifth item</li>
</ul>
但是,如果将动画更改为固定值,则可以避免跳到动画的末尾;下一个动画将从上一个动画停止的位置继续。
var hoverInOptions = {
'margin-left': '50px',
'font-size': '1.2em',
}
var hoverOutOptions = {
'margin-left': '10px',
'font-size': '1em'
};
$('#menu li').hover(
function() {
$(this).stop(true, false).animate(hoverInOptions, 200);
},
function() {
$(this).stop(true, false).animate(hoverOutOptions, 200);
}
);
#menu li {
display: block;
width: 150px;
height: 24px;
background-color: #FF9933;
border: 1px solid #309;
padding: 10px;
margin: 4px 10px;
cursor: pointer;
font-size: 1em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="menu">
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
<li>Fifth item</li>
</ul>
或者,您可以考虑 CSS transition
在没有 JavaScript 的情况下执行动画:
#menu li {
display: block;
width: 150px;
height: 24px;
background-color: #FF9933;
border: 1px solid #309;
padding: 10px;
margin: 4px 10px;
cursor: pointer;
font-size: 1em;
transition: margin .2s, font-size .2s;
}
#menu li:hover {
margin-left: 50px;
font-size: 1.2em;
}
<ul id="menu">
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
<li>Fifth item</li>
</ul>
我在列表项上制作了悬停效果。每当我将鼠标悬停在列表项上时,就会发生动画,这是使用 .animate()
完成的。当我将鼠标悬停在列表项之外时,悬停动画在到达其最终点之前不会被覆盖。
当我的光标离开列表项时,阻止列表项执行 hoverIn 效果并使其执行 hoverOut 效果的最佳方法是什么?
var hoverInOptions = {
'margin-left': '+=50px',
'font-size': '+=2px',
}
var hoverOutOptions = {
'margin-left': '-=50px',
'font-size': '-=2px'
};
$('#menu li').hover(
function() {
$(this).animate(hoverInOptions, 2000);
},
function() {
$(this).animate(hoverOutOptions, 200);
}
);
#menu li {
display: block;
width: 150px;
height: 24px;
background-color: #FF9933;
border: 1px solid #309;
padding: 10px;
margin: 4px 10px;
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="menu">
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
<li>Fifth item</li>
</ul>
您可以考虑 jQuery 的 stop()
。
Stop the currently-running animation on the matched elements.
.stop( [clearQueue ] [, jumpToEnd ] )
由于您的动画是相对于现有位置的(增加或减少边距),我使用 stop(true,true)
清除队列并跳转到当前动画的末尾。
var hoverInOptions = {
'margin-left': '+=50px',
'font-size': '+=2px',
}
var hoverOutOptions = {
'margin-left': '-=50px',
'font-size': '-=2px'
};
$('#menu li').hover(
function() {
$(this).stop(true,true).animate(hoverInOptions, 200);
},
function() {
$(this).stop(true,true).animate(hoverOutOptions, 200);
}
);
#menu li {
display: block;
width: 150px;
height: 24px;
background-color: #FF9933;
border: 1px solid #309;
padding: 10px;
margin: 4px 10px;
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="menu">
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
<li>Fifth item</li>
</ul>
但是,如果将动画更改为固定值,则可以避免跳到动画的末尾;下一个动画将从上一个动画停止的位置继续。
var hoverInOptions = {
'margin-left': '50px',
'font-size': '1.2em',
}
var hoverOutOptions = {
'margin-left': '10px',
'font-size': '1em'
};
$('#menu li').hover(
function() {
$(this).stop(true, false).animate(hoverInOptions, 200);
},
function() {
$(this).stop(true, false).animate(hoverOutOptions, 200);
}
);
#menu li {
display: block;
width: 150px;
height: 24px;
background-color: #FF9933;
border: 1px solid #309;
padding: 10px;
margin: 4px 10px;
cursor: pointer;
font-size: 1em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="menu">
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
<li>Fifth item</li>
</ul>
或者,您可以考虑 CSS transition
在没有 JavaScript 的情况下执行动画:
#menu li {
display: block;
width: 150px;
height: 24px;
background-color: #FF9933;
border: 1px solid #309;
padding: 10px;
margin: 4px 10px;
cursor: pointer;
font-size: 1em;
transition: margin .2s, font-size .2s;
}
#menu li:hover {
margin-left: 50px;
font-size: 1.2em;
}
<ul id="menu">
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
<li>Fifth item</li>
</ul>