Bootstrap下拉子菜单丢失


324

Bootstrap 3仍在RC中,但是我只是在尝试实现它。我不知道如何放置一个子菜单类。甚至CSS中没有类,甚至新文档也没有说什么

它在2.x中存在,类名称为dropdown-submenu


2
请记住,版本3中的某些组件已更改,包括菜单,导航和模式。
Deividi Cavarzan

11
BS3中缺少对此(imho)有用功能的本机支持是我尚未切换的主要原因之一。尽管我同意它在移动设备中没有用,并且他们现在采用了“移动优先”方法,但删除已实施的功能似乎是短视的,这在台式机上非常有用
Andrew Brown

4
同意删除期望的功能是短视的。这种重大变化给企业开发人员带来了糟糕的一天。
RJB

要进行下拉菜单,请使用css codepen.io/Gothburz/pen/GpJKqP
Gothburz 2015年

Answers:


555

更新于2018

dropdown-submenu自举3 RC已被删除。用Bootstrap作者Mark Otto的话来说。

“子菜单现在在网络上没有什么位置,特别是在移动网络上。它们将在3.0中删除。” -https://github.com/twbs/bootstrap/pull/6342

但是,仅需一点额外的CSS,您就能获得相同的功能。

Bootstrap 4(悬停时的导航栏子菜单)

.navbar-nav li:hover > ul.dropdown-menu {
    display: block;
}
.dropdown-submenu {
    position:relative;
}
.dropdown-submenu>.dropdown-menu {
    top:0;
    left:100%;
    margin-top:-6px;
}

Navbar子菜单下拉悬停
Navbar子菜单下拉悬停(右对齐)
Navbar子菜单下拉单击(右对齐)
Navbar下拉悬停(无子菜单)


引导程序3

这是使用3.0 RC 1的示例:http : //bootply.com/71520

这是使用Bootstrap 3.0.0(最终版)的示例:http : //bootply.com/86684

的CSS

.dropdown-submenu {
    position:relative;
}
.dropdown-submenu>.dropdown-menu {
    top:0;
    left:100%;
    margin-top:-6px;
    margin-left:-1px;
    -webkit-border-radius:0 6px 6px 6px;
    -moz-border-radius:0 6px 6px 6px;
    border-radius:0 6px 6px 6px;
}
.dropdown-submenu:hover>.dropdown-menu {
    display:block;
}
.dropdown-submenu>a:after {
    display:block;
    content:" ";
    float:right;
    width:0;
    height:0;
    border-color:transparent;
    border-style:solid;
    border-width:5px 0 5px 5px;
    border-left-color:#cccccc;
    margin-top:5px;
    margin-right:-10px;
}
.dropdown-submenu:hover>a:after {
    border-left-color:#ffffff;
}
.dropdown-submenu.pull-left {
    float:none;
}
.dropdown-submenu.pull-left>.dropdown-menu {
    left:-100%;
    margin-left:10px;
    -webkit-border-radius:6px 0 6px 6px;
    -moz-border-radius:6px 0 6px 6px;
    border-radius:6px 0 6px 6px;
}

样本标记

<div class="navbar navbar-default navbar-fixed-top" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">  
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
        </div>
        <div class="collapse navbar-collapse navbar-ex1-collapse">
            <ul class="nav navbar-nav">
                <li class="menu-item dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Drop Down<b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        <li class="menu-item dropdown dropdown-submenu">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Level 1</a>
                            <ul class="dropdown-menu">
                                <li class="menu-item ">
                                    <a href="#">Link 1</a>
                                </li>
                                <li class="menu-item dropdown dropdown-submenu">
                                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Level 2</a>
                                    <ul class="dropdown-menu">
                                        <li>
                                            <a href="#">Link 3</a>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
    </div>
</div>

PS-导航栏上的示例可调整左侧位置:http : //bootply.com/92442


5
是的,谢谢,我已将其添加到主题的样式表中,只是复制了旧版引导程序wordpress.org/themes/bikaner
DevC

8
例如bootply.com/86684,在css中添加以下行以显示子菜单时父菜单项的正确背景悬停: .dropdown-submenu:hover {background: #e2e1e1;}
Eduardo Moralles 2014年

1
同样适用于3.1.1。非常感谢您的解决方案。我在拍打墙壁,试图更改bootstrap.js文件以使其正常工作。
Joel Kinzel 2014年

2
我想尽一切可能简化事情,但是在大型网站上却需要这样做,而无法绕开多级导航(例如政府网站)。
特洛伊·邓普曼

1
子菜单甚至在我无法将鼠标移到它之前就消失了,因此悬停不起作用!它不会悬停,而是依靠单击,它可以正常运行。
Polv

61

@skelly解决方案很好,但由于悬停状态不起作用,因此在移动设备上不起作用。

我添加了一些JS来恢复BS 2.3.2的行为。

PS:它将与您到达的CSS一起使用:http//bootply.com/71520,尽管您可以评论以下部分:

CSS:

/*.dropdown-submenu:hover>.dropdown-menu{display:block;}*/

JS:

$('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) {
  // Avoid following the href location when clicking
  event.preventDefault();
  // Avoid having the menu to close when clicking
  event.stopPropagation();
  // If a menu is already open we close it
  $('ul.dropdown-menu [data-toggle=dropdown]').parent().removeClass('open');
  // opening the one you clicked on
  $(this).parent().addClass('open');
});

