Отсутствует раскрывающееся подменю Bootstrap


324

Bootstrap 3 все еще в RC, но я просто пытался это реализовать. Я не мог понять, как поставить класс подменю. Даже нет класса в CSS, и даже новые документы ничего не говорят об этом

Это было там в 2.x с именем класса в выпадающем меню


2
Помните, что в версии 3 были изменены некоторые компоненты, включая меню, навигацию и модалы.
Дейвиди Каварзан

11
отсутствие встроенной поддержки этой (imho) полезной функции в BS3 является одной из основных причин, по которой я еще не переключился. хотя я согласен, что это не так полезно для мобильных устройств, и у них теперь есть «мобильный сначала» подход, кажется недальновидным удалить функцию, которую они уже реализовали, которая ОЧЕНЬ полезна на рабочем столе
Эндрю Браун

4
Договорились, что близоруко удалить ожидаемую функциональность. Такое серьезное изменение дает корпоративным разработчикам плохой день.
RJB

Чтобы сделать выпадающее меню
Gothburz

Ответы:


555

Обновлено 2018

dropdown-submenuБыл удален в Bootstrap 3 RC. По словам автора Bootstrap Марка Отто ..

«Подменю просто не так много места в Интернете сейчас, особенно в мобильном Интернете. Они будут удалены с 3.0» - https://github.com/twbs/bootstrap/pull/6342

Но с небольшим дополнительным CSS вы можете получить ту же функциональность.

Bootstrap 4 (подменю navbar при наведении)

.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 (выравнивание по правому краю)
Подсказка по выпадающему меню (без подменю)


Bootstrap 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 - Пример в navbar, который регулирует левое положение: http://bootply.com/92442


5
Да, спасибо. Я добавил его в таблицу стилей моей темы, просто скопируйте и вставьте из старой версии начального загрузчика wordpress.org/themes/bikaner
DevC

8
Например, bootply.com/86684 , добавьте следующую строку в css для корректного наведения фона на элемент родительского меню при отображении подменю: .dropdown-submenu:hover {background: #e2e1e1;}
Eduardo Moralles

1
Работает также с 3.1.1. Большое спасибо за решение. Я бился головой о стену, пытаясь изменить файл bootstrap.js для правильной работы.
Джоэл Кинзел

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

2
Это решение не учитывает желание сохранять функциональность при наведении на рабочем столе, и оно также не работает для второго уровня подменю. Для того чтобы это работало для большего количества уровней подменю, измените последние две строки на следующую строку:, $(this).closest(".dropdown-submenu").toggleClass("open");которая будет открывать / закрывать пункты меню ссылок. Чтобы держать курсор на рабочем столе, необходима проверка ширины области просмотра браузеров, которая будет отличаться для каждого сайта.
хеджирует

спасибо за твой код но в вашем мобильном телефоне есть ошибка.
Дан

42

До сегодняшнего дня (9 января 2014 года) Bootstrap 3 по-прежнему не поддерживает раскрывающееся меню.

Я искал Google о адаптивном меню навигации и обнаружил, что это лучшее, что я.

Это Смарт меню http://www.smartmenus.org/

Я надеюсь, что это выход для тех, кто хочет меню навигации с многоуровневым подменю.

обновление 2015-02-17 Умные меню теперь полностью поддерживают стиль элемента Bootstrap для подменю. Для получения дополнительной информации, пожалуйста, посетите веб-сайт Smart Menus.


У меня были проблемы с попыткой заставить загрузчик зависать на ПК и нажимать на планшет с несколькими уровнями. Вы только что сделали мой день! Работает прекрасно - использует в основном ту же разметку, что и начальная загрузка. Спасибо! :)
Хиппи

2
Это бесплатное решение с открытым исходным кодом и очень хорошо работает с BootStrap 3.
Патрик Дежарден

5
Удивительный! Легко! Подробнее об интеграции Bootstrap 3 см. Здесь: vadikom.github.io/smartmenus/src/demo/bootstrap-navbar.html
manafire

1
Smartmenus хорош, но работает только с панелями навигации, а не с простыми выпадающими кнопками.
Николай Прокощенко,

1
ты сохранил мой проект :-)
Сикандер

5

Код Шпринка помог мне больше всего, но чтобы избежать выпадения выпадающего экрана, я обновил его до:

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: FROM background-color: #eeeeee TO background-color: # c5c5c5 - белый шрифт и светлый фон выглядели не очень хорошо.

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

Я надеюсь, что это помогает людям так же, как и для меня!

Но я надеюсь, что Bootstrap вернет функцию сабвуферов как можно скорее.


4

Комментарий к действительно полезному обходному пути Skelly : в Bootstrap-sass 3.3.6, utilities.scss, строка 19: .pull-lefthas float:left !important. После этого я рекомендую использовать! Важный в своем CSS:

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

2

Я столкнулся с этой проблемой несколько дней назад. Я перепробовал много решений, и ни одно из них не помогло мне, в конце концов я создал расширение / переопределение выпадающего кода начальной загрузки. Это копия исходного кода с изменениями в функции closeMenus.

Я думаю, что это хорошее решение, поскольку оно не затрагивает основные классы начальной загрузки js.

Вы можете проверить это на gihub: https://github.com/djokodonev/bootstrap-multilevel-dropdown


Это очень хорошее решение для многоуровневого выпадающего меню, я люблю его использовать.
huncyrus

Я рад, что вам понравилось :-)
Георгий Донев

-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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.