Twitter Bootstrap Многоуровневое выпадающее меню

84

Возможно ли иметь выпадающее меню с несколькими уровнями, используя элементы twitter bootstrap 2? В оригинальной версии эта функция отсутствует.

  • 0
    на самом деле искал реализацию, но мне не повезло с этим.
  • 0
    Может быть, вам нужно меню suckerfish? htmldog.com/articles/suckerfish/dropdowns
Показать ещё 1 комментарий

6 ответов

106
Лучший ответ

Обновленный ответ

* Обновленный ответ, который поддерживает таблицу стилей версии версии v2.1.1 ** bootstrap.

** Но будьте осторожны, потому что это решение было удалено из v3

Просто хочу отметить, что это решение больше не требуется, поскольку последний загрузочный файл теперь поддерживает по умолчанию многоуровневые выпадающие списки. Вы все еще можете использовать его, если находитесь в более ранних версиях, но для тех, кто обновился до последней версии (v2.1.1 на момент написания), он больше не нужен. Вот скрипка с обновленным по умолчанию многоуровневым раскрывающимся списком прямо из документации:

http://jsfiddle.net/2Smgv/2858/


Оригинальный ответ

Были затронуты некоторые проблемы, связанные с поддержкой подменю в github, и обычно они закрываются разработчиками bootstrap, такими как этот, поэтому Я думаю, разработчикам, использующим загрузочный блок, нужно что-то сделать. Вот демонстрация, которую я собрал, показывая вам, как вы можете взломать рабочее подменю.

Соответствующий код

CSS

.dropdown-menu .sub-menu {
    left: 100%;
    position: absolute;
    top: 0;
    visibility: hidden;
    margin-top: -1px;
}

.dropdown-menu li:hover .sub-menu {
    visibility: visible;
    display: block;
}

.navbar .sub-menu:before {
    border-bottom: 7px solid transparent;
    border-left: none;
    border-right: 7px solid rgba(0, 0, 0, 0.2);
    border-top: 7px solid transparent;
    left: -7px;
    top: 10px;
}
.navbar .sub-menu:after {
    border-top: 6px solid transparent;
    border-left: none;
    border-right: 6px solid #fff;
    border-bottom: 6px solid transparent;
    left: 10px;
    top: 11px;
    left: -6px;
}

Создал свой собственный класс .sub-menu для применения к раскрывающимся меню с двумя уровнями, таким образом мы можем разместить их рядом с нашими пунктами меню. Также измените стрелку, чтобы отобразить ее слева от группы подменю.

Демо

  • 2
    Начиная с Bootstrap 2.0.4, вы также должны иметь объявление "display: block;" в селекторе ".dropdown-menu li: hover .sub-menu".
  • 0
    Я пытался это реализовать, первое подменю работает нормально. Но если я добавлю другое подменю в том же меню, то все пойдет не так. Почему-то открывается первое подменю вместо второго. Любые идеи или подсказки будут приветствоваться. Уже спасибо :)
Показать ещё 10 комментариев
33

[Twitter Bootstrap v3]

Чтобы создать раскрывающееся меню n-level (сенсорное устройство, дружественное) в Twitter Bootstrap v3,

CSS

.dropdown-menu>li /* To prevent selection of text */
{   position:relative;
    -webkit-user-select: none; /* Chrome/Safari */        
    -moz-user-select: none; /* Firefox */
    -ms-user-select: none; /* IE10+ */
    /* Rules below not implemented in browsers yet */
    -o-user-select: none;
    user-select: none;
    cursor:pointer;
}
.dropdown-menu .sub-menu 
{
    left: 100%;
    position: absolute;
    top: 0;
    display:none;
    margin-top: -1px;
    border-top-left-radius:0;
    border-bottom-left-radius:0;
    border-left-color:#fff;
    box-shadow:none;
}
.right-caret:after,.left-caret:after
 {  content:"";
    border-bottom: 5px solid transparent;
    border-top: 5px solid transparent;
    display: inline-block;
    height: 0;
    vertical-align: middle;
    width: 0;
    margin-left:5px;
}
.right-caret:after
{   border-left: 5px solid #ffaf46;
}
.left-caret:after
{   border-right: 5px solid #ffaf46;
}

JQuery

$(function(){
    $(".dropdown-menu > li > a.trigger").on("click",function(e){
        var current=$(this).next();
        var grandparent=$(this).parent().parent();
        if($(this).hasClass('left-caret')||$(this).hasClass('right-caret'))
            $(this).toggleClass('right-caret left-caret');
        grandparent.find('.left-caret').not(this).toggleClass('right-caret left-caret');
        grandparent.find(".sub-menu:visible").not(current).hide();
        current.toggle();
        e.stopPropagation();
    });
    $(".dropdown-menu > li > a:not(.trigger)").on("click",function(){
        var root=$(this).closest('.dropdown');
        root.find('.left-caret').toggleClass('right-caret left-caret');
        root.find('.sub-menu:visible').hide();
    });
});

