向 bootstrap 下拉菜单添加滑动效果

IT技术 javascript drop-down-menu twitter-bootstrap
2021-01-16 05:55:53

我正在使用bootstrap,我想将动画添加到下拉列表中。我想给它添加一个动画,离开时向下滑动并返回。我怎么能这样做?

我尝试过的事情:

像这样更改 Js 下拉文件:

如何让 Bootstrap 的导航下拉菜单平滑地上下滑动?

6个回答

如果您更新到 Bootstrap 3 (BS3),它们会公开许多 Javascript 事件,这些事件可以很好地将您想要的功能绑定到其中。在 BS3 中,此代码将为您的所有下拉菜单提供您正在寻找的动画效果:

  // Add slideDown animation to Bootstrap dropdown when expanding.
  $('.dropdown').on('show.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideDown();
  });

  // Add slideUp animation to Bootstrap dropdown when collapsing.
  $('.dropdown').on('hide.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideUp();
  });

你可以阅读有关BS3的事件在这里,特别对下拉事件在这里

我也看到了这个问题,我实际上创建了另一个线程专门询问它...... stackoverflow.com/questions/26267207/ ......但我不知道如何解决它。我觉得 Dropdown 类在处理hidden.bs.dropdown事件之前不会等待转换完成
2021-03-15 05:55:53
我无法让它发挥作用。我不断收到以下错误:“Uncaught TypeError: $(...).find(...).first(...).stop is not a function”。我不明白 .stop() 如何不是函数,除非在触发事件时动画还没有开始?我错过了什么?
2021-03-19 05:55:53
我对此的 slideUp 部分有问题。在折叠模式 (Chrome) 下,下拉菜单的宽度恢复为全屏查看时的宽度。使用 FF 时,它会向下滑动,但会隐藏而不是向上滑动。
2021-03-29 05:55:53
这有效并满足我的要求,但在移动视口上,子菜单的下拉菜单消失得很快并且看起来很不稳定 - 不过感谢分享!
2021-04-05 05:55:53
有关移动修复,请参阅 Slipoch 的进一步回答。
2021-04-13 05:55:53

也可以避免使用 JavaScript 来实现下拉效果,并使用 CSS3 过渡,通过将以下一小段代码添加到您的样式中:

.dropdown .dropdown-menu {
    -webkit-transition: all 0.3s;
    -moz-transition: all 0.3s;
    -ms-transition: all 0.3s;
    -o-transition: all 0.3s;
    transition: all 0.3s;

    max-height: 0;
    display: block;
    overflow: hidden;
    opacity: 0;
}

.dropdown.open .dropdown-menu { /* For Bootstrap 4, use .dropdown.show instead of .dropdown.open */
    max-height: 300px;
    opacity: 1;
}

这种方式的唯一问题是您应该手动指定 max-height。如果你设置一个非常大的值,你的动画就会非常快。

如果您知道下拉列表的大致高度,它就像一个魅力,否则您仍然可以使用 javascript 来设置精确的 max-height 值。

这是小例子:DEMO


此解决方案中存在带有填充的小错误,请查看 Jacob Stamm 对解决方案的评论。

还可以添加pointer-events:none到折叠版本,然后添加point-events: all到菜单中.show
2021-03-18 05:55:53
我喜欢这个,但不幸的是,向下滑动的动画只能工作一次。如果我关闭菜单并在没有页面刷新的情况下再次打开它,它会立即打开。还有其他人遇到这个问题吗?
2021-03-23 05:55:53
感谢您指出那个错误,雅各布。看起来这是列表中的填充问题。如果您不介意,我会添加您的解决方案来回答。
2021-03-25 05:55:53
很好的解决方案。不幸的是,有一个小错误。下拉菜单中的第一项仍然可点击,即使它已折叠。您可以通过将鼠标悬停在折叠的下拉菜单下方来判断。在这种情况下没什么大不了的,因为您的第一个选项是纯文本。然而,当它是一个链接时,这是一个问题。我的解决方案是“动画”可见性,但在其他东西完成动画后延迟发生。检查一下:jsfiddle.net/stamminator/kjLe1tfs/1
2021-03-29 05:55:53
很好的解决方案,欣赏。
2021-04-08 05:55:53

