【问题标题】:Animating vertical Menu with jQuery is not working properly使用 jQuery 动画垂直菜单无法正常工作
【发布时间】:2015-12-14 15:21:12
【问题描述】:

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

如果您对我在这里做错了什么让这种情况发生有任何线索(或者您对我应该改变什么有任何建议),请告诉我。

谢谢!

【问题讨论】:

  • 有点不清楚你在问什么。您是否尝试过在.animate() 之前添加.stop() 以确保动画不会以不需要的方式排队?我发现它解决了大多数与动画队列相关的问题(这听起来像,但不是 100% 确定)
  • @blgt,它在 .animate() 之前与 .stop() 配合使用效果很好。将其发布为答案,我会将其标记为正确答案。谢谢

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


【解决方案1】:

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

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

这可以更精细地控制动画时间。我发现它解决了大多数与动画队列相关的问题

参考。 https://api.jquery.com/stop/

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      经过编辑,转出的时间是转入的两倍。

      【讨论】:

      • 请注意,动画时间在展开和未展开时有所不同。
      • 这应该可以做到,所以它需要 0.5 秒来过渡,1 秒来过渡,就像在你的 js 中一样。 JSFiddle 也更新了。
      猜你喜欢
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多