结果可以在我的WordPress主题(页面顶部)上找到:http : //shprinkone.julienrenaux.fr/


5
您是这篇文章中最聪明的人
user1143669 2014年

2
此解决方案不考虑要在桌面上保留悬停功能的问题,并且对于第二级子菜单也不起作用。为了使此功能适用于更多级别的子菜单,请将最后两行更改为以下行:$(this).closest(".dropdown-submenu").toggleClass("open");,这将打开/关闭链接菜单项。为了将鼠标悬停在桌面上,有必要检查浏览器的视口宽度,并且每个站点的视口宽度会有所不同。
edhedges,2015年

感谢您的代码。但是在手机中,您的代码有错误。
简丹

42

直到今天(2014年1月9日),Bootstrap 3仍不支持子菜单下拉菜单。

我在Google上搜索了响应式导航菜单,发现这是我最好的菜单。

这是智能菜单 http://www.smartmenus.org/

我希望这是任何想要导航菜单和多级子菜单的人的出路。

更新2015-02-17智能菜单现已完全支持子菜单的Bootstrap元素样式。有关更多信息,请访问智能菜单网站。


我在尝试使引导程序悬停在PC上并单击具有多个级别的平板电脑时遇到麻烦。你让我今天很开心!效果出色-使用与引导程序几乎相同的标记。谢谢!:)
嬉皮2014年

2
该解决方案是免费的,开源和做工非常精良自举3
帕特里克德信

5
惊人!简单!有关Bootstrap 3集成的特定详细信息,请参见此处:vadikom.github.io/smartmenus/src/demo/bootstrap-navbar.html
manafire 2014年

1
Smartmenus很不错,但是它仅适用于导航栏,不适用于简单的按钮下拉菜单。
Nikolai Prokoschenko 2014年

1
您保存了我的项目:-)
Sikander,2015年

5

Shprink的代码对我的帮助最大,但是为了避免出现下拉菜单,我将其更新为:

JS:

$('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) {
    // Avoid following the href location when clicking
    event.preventDefault(); 
    // Avoid having the menu to close when clicking
    event.stopPropagation(); 
    // If a menu is already open we close it
    $('ul.dropdown-menu [data-toggle=dropdown]').parent().removeClass('open');
    // opening the one you clicked on
    $(this).parent().addClass('open');

    var menu = $(this).parent().find("ul");
    var menupos = $(menu).offset();

    if (menupos.left + menu.width() > $(window).width()) {
        var newpos = -$(menu).width();
        menu.css({ left: newpos });    
    } else {
        var newpos = $(this).parent().width();
        menu.css({ left: newpos });
    }

});

CSS:从background-color:#eeeeee到background-color:#c5c5c5-白色字体和浅色背景看起来不太好。

.nav .open > a,
.nav .open > a:hover,
.nav .open > a:focus {
  background-color: #c5c5c5;
  border-color: #428bca;
}

我希望这能对我有所帮助!

但我希望Bootstrap尽快添加subs功能。


4

评论Skelly真正有用的解决方法:在Bootstrap-sass 3.3.6中,utilities.scss,第19行:.pull-lefthas float:left !important。从那以后,我建议在他的CSS中也使用!important:

.dropdown-submenu.pull-left {
    float:none !important;
}

2

我几天前碰到了这个问题。我尝试了许多解决方案,但最终没有一个真正有用的解决方案,最终我创建了Bootstrap下拉代码的扩展/覆盖。它是原始代码的副本,但对closeMenus函数进行了更改。

我认为这是一个很好的解决方案,因为它不会影响bootstrap js的核心类。

您可以在gihub上查看它:https : //github.com/djokodonev/bootstrap-multilevel-dropdown


这是用于多级下拉菜单的非常好的解决方案,我喜欢使用它。
huncyrus

我很高兴您喜欢它:-)
George Donev

-2

我为下拉菜单提出了另一种解决方案。希望对您有所帮助。只需添加此js脚本

<script type="text/javascript"> jQuery("document").ready(function() {
  jQuery("ul.dropdown-menu > .dropdown.parent").click(function(e) {
    e.preventDefault();
    e.stopPropagation();
    if (jQuery(this).hasClass('open2'))
      jQuery(this).removeClass('open2');
    else {
      jQuery(this).addClass('open2');
    }

  });
}); < /script>

<style type="text/css">.open2{display:block; position:relative;}</style>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.