我正在做类似的事情,但在悬停而不是点击..这是我正在使用的代码,您可以稍微调整一下以使其在点击时工作

$('.navbar .dropdown').hover(function() {
  $(this).find('.dropdown-menu').first().stop(true, true).delay(250).slideDown();
}, function() {
  $(this).find('.dropdown-menu').first().stop(true, true).delay(100).slideUp()
});
好一个!谢谢。
2021-03-15 05:55:53
我上面发布的代码是鼠标悬停而不是点击。
2021-03-20 05:55:53
这很好用!但是有什么方法可以在鼠标悬停而不是单击时使用它?
2021-03-23 05:55:53
不为我工作。我在<script>标签下添加了这个,但什么也没发生
2021-03-27 05:55:53

我不知道我是否可以撞到这个线程,但我想出了一个快速修复开放类删除太快时发生的视觉错误的方法。基本上,所有要做的就是在 slideUp 事件中添加一个 OnComplete 函数并重置所有活动的类和属性。是这样的:

结果如下:Bootply 示例

Javascript/Jquery:

$(function(){
    // ADD SLIDEDOWN ANIMATION TO DROPDOWN //
    $('.dropdown').on('show.bs.dropdown', function(e){
        $(this).find('.dropdown-menu').first().stop(true, true).slideDown();
    });

    // ADD SLIDEUP ANIMATION TO DROPDOWN //
    $('.dropdown').on('hide.bs.dropdown', function(e){
        e.preventDefault();
        $(this).find('.dropdown-menu').first().stop(true, true).slideUp(400, function(){
            //On Complete, we reset all active dropdown classes and attributes
            //This fixes the visual bug associated with the open class being removed too fast
            $('.dropdown').removeClass('show');
            $('.dropdown-menu').removeClass('show');
            $('.dropdown').find('.dropdown-toggle').attr('aria-expanded','false');
        });
    });
});
@DOTang 是的,我想它并不完美,因此快速修复,我想稍微重构会使其更好。希望到 Bootstrap4 出来的时候,他们已经修复了
2021-03-23 05:55:53
在您连续单击几个菜单后,演示中有一个菜单卡在打开状态。
2021-03-31 05:55:53

这是我的幻灯片和淡入淡出效果的解决方案:

   // Add slideup & fadein animation to dropdown
   $('.dropdown').on('show.bs.dropdown', function(e){
      var $dropdown = $(this).find('.dropdown-menu');
      var orig_margin_top = parseInt($dropdown.css('margin-top'));
      $dropdown.css({'margin-top': (orig_margin_top + 10) + 'px', opacity: 0}).animate({'margin-top': orig_margin_top + 'px', opacity: 1}, 300, function(){
         $(this).css({'margin-top':''});
      });
   });
   // Add slidedown & fadeout animation to dropdown
   $('.dropdown').on('hide.bs.dropdown', function(e){
      var $dropdown = $(this).find('.dropdown-menu');
      var orig_margin_top = parseInt($dropdown.css('margin-top'));
      $dropdown.css({'margin-top': orig_margin_top + 'px', opacity: 1, display: 'block'}).animate({'margin-top': (orig_margin_top + 10) + 'px', opacity: 0}, 300, function(){
         $(this).css({'margin-top':'', display:''});
      });
   });
这是为了在动画完成后删除 margin-top 参数,以防下拉菜单在自定义样式中添加了一些边距(就像在我的主题中一样)。它必须在没有它的情况下工作,因为它会为 orig_margin_top 返回动画,但不要留下额外的内容会更干净动画完成后的内联样式。
2021-03-18 05:55:53
谢谢。您的代码运行良好。但是我不太明白为什么我们需要$(this).css({'margin-top':''});@Vedmant
2021-03-21 05:55:53