Submenu suspenso de auto-inicialização ausente

324

O Bootstrap 3 ainda está no RC, mas eu estava apenas tentando implementá-lo. Eu não conseguia descobrir como colocar uma classe de submenu. Mesmo não há aula em css e mesmo os novos documentos não dizem nada sobre isso

Estava lá no 2.x com o nome da classe como submenu suspenso

DevC
fonte
2
Lembre-se de que alguns componentes foram alterados na versão 3, incluindo menu, navs e modais.
Deividi Cavarzan
11
a falta de suporte nativo para esse recurso (imho) útil no BS3 é uma das principais razões pelas quais ainda não mudei. enquanto eu concordo que não é tão útil no celular, e eles têm uma abordagem 'móvel primeiro' Agora, parece míope para remover um recurso já implementado, que é muito útil no ambiente de trabalho
Andrew Brown
4
Concordou que é míope remover a funcionalidade esperada. Esse tipo de mudança radical dá aos desenvolvedores empresariais um dia ruim.
RJB 14/07
Para fazer uma lista suspensa apenas uso css codepen.io/Gothburz/pen/GpJKqP
Gothburz

Respostas:

555

Atualizado 2018

O dropdown-submenufoi removido no Bootstrap 3 RC. Nas palavras do autor do Bootstrap Mark Otto ..

"Os submenus simplesmente não têm muito espaço na web no momento, especialmente a web móvel. Eles serão removidos com o 3.0" - https://github.com/twbs/bootstrap/pull/6342

Mas, com um pouco de CSS extra, você pode obter a mesma funcionalidade.

Bootstrap 4 (submenu da barra de navegação ao passar o mouse)

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

Passe o mouse sobre o
submenu Navbar Passe o mouse sobre o submenu Navbar sobre o mouse (alinhado à direita)
Navbar sobre o submenu Clique sobre o mouse (alinhado à direita)
Navbar sobre o menu suspenso sobre o mouse Navbar (sobre o submenu)


Bootstrap 3

Aqui está um exemplo que usa o 3.0 RC 1: http://bootply.com/71520

Aqui está um exemplo que usa o Bootstrap 3.0.0 (final): 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;
}

Exemplo de marcação

<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 - Exemplo na barra de navegação que ajusta a posição esquerda: http://bootply.com/92442

Zim
fonte
5
Sim Graças eu adicionei-o estilo do meu tema, basta copiar colado da versão antiga do inicialização wordpress.org/themes/bikaner
DevC
8
Por exemplo bootply.com/86684 , adicione a seguinte linha em css para o fundo correto foco de item de menu pai ao exibir submenu: .dropdown-submenu:hover {background: #e2e1e1;}
Eduardo Moralles
1
Funciona com 3.1.1 também. Muito obrigado pela solução. Eu estava batendo minha cabeça contra a parede, tentando alterar o arquivo bootstrap.js para funcionar corretamente.
Joel Kinzel
2
Estou tentando simplificar o máximo possível as coisas, mas é necessário em sites grandes sem maneira de contornar vários níveis de navegação (como sites do governo).
Troy Templeman
1
O submenu desaparece antes mesmo que eu possa mover o mouse para ele, então pairar não está funcionando! Ele não passa o mouse, dependendo do clique, mas funciona bem.
Poli
61

A solução @skelly é boa, mas não funciona em dispositivos móveis, pois o estado de foco não funciona.

Eu adicionei um pouco de JS para recuperar o comportamento do BS 2.3.2.

PS: funcionará com o CSS que você chegar lá: http://bootply.com/71520, embora você possa comentar a seguinte parte:

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');
});

O resultado pode ser encontrado no meu tema WordPress (Topo da página): http://shprinkone.julienrenaux.fr/

Shprink
fonte
5
Você é o cara mais inteligente deste post
user1143669
2
Essa solução não explica o desejo de manter a funcionalidade flutuante quando estiver na área de trabalho e também não funciona no segundo nível do submenu. Para que isso funcione em mais níveis de submenus, altere as duas últimas linhas para a seguinte linha:, $(this).closest(".dropdown-submenu").toggleClass("open");que abrirá / fechará os itens de menu dos links. Para manter o cursor do mouse na área de trabalho, é necessário verificar a largura da janela de exibição do navegador e será diferente para cada site.
Edchedges
obrigado pelo seu código. mas no celular, seu código tem um erro.
Jian dan
42

Até hoje (9 de janeiro de 2014), o Bootstrap 3 ainda não suporta o menu suspenso do submenu.

Eu pesquisei no Google sobre o menu de navegação responsiva e achei que é o melhor que eu.

São menus inteligentes http://www.smartmenus.org/

Espero que este seja o caminho para quem deseja o menu de navegação com submenu multinível.

atualização 2015-02-17 Os menus inteligentes agora são totalmente compatíveis com o estilo do elemento Bootstrap no submenu. Para mais informações, consulte o site dos menus inteligentes.

vee
fonte
Eu estava tendo problemas para tentar obter o bootstrap para pairar no PC e clicar no tablet com vários níveis. Você fez meu dia! Funciona lindamente - usa praticamente a mesma marcação que o bootstrap. Obrigado! :)
Hippie
2
Esta solução é livre, de código aberto e trabalho muito bem com BootStrap 3.
Patrick Desjardins
5
Surpreendente! Fácil! Para obter detalhes específicos sobre a integração Bootstrap 3, veja aqui: vadikom.github.io/smartmenus/src/demo/bootstrap-navbar.html
manafire
1
Os menus inteligentes são bons, mas só funcionam com barras de navegação, não com menus suspensos simples.
Nikolai Prokoschenko
1
u salvou meu projeto :-)
Sikander
5

O código do Shprink me ajudou mais, mas para evitar o menu suspenso para fora da tela, atualizei-o para:

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 - a fonte branca e o fundo claro não estavam com boa aparência.

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

Espero que isso ajude as pessoas tanto quanto para mim!

Mas espero que o Bootstrap adicione o recurso subs de volta o mais rápido possível.

WHOMEZz
fonte
4

Comente a solução realmente útil de Skelly : no Bootstrap-sass 3.3.6, utilities.scss, linha 19: .pull-lefthas float:left !important. Desde então, eu recomendo usar! Important em seu CSS também:

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

Encontrei esse problema há alguns dias. Eu tentei muitas soluções e nenhuma realmente funcionou para mim no final, acabei criando uma extensão / substituição do código suspenso do bootstrap. É uma cópia do código original com alterações na função closeMenus.

Eu acho que é uma boa solução, pois não afeta as classes principais do js de bootstrap.

Você pode conferir no gihub: https://github.com/djokodonev/bootstrap-multilevel-dropdown

George Donev
fonte
Esta é uma solução muito boa para dropdown multinível, eu gosto de usá-lo.
huncyrus
Estou feliz que você tenha gostado :-)
George Donev
-2

Eu faço outra solução para o menu suspenso. Espero que isso seja útil Basta adicionar este script 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>
user3193801
fonte