Bootstrap 3 - desativar recolhimento da barra de navegação


88

Esta é minha barra de navegação simples:

<div class="navbar navbar-fixed-top myfont" role="navigation">
    <div class="">
        <ul class="nav navbar-nav navbar-left">
            <li>
                <a class="navbar-brand" href="#">
                    <img src="assets/img/logo.png"/>
                </a>
            </li>
            <li>
                <button class="btn btn-navbar">
                    <i class="fa fa-edit"></i>
                    Create 
                </button>
            </li>
        </ul>
    </div>
    <ul class="nav navbar-nav navbar-right">
        <li data-match-route="/"><a href="#/page-one">Login</a></li>
        <li data-match-route="/"><a href="#/page-two/sub-a">Signup</a></li>
    </ul>
</div>

Só queria evitar que isso desabasse, pois não preciso, como faço?

Eu gostaria de evitar escrever 300 mil linhas de CSS para substituir os estilos padrão.

Alguma sugestão?

Respostas:


137

Depois de examinar de perto, não 300 mil linhas, mas há cerca de 3-4 propriedades CSS que você precisa substituir:

.navbar-collapse.collapse {
  display: block!important;
}

.navbar-nav>li, .navbar-nav {
  float: left !important;
}

.navbar-nav.navbar-right:last-child {
  margin-right: -15px !important;
}

.navbar-right {
  float: right!important;
}

E com isso, seu menu não desmoronará.

DEMO ( jsfiddle )

EXPLICAÇÃO

As quatro propriedades CSS fazem o respectivo:

  1. A .collapsepropriedade padrão no bootstrap oculta o lado direito do menu para tablets (paisagem) e telefones e, em vez disso, um botão de alternância é exibido para ocultar / mostrar. Portanto, essa propriedade substitui o padrão e mostra persistentemente esses elementos.

  2. Para que o menu do lado direito apareça na mesma linha junto com o lado esquerdo, precisamos que o lado esquerdo esteja flutuando para a esquerda.

  3. Esta propriedade está presente por padrão no bootstrap, mas não no tablet (retrato) para a resolução do telefone. Você pode pular este, provavelmente não afetará sua barra de navegação geral.

  4. Isso mantém o menu do lado direito à direita enquanto os elementos internos ( li) seguirão a propriedade 2. Portanto, temos a flutuação do lado esquerdo para a esquerda e a flutuação do lado direito para a direita, o que os traz em uma linha.


2
@gwho Acabei de adicionar uma explicação à resposta.
AyB de

1
Se ficar magro o suficiente, os elementos flutuados para a esquerda e para a direita podem se envolver (estou falando sobre os ulnão os lis). Qual é a melhor maneira de evitar que até isso aconteça?
ahnbizcad

2
Se seu único requisito é evitar que a lista UL / LI se torne vertical, o segundo CSS é tudo o que é necessário.
JamesB

1
As !importantdeclarações não são necessárias aqui, para mim funciona sem. Tente evitá-los sempre que possível (! Importante).
Tim-Erwin,

2
Os menus suspensos @ICanHasKittenz ainda mudam o comportamento quando <768 px, eles são exibidos na barra de navegação (beahviour recolhido) dentro de aparecer em uma caixa branca flutuante (comportamento não recolhido) como seria de esperar. E o título suspenso se amplia quando clicado, forçando outros elementos a se deslocarem. Basta adicionar uma lista suspensa em um elemento navbar e você verá por si mesmo.
Roubi de

24

O nabvar entrará em colapso em dispositivos pequenos. O ponto de colapso é definido por @grid-float-breakpointvariáveis. Por padrão, isso acontecerá antes 768px. Para telas abaixo da 768largura da tela de pixels, a barra de navegação terá a seguinte aparência:

insira a descrição da imagem aqui

É possível alterar o @grid-float-breakpointin variables.less e recompilar o Bootstrap. Ao fazer isso, você também terá que alterar @screen-xs-maxem navbar.less. Você terá que definir esse valor para o seu novo @grid-float-breakpoint -1. Veja também: https://github.com/twbs/bootstrap/pull/10465 . Isso é necessário para alterar os formulários da barra de navegação e menus suspensos no ponto de interrupção @ grid-float-break para sua versão móvel.

A maneira mais fácil é personalizar o bootstrap

encontrar variável:

 @grid-float-breakpoint

que está definido como @screen-sm, você pode alterá-lo de acordo com suas necessidades. Espero que ajude!


Para usuários SAAS

adicione suas variáveis ​​personalizadas como $grid-float-breakpoint: 0px;antes do@import "bootstrap.scss";


4
isso é muito útil, infelizmente, estou usando o CDN de bootstrap, então não consigo personalizar o arquivo principal de bootstrap. Alguma dica sobre como fazer isso em um arquivo css separado?
itme de

2
+1 para a variável @ grid-float-breakpoint-variable na página de personalização do bootstrap, isso funcionou para mim!
Wietse

