使用 jQuery 动画垂直菜单无法正常工作
Animating vertical Menu with jQuery is not working properly
基本上,我有一个 <nav>
元素应该在 mouseover
上从左向右扩展,但有时如果你快速将指针放在元素上然后从元素上移开,它会起作用没有动画,那不应该发生。
这里是 HTML 代码:
$('#navigation').hover(function() {
$(this).animate({
left: 190
}, {
duration: 500
});
}, function() {
$(this).animate({
left: 0
}, {
duration: 1000,
queue: false
});
});
nav.menu-nav {
margin-left: -190px;
width: 200px;
height: 100%;
position: fixed;
background-color: #edf0f3;
border-right: 1px solid #f7f8fa;
}
.menu-nav h1 {
width: 100%;
position: relative;
text-align: center;
margin: 0;
padding: 0;
font-family: 'Lobster', cursive;
}
.menu-nav ul {
width: 100%;
margin-top: 30px;
list-style-type: none;
}
.menu-nav li {
cursor: pointer;
height: 40px;
position: static;
margin: 20px 0 -20px -50px;
padding-left: 80px;
transition: 1s background-color;
}
.menu-nav li:hover {
background-color: #a5b3c3;
}
.menu-nav a {
color: #000000;
text-decoration: none;
}
button.account {
position: fixed;
bottom: 20px;
}
.acc-register {
margin-left: 5px;
}
.acc-login {
margin-left: 105px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Lobster" rel="stylsheet" type="text/css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.css" rel="stylesheet" type="text/css">
<nav class="menu-nav" id="navigation">
<h1>
mipagina
</h1>
<ul>
<li><a href="#">Inicio</a></li>
<li><a href="#">Nosotros</a></li>
<li><a href="#">Contacto</a></li>
</ul>
<button class="account acc-register btn btn-primary">
<i class="fa fa-user-plus"></i> Register
</button>
<button class="account acc-login btn btn-default">
<i class="fa fa-sign-in"></i> Login
</button>
</nav>
<div class="contenido">
<p>
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas
sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate
velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
</p>
</div>
如果您对我在这里做错了什么有任何线索(或者您对我应该更改的内容有任何建议)请告诉我。
谢谢!
为此尝试使用 CSS 而不是 jQuery:
nav.menu-nav {
margin-left: -190px;
width: 200px;
height: 100%;
position: fixed;
background-color: #edf0f3;
border-right: 1px solid #f7f8fa;
-webkit-transition: -webkit-transform 1s;
transition: transform 1s;
}
nav.menu-nav:hover{
-ms-transform: translateX(190px); /* IE 9 */
-webkit-transform: translateX(190px); /* Chrome, Safari, Opera */
transform: translateX(190px) ;
-webkit-transition: -webkit-transform 0.5s;
transition: transform 0.5s;
}
经过编辑使转出时间是转入时间的两倍。
事件 "hover" 的问题。为了解决这个问题,我建议你在0.3秒后关闭你的菜单。
示例:
// Close dropdown list after 0.3sec
var timeoutId;
jQuery("#menu").hover(function() {
if (timeoutId) {
window.clearTimeout(timeoutId);
timeoutId = null;
}
else {
jQuery(this).addClass('opened');
}
}, function () {
if (!timeoutId) {
timeoutId = window.setTimeout(function() {
timeoutId = null;
jQuery("#menu").removeClass('opened');
}, 300);
}
});
根据评论中的建议,您可以在 .animate()
之前使用 .stop()
在开始新动画之前清除动画队列:
$('#navigation').hover(function() {
$(this).stop().animate({
left: 190
}, {
duration: 500
});
}, function() {
$(this).stop().animate({
left: 0
}, {
duration: 1000,
queue: false
});
});
这样可以更精细地控制动画时间。我发现它解决了大多数与动画队列相关的问题
基本上,我有一个 <nav>
元素应该在 mouseover
上从左向右扩展,但有时如果你快速将指针放在元素上然后从元素上移开,它会起作用没有动画,那不应该发生。
这里是 HTML 代码:
$('#navigation').hover(function() {
$(this).animate({
left: 190
}, {
duration: 500
});
}, function() {
$(this).animate({
left: 0
}, {
duration: 1000,
queue: false
});
});
nav.menu-nav {
margin-left: -190px;
width: 200px;
height: 100%;
position: fixed;
background-color: #edf0f3;
border-right: 1px solid #f7f8fa;
}
.menu-nav h1 {
width: 100%;
position: relative;
text-align: center;
margin: 0;
padding: 0;
font-family: 'Lobster', cursive;
}
.menu-nav ul {
width: 100%;
margin-top: 30px;
list-style-type: none;
}
.menu-nav li {
cursor: pointer;
height: 40px;
position: static;
margin: 20px 0 -20px -50px;
padding-left: 80px;
transition: 1s background-color;
}
.menu-nav li:hover {
background-color: #a5b3c3;
}
.menu-nav a {
color: #000000;
text-decoration: none;
}
button.account {
position: fixed;
bottom: 20px;
}
.acc-register {
margin-left: 5px;
}
.acc-login {
margin-left: 105px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Lobster" rel="stylsheet" type="text/css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.css" rel="stylesheet" type="text/css">
<nav class="menu-nav" id="navigation">
<h1>
mipagina
</h1>
<ul>
<li><a href="#">Inicio</a></li>
<li><a href="#">Nosotros</a></li>
<li><a href="#">Contacto</a></li>
</ul>
<button class="account acc-register btn btn-primary">
<i class="fa fa-user-plus"></i> Register
</button>
<button class="account acc-login btn btn-default">
<i class="fa fa-sign-in"></i> Login
</button>
</nav>
<div class="contenido">
<p>
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas
sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora
incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate
velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
</p>
</div>
如果您对我在这里做错了什么有任何线索(或者您对我应该更改的内容有任何建议)请告诉我。
谢谢!
为此尝试使用 CSS 而不是 jQuery:
nav.menu-nav {
margin-left: -190px;
width: 200px;
height: 100%;
position: fixed;
background-color: #edf0f3;
border-right: 1px solid #f7f8fa;
-webkit-transition: -webkit-transform 1s;
transition: transform 1s;
}
nav.menu-nav:hover{
-ms-transform: translateX(190px); /* IE 9 */
-webkit-transform: translateX(190px); /* Chrome, Safari, Opera */
transform: translateX(190px) ;
-webkit-transition: -webkit-transform 0.5s;
transition: transform 0.5s;
}
经过编辑使转出时间是转入时间的两倍。
事件 "hover" 的问题。为了解决这个问题,我建议你在0.3秒后关闭你的菜单。
示例:
// Close dropdown list after 0.3sec
var timeoutId;
jQuery("#menu").hover(function() {
if (timeoutId) {
window.clearTimeout(timeoutId);
timeoutId = null;
}
else {
jQuery(this).addClass('opened');
}
}, function () {
if (!timeoutId) {
timeoutId = window.setTimeout(function() {
timeoutId = null;
jQuery("#menu").removeClass('opened');
}, 300);
}
});
根据评论中的建议,您可以在 .animate()
之前使用 .stop()
在开始新动画之前清除动画队列:
$('#navigation').hover(function() {
$(this).stop().animate({
left: 190
}, {
duration: 500
});
}, function() {
$(this).stop().animate({
left: 0
}, {
duration: 1000,
queue: false
});
});
这样可以更精细地控制动画时间。我发现它解决了大多数与动画队列相关的问题