【问题标题】:Sliding Drop Down Menu滑动下拉菜单
【发布时间】:2015-09-08 02:02:35
【问题描述】:

我有一个下拉菜单,我想在单击菜单按钮时向下滑动,在再次单击时向上滑动。单击文档中的任何其他位置时也会向上滑动。

这是我目前得到的:jsfiddle

HTML:

<nav>
  <a class="dropdown-toggle" href="#" title="Menu">Menu</a>
  <ul class="dropdown">
    <li><a href="#">Menu Item</a></li>
    <li><a href="#">Menu</a></li>
    <li><a href="#">Settings</a></li>
    <li><a href="#">Search</a></li>
  </ul>
</nav>

jquery:

$(function() {
  // Dropdown toggle
  $('.dropdown-toggle').click(function() {
    $(this).next('.dropdown').toggle(function() {
      $('.dropdown').stop().animate({
        top: '100%'
      }, 'slow');
    });
  });

  $(document).click(function(e) {
    var target = e.target;
    if (!$(target).is('.dropdown-toggle') && !$(target).parents().is('.dropdown-toggle')) {
      $('.dropdown').toggle(function() {
      $('.dropdown').stop().animate({
        top: '-100px'
      }, 'slow');
    });
    }
  });
});

我所做的问题是动画只发生一次,并且仅在单击打开下拉菜单时发生。

【问题讨论】:

    标签: javascript jquery drop-down-menu jquery-animate slidedown


    【解决方案1】:

    我不确定你是否知道,但 jQuery 中有 .slideUp().slideDown().slideToggle() 方法可用做这个上下滑动的动画业务。

    下面是sn-p供大家参考:

    var dropdownToggle = $('.dropdown-toggle');
    var dropdown = dropdownToggle.next('.dropdown');
    $(function() {
      dropdown.slideUp(0);
      $(document).on('click', function(e) {
        var target = e.target;
        if (!$(target).is('.dropdown-toggle') && !$(target).parents().is('.dropdown-toggle')) {
          if (dropdown.is(':visible')) {
            dropdown.stop(true).slideUp();
          }
        }
      });
      dropdownToggle.on('click', function() {
        dropdown.stop(true).slideToggle();
      });
    });
    body { padding: 2em; }
    a {
      text-decoration: none;
      color: #000;
    }
    nav { position: relative; }
    .dropdown-toggle {
      padding: .5em 1em;
      background: #777;
      border-radius: .2em .2em 0 0;
    }
    ul.dropdown {
      position: absolute;
      top: 100%;
      margin-top: .5em;
      background: #777;
      min-width: 12em;
      padding: 0;
      border-radius: 0 0 .2em .2em;
    }
    ul.dropdown li { list-style-type: none; }
    ul.dropdown a {
      text-decoration: none;
      padding: .5em 1em;
      display: block;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
    <nav><a class="dropdown-toggle" href="#" title="Menu">Menu</a>
      <ul class="dropdown">
        <li><a href="#">Menu Item</a></li>
        <li><a href="#">Menu</a></li>
        <li><a href="#">Settings</a></li>
        <li><a href="#">Search</a></li>
      </ul>
    </nav>

    注意事项:

    • 您在同一元素上应用了 CSS transition,并且您还尝试通过使用 jQuery 的 .animate() 方法在同一元素上应用动画。两者互相冲突。我已删除 CSS transition 部分。
    • 我还删除了height: 0 部分,您会注意到那里有一个dropdown.slideUp(0) 队列,它基本上应用了0 持续时间的.slideUp() 动画来立即在元素上设置height: 0

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答,但我不想使用.slideUp,因为文本并没有真正向下滑动。正如您在此处看到的:link 选项卡文本也会向下滑动。
    • 所以您不希望滑下效果而希望它们简单地淡入?你的尝试让我知道。
    • 您有机会看到链接中的示例吗? Example。我确实希望它向下滑动,但使用 SlideUp 时,文本不会从菜单按钮后面向下滑动。
    • 在那个例子中,我是否应该向下滚动一点,这样我才能看到Menu 按钮在起作用。单击该按钮后,outfitsshopping 等选项会向下滑动。但它们位于整个带有徽标的标题栏的后面。很抱歉,我很难理解你到底在追求什么。
    【解决方案2】:

    为感兴趣的人回答我自己的问题,代码如下:

    $(function() {
      $('.dropdown').hide();
      $('.dropdown-toggle').click(function(e) {
        $('.dropdown').slideToggle(400);
        $('.dropdown-toggle').slideDown('active');
        $('.dropdown').toggleClass('is-active');
        return false;
      });
      $(document).click(function() {
        if ($('.dropdown').is(':visible')) {
          $('.dropdown', this).slideUp();
          $('.dropdown').removeClass('is-active');
        }
      });
    });
    body {
      padding: 2em;
    }
    a {
      text-decoration: none;
      color: #000;
    }
    nav {
      position: relative;
    }
    .dropdown-toggle {
      padding: .5em 1em;
      background: #777;
      border-radius: .2em .2em 0 0;
    }
    .dropdown {
      position: absolute;
      margin-top: .5em;
      background: #777;
      min-width: 12em;
      padding: 0;
      top: 0;
      left: 0;
      -webkit-transform: translateY(-60px);
      -ms-transform: translateY(-60px);
      transform: translateY(-60px);
      transition: transform .3s
    }
    .dropdown.is-active {
      -webkit-transform: translateY(30px);
      -ms-transform: translateY(30px);
      transform: translateY(30px);
      display: block
    }
    ul.dropdown li {
      list-style-type: none;
    }
    ul.dropdown a {
      text-decoration: none;
      padding: .5em 1em;
      display: block;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <nav><a class="dropdown-toggle" href="#" title="Menu">Menu</a>
      <ul class="dropdown">
        <li><a href="#">Menu Item</a>
        </li>
        <li><a href="#">Menu</a>
        </li>
        <li><a href="#">Settings</a>
        </li>
        <li><a href="#">Search</a>
        </li>
      </ul>
    </nav>

    我用toggleClassremoveClass添加了我想要的动画,这就是翻译(最初的想法来自Slide and Push Menu tutorial):

     -webkit-transform: translateY(-60px);
     -ms-transform: translateY(-60px);
     transform: translateY(-60px);
     transition: transform .3s
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 2017-08-03
      • 2023-04-08
      • 2020-06-21
      • 1970-01-01
      相关资源
      最近更新 更多