4
Para usuários SASS: basta adicionar suas variáveis ​​personalizadas como $grid-float-breakpoint: 0px;antes da @import "bootstrap.scss";linha
Duvrai

5

Esta é uma abordagem que deixa o comportamento de recolhimento padrão inalterado enquanto permite que uma nova seção de navegação permaneça sempre visível. É um aumento de navbar; navbar-header-menué uma classe CSS que criei e não faz parte do Bootstrap propriamente dito.

Coloque isso no navbar-headerelemento após navbar-brand:

<div class="navbar-header-menu">
    <ul class="nav navbar-nav">
        <li class="active"><a href="#">I'm always visible</a></li>
    </ul>
    <form class="navbar-form" role="search">
        <div class="form-group">
            <input type="text" class="form-control" placeholder="Search">
        </div>
        <button type="submit" class="btn btn-default">Submit</button>
    </form>
</div>

Adicione este CSS:

.navbar-header-menu {
    float: left;
}

    .navbar-header-menu > .navbar-nav {
        float: left;
        margin: 0;
    }

        .navbar-header-menu > .navbar-nav > li {
            float: left;
        }

            .navbar-header-menu > .navbar-nav > li > a {
                padding-top: 15px;
                padding-bottom: 15px;
            }

        .navbar-header-menu > .navbar-nav .open .dropdown-menu {
            position: absolute;
            float: left;
            width: auto;
            margin-top: 0;
            background-color: #fff;
            border: 1px solid #ccc;
            border: 1px solid rgba(0,0,0,.15);
            -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175);
            box-shadow: 0 6px 12px rgba(0,0,0,.175);
        }

    .navbar-header-menu > .navbar-form {
        float: left;
        width: auto;
        padding-top: 0;
        padding-bottom: 0;
        margin-right: 0;
        margin-left: 0;
        border: 0;
        -webkit-box-shadow: none;
        box-shadow: none;
    }

        .navbar-header-menu > .navbar-form > .form-group {
            display: inline-block;
            margin-bottom: 0;
            vertical-align: middle;
        }

    .navbar-header-menu > .navbar-left {
        float: left;
    }

    .navbar-header-menu > .navbar-right {
        float: right !important;
    }

    .navbar-header-menu > *.navbar-right:last-child {
        margin-right: -15px !important;
    }

Verifique o violino: http://jsfiddle.net/L2txunqo/

Advertência: navbar-rightpode ser usado para classificar elementos visualmente, mas não garante que puxará o elemento para a parte direita da tela. O violino demonstra esse comportamento com o navbar-form.


0

Se você não estiver usando a versão less, aqui está a linha que você precisa alterar:

@media (max-width: 767px) { /* Change this to 0 */
  .navbar-nav .open .dropdown-menu {
    position: static;
    float: none;
    width: auto;
    margin-top: 0;
    background-color: transparent;
    border: 0;
    box-shadow: none;
  }
  .navbar-nav .open .dropdown-menu > li > a,
  .navbar-nav .open .dropdown-menu .dropdown-header {
    padding: 5px 15px 5px 25px;
  }
  .navbar-nav .open .dropdown-menu > li > a {
    line-height: 20px;
  }
  .navbar-nav .open .dropdown-menu > li > a:hover,
  .navbar-nav .open .dropdown-menu > li > a:focus {
    background-image: none;
  }
}

0

A seguinte solução funcionou para mim no Bootstrap 3.3.4:

CSS:

/*no collapse*/

.navbar-collapse.collapse.off {
    display: block!important;
}
.navbar-collapse.collapse.off ul {
    margin: 0;
    padding: 0;
}

.navbar-nav.no-collapse>li,
.navbar-nav.no-collapse {
    float: left !important;
}

.navbar-right.no-collapse {
    float: right!important;
}

em seguida, adicione a classe .no-collapse a cada uma das listas e a classe .off ao contêiner principal. Aqui está um exemplo escrito em jade:

nav.navbar.navbar-default.navbar-fixed-top
        .container-fluid
            .collapse.navbar-collapse.off
                ul.nav.navbar-nav.no-collapse
                    li
                        a(href='#' class='glyph')
                            i(class='glyphicon glyphicon-info-sign')
                ul.nav.navbar-nav.navbar-right.no-collapse
                    li.dropdown
                        a.dropdown-toggle(href='#', data-toggle='dropdown' role='button' aria-expanded='false')
                            | Tools
                            span.caret
                        ul.dropdown-menu(role='menu')
                            li
                                a(href='#') Tool #1
                    li
                        a(href='#')
                            | Logout

0

Outra maneira é simplesmente remover collapse navbar-collapseda marcação. Exemplo com Bootstrap 3.3.7

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<nav class="navbar navbar-atp">
  <div class="container-fluid">
    <div class="">
      <ul class="nav navbar-nav nav-custom">
        <li>
          <a href="#" id="sidebar-btn"><span class="fa fa-bars">Toggle btn</span></a>
        </li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li>Nav item</li>
      </ul>
    </div>
  </div>
</nav>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.