使用jQuery动画垂直菜单无法正常工作

时间:2015-12-14 15:21:12

标签: jquery html css twitter-bootstrap jquery-animate

基本上,我有一个<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>

如果你有任何关于我在这里做错的线索让这件事发生(或者你对我应该改变什么有任何建议)请告诉我。

谢谢!

3 个答案:

答案 0 :(得分:0)

尝试使用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;
}

JSFiddle

编辑过渡的时间是过渡时间的两倍。

答案 1 :(得分:0)

事件“悬停”的问题。为了解决这个问题,我建议你只在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);
      }
    });

答案 2 :(得分:0)

根据评论中的建议,您可以在.stop()之前使用.animate()在开始新动画之前清除动画队列:

$('#navigation').hover(function() {
  $(this).stop().animate({
    left: 190
  }, {
    duration: 500
  });
}, function() {
  $(this).stop().animate({
    left: 0
  }, {
    duration: 1000,
    queue: false
  });
});

这为动画计时提供了更细粒度的控制。我发现它解决了大多数与动画队列相关的问题

REF。 https://api.jquery.com/stop/