Многоуровневое раскрывающееся меню Twitter Bootstrap

89

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

Hellnar
источник
на самом деле искал реализацию, но мне не повезло.
Hellnar
Может вам нужно меню из сосиски? htmldog.com/articles/suckerfish/dropdowns
Элейн Марли,
1
взгляните и на это: github.com/twitter/bootstrap/issues/424
Паоло

Ответы:

113

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

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

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

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

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


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

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

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

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".
Омар
Пробовал реализовать, первое подменю работает нормально. Но если я добавлю еще одно подменю в то же меню, все пойдет не так. Почему-то открывает первое подменю вместо второго. Приветствуются любые идеи или подсказки. Уже благодарен x :)
Arjan
Гермес - См. Мой ответ о том, как исправить залипание подменю.
Шон Линч,
1
@Kannika, мобилизация этого исправления, потребует дополнительной разметки и, возможно, некоторого javascript. Я предлагаю просто отображать раскрывающийся контент второго уровня вместо того, чтобы скрывать его на мобильных устройствах, чтобы все было в порядке. Я постараюсь поработать над решением позже в течение дня. Я не тестировал решение начальной загрузки по умолчанию, так что вы всегда можете пойти с этим.
Андрес Ильич
5
Обновленная версия работает только с Bootstrap 2.3.2, она была удалена в Bootstrap 3.0
seantomburke
34

[Twitter Bootstrap v3]

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

  • jsfiddle-демонстрация n-уровневого выпадающего меню v3.0.0 | v3.1.1 | v3.3.0

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>
Чираю Чирипал
источник
К сожалению, это не показывает меню, когда отображается «свернутая» кнопка меню. В Chrome и в FF.
Бен Пауэр
@BenPower Не могли бы вы предоставить демонстрацию jsfiddle, чтобы я мог изучить ее, потому что демонстрация jsfiddle, которую я дал, работает нормально. Какие версии Bootstrap, JQuery и веб-браузеров вы используете?
Чираю Чирипал
Он работает для Bootstrap v3.0. Приятель ... Не могли бы вы сделать его поддерживающим для Bootstrap v2.3.2?
Niks Jain
1
Я добавил trigger.off('click');перед установкой слушателей, чтобы предотвратить «двойное прослушивание» события в случае, если инициализация javascript запускается более одного раза.
FranBran 01
1
Инвертирование каретки добавило несколько строк кода и в этом нет необходимости.
Рубен
23

Этот пример взят из 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;
}
фандассон
источник
Спасибо вам ! версия 3.0 больше не поддерживает подтвержденный ответ
Asenar
13

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

.dropdown-menu li {
    position: relative;
}

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

Вот полное изменение less / 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#

Это сэкономит нам время на мобильную адаптивность и стиль.

Этот плагин тоже очень многообещающий.

Осифы
источник
Что вы думаете о github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover ? Не могу определиться.
Чаба Тот,
1
@CsabaToth, я тоже думал об этом, если вы хотите иметь только загрузочный javascript API, вы можете использовать этот, достаточно легкий, чтобы добавить, и вы можете быть знакомы с общими навыками начальной загрузки, если вам нужна какая-либо настройка.
Osify
Наконец, я собираюсь использовать один из них в одном проекте, а другой - на сопутствующем сайте. Каждое решение подходит одному из них лучше
Csaba Toth