HTML:

<div class="dropdown" style="position:relative">
    <a href="#" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">Click Here <span class="caret"></span></a>
    <ul class="dropdown-menu">
        <li>
            <a class="trigger right-caret">Level 1</a>
            <ul class="dropdown-menu sub-menu">
                <li><a href="#">Level 2</a></li>
                <li>
                    <a class="trigger right-caret">Level 2</a>
                    <ul class="dropdown-menu sub-menu">
                        <li><a href="#">Level 3</a></li>
                        <li><a href="#">Level 3</a></li>
                        <li>
                            <a class="trigger right-caret">Level 3</a>
                            <ul class="dropdown-menu sub-menu">
                                <li><a href="#">Level 4</a></li>
                                <li><a href="#">Level 4</a></li>
                                <li><a href="#">Level 4</a></li>
                            </ul>
                        </li>
                    </ul>
                </li>
                <li><a href="#">Level 2</a></li>
            </ul>
        </li>
        <li><a href="#">Level 1</a></li>
        <li><a href="#">Level 1</a></li>
    </ul>
</div>
  • 0
    К сожалению, это не показывает меню, когда отображается «свернутая» кнопка меню. В Chrome и в FF.
  • 0
    @BenPower Можете ли вы предоставить демо-версию jsfiddle, чтобы я мог рассмотреть ее, потому что приведенная мною демонстрация jsfiddle работает нормально. Также, какие версии Bootstrap, JQuery и веб-браузеров вы используете?
Показать ещё 8 комментариев
22

Этот пример приведен из http://bootsnipp.com/snippets/featured/multi-level-dropdown-menu-bs3

Работает для меня в Bootstrap v3.1.1.

HTML

<div class="container">
<div class="row">
    <h2>Multi level dropdown menu in Bootstrap 3</h2>
    <hr>
    <div class="dropdown">
        <a id="dLabel" role="button" data-toggle="dropdown" class="btn btn-primary" data-target="#" href="/page.html">
            Dropdown <span class="caret"></span>
        </a>
        <ul class="dropdown-menu multi-level" role="menu" aria-labelledby="dropdownMenu">
          <li><a href="#">Some action</a></li>
          <li><a href="#">Some other action</a></li>
          <li class="divider"></li>
          <li class="dropdown-submenu">
            <a tabindex="-1" href="#">Hover me for more options</a>
            <ul class="dropdown-menu">
              <li><a tabindex="-1" href="#">Second level</a></li>
              <li class="dropdown-submenu">
                <a href="#">Even More..</a>
                <ul class="dropdown-menu">
                    <li><a href="#">3rd level</a></li>
                    <li><a href="#">3rd level</a></li>
                </ul>
              </li>
              <li><a href="#">Second level</a></li>
              <li><a href="#">Second level</a></li>
            </ul>
          </li>
        </ul>
    </div>
</div>

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;
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: #ccc;
margin-top: 5px;
margin-right: -10px;
}

.dropdown-submenu:hover>a:after {
border-left-color: #fff;
}

.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;
}
  • 0
    Спасибо вам ! версия 3.0 больше не поддерживает проверенный ответ
13

Я смог зафиксировать подменю, всегда прикрепляясь к верхней части родительского меню из ответа Andres со следующим дополнением:

.dropdown-menu li {
    position: relative;
}

Я также добавляю значок "icon-chevron-right" на элементах, которые содержат подменю меню, и меняет значок с черного на белый при наведении (чтобы подчеркнуть, что текст меняется на белый и лучше выглядит с выбранным синим фоном).

Ниже приведено полное изменение /css (замените выше):

.dropdown-menu li {
    position: relative;

    [class^="icon-"] {
        float: right;
    }

    &:hover {
        // Switch to white icons on hover
        [class^="icon-"] {
            background-image: url("../img/glyphicons-halflings-white.png");
        }
    }
}
4

Я просто добавил class="span2" в <li> для выпадающих элементов и работал.

3

Так как Bootstrap 3 удалил часть подменю, и нам нужно адаптироваться к стилю, я думаю, что лучше пойти с SmartMenu Bootstrap: https://vadikom.github.io/smartmenus/src/demo/bootstrap-navbar.html#

Это сэкономит нам время на мобильный отзыв и стиль.

Этот плагин также очень перспективен.

  • 0
    Что вы думаете о github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover ? Я не могу принять решение.
  • 1
    @CsabaToth, этот вопрос также был в моем рассмотрении, если вы хотите иметь только API-интерфейс начальной загрузки Javascript, вы можете использовать его, достаточно легкий для добавления и может быть знаком с общими навыками начальной загрузки, если вам нужно что-то настраивать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню