barra de navegação superior que bloqueia o conteúdo principal da página


296

Eu tenho esse código de inicialização do Twitter

  <div class='navbar navbar-fixed-top'>
    <div class='navbar-inner'>
      <div class='container'>
        <a class='btn btn-navbar' data-target='.nav-collapse' data-toggle='collapse'>
          <span class='icon-bar'></span>
          <span class='icon-bar'></span>
          <span class='icon-bar'></span>
        </a>
        <div class='nav-collapse'>
          <ul class='nav'>
            <li class='active'>
              <a href='some_url'>My Home</a>
            </li>
            <li>
              <a href='some_url'>Option 1 </a>
            </li>
            <li>
              <a href='some_url'>Another option</a>
            </li>
            <li>
              <a href='some_url'>Another option</a>
            </li>
          </ul>
        </div>
      </div>
    </div>
  </div>

Mas quando estou visualizando o início da página, a barra de navegação está bloqueando parte do conteúdo que fica próximo ao topo da página. Alguma idéia de como fazê-lo baixar o restante do conteúdo para baixo quando a parte superior da página é exibida, para que o conteúdo não seja bloqueado pela barra de navegação?


1
possível duplicação do site de sobreposição fixo superior
user2428107

2
@ user2428107 Essa pergunta foi publicada mais tarde.
jazzpi

Respostas:


255

Adicione ao seu CSS:

body { 
    padding-top: 65px; 
}

Nos documentos do Bootstrap :

A barra de navegação fixa sobrepõe seu outro conteúdo, a menos que você adicione preenchimento à parte superior do corpo.


11
Ver resposta adicional abaixo por @Spajus para saber como código isso por Bootstrap responsivo
Jason Capriotti

4
Definitivamente role com a outra resposta com um pouco mais de sucessão com @media (largura mínima: 980px) {body {padding-top: 60px; }
Ted

3
Enquanto as outras respostas fazer face a este mais eloquentemente, esta é a resposta oficial como observado na documentação Bootstrap para Navbar fixo ligação
Caffeinius

1
Como isso funcionará se o usuário tiver uma tela mais estreita ou simplesmente redimensionar a janela? O conteúdo mais alto será bloqueado novamente pela seção da barra de navegação expandida.
Konrad Viltersten

366

Adicionar um preenchimento como esse não é suficiente se você estiver usando o bootstrap responsivo. Nesse caso, ao redimensionar sua janela, você terá um espaço entre a parte superior da página e a barra de navegação. Uma solução adequada é assim:

body {
  padding-top: 60px;
}
@media (max-width: 979px) {
  body {
    padding-top: 0px;
  }
}

19
Perfeito. Isso realmente deve ser integrado ao bootstrap de alguma forma. Você deve bifurcar e enviar uma solicitação de recebimento.
brittohalloran

1
Boa solução, mas ainda há algo não resolvido. Dê uma olhada nesta pergunta que acabei de fazer e veja se alguém pode ajudá-la. stackoverflow.com/questions/12763707/…
ElPiter 6/10/12

27
Ainda mais sucintamente: @media (largura mínima: 981px) {body {padding-top: 60px; }
Ted

4
@Ted para mim tem que ser min-width: 980px ;-)
white_gecko

3
@white_gecko lol. Sim. Que 980 queria ser apenas um pouco mais exclusivo especial ;-)
Ted

143

No bootstrap 3, a classe em navbar-static-topvez de navbar-fixed-topevitar esse problema, a menos que você precise que a barra de navegação esteja sempre visível.


2
Isso funciona, no entanto, pode deixar algum espaço acima da barra de navegação. Pode ser necessário modificar o site.css e remover o padding-top 80px do corpo.
ZZZ

9
Eu tentei de tudo e esta é a única resposta que funcionou. Como esta é a solução mais geral e não depende do tamanho da tela, essa deve ser a resposta correta.
Blairg23

1
Isso resolveu o problema. Por que isso funciona em vez de navbar-fixed-top?
hlyates

Não funcionou para o boottap 3.3.4. Vejo fixo exemplo nav no local de inicialização getbootstrap.com/examples/navbar-fixed-top , Ele usa padding-top
Alireza Fattahi

2
enquanto isso funciona, torna a barra de navegação estática e não fixa. isso significa que quando você rolar a barra de navegação desaparecerá ... pelo menos para mim isso não é bom.
tbkn23

62

uma solução muito mais útil para sua referência, funciona perfeitamente em todos os meus projetos:

mude seu primeiro 'div' de

<div class='navbar navbar-fixed-top'>

para

<div class="navbar navbar-default navbar-static-top">

28
A barra de navegação estática desaparece ao rolar.
Daniel C. Sobral

1
Re: @ DanielC.Sobral response - você poderia trocá-lo pelo fixo em js se ele rolar para cima
obie

17

Estou usando o jQuery para resolver esse problema. Este é o trecho para o BS 3.0.0:

$(window).resize(function () { 
    $('body').css('padding-top', parseInt($('#main-navbar').css("height"))+10);
});

$(window).load(function () { 
    $('body').css('padding-top', parseInt($('#main-navbar').css("height"))+10);        
});

2
Eu estava usando uma imagem na barra de navegação e tendo problemas reais com o conteúdo oculto. Isso funcionou perfeitamente! Obrigado!
Richard Varno

2
muito obrigado pela sua solução. esta resposta funcionou como um encanto para mim :) Gostaria de acrescentar uma coisa. Quando você carrega a página, o corpo é definido para o topo antes de se ajustar automaticamente, porque o jquery não é executado instantaneamente. Para torná-lo mais suave, adicionei isso no corpo do CSS {padding-top: // height inicial da minha barra de navegação; } Isso ajuda na transição suave! Mais uma vez obrigado!
AAA

1
Obrigado por inspirar uma solução programática! Eu tenho uma grande implementação de trabalho agora em GWT com bom encapsulado código bem estruturado ... graças a uma falta de Javascript ;-)
Alex Worden

9

Tive um bom sucesso ao criar uma barra de navegação não fixa simulada antes da minha barra de navegação fixa real.

<nav class="navbar navbar-default"></nav> <!-- Dummy nav bar -->
<nav class="navbar navbar-default navbar-fixed-top"> <!-- Real nav bar -->
    <!-- Nav bar details -->
</nav>

O espaçamento funciona muito bem em todos os tamanhos de tela.


Eu pensei que esta era a resposta no começo e estava tudo pronto para dar um voto positivo. Mas então percebi que não funciona quando o tamanho fica estreito o suficiente para empilhar os botões do menu. :-(
Steve In CO:

Você está certo de que não funcionará com o empilhamento de menus sem código adicional. Normalmente, apenas mantenho minhas barras de menu em uma linha de altura e viro as opções de menu em um botão de hambúrguer quando o tamanho diminui.
Jason Butler

não tenho idéia do porquê, mas isso funciona. você pode explicar por que isso funciona?
red security

Boa ideia! pois é útil quando algumas páginas têm uma barra de navegação e outras não, pois não é possível diferenciar do arquivo css.
Laurent

Este é definitivamente o caminho a seguir. Funciona em todos os dispositivos, mesmo quando a barra de navegação se divide em duas linhas. +1

7

No meu projeto derivado do tutorial do MVC 5 , descobri que alterar o preenchimento do corpo não tinha efeito. O seguinte funcionou para mim:

@media screen and (min-width:768px) and (max-width:991px) {
    body {
        margin-top:100px;
    }
}
@media screen and (min-width:992px) and (max-width:1199px) {
    body {
        margin-top:50px;
    }
}

Resolve os casos em que a barra de navegação se dobra em 2 ou 3 linhas. Isso pode ser inserido no bootstrap.css em qualquer lugar após o corpo das linhas {margin: 0; }



4

Como visto neste exemplo do Twitter, adicione-o antes da linha que inclui as declarações de estilos responsivos:

<style> 
    body {
        padding-top: 60px;
    }
</style>

Igual a:

<link href="Z/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<style type="text/css">
    body {
        padding-top: 60px;
    }
</style>
<link href="Z/bootstrap/css/bootstrap-responsive.min.css" rel="stylesheet" />

2

com navbar navbar-default tudo funciona bem, mas se você estiver usando navbar-fixed-top, precisará incluir um corpo de estilo personalizado {padding-top: 60px;} caso contrário, ele bloqueará o conteúdo abaixo.


3
Isso não adiciona nenhuma informação que ainda não esteja em outras respostas.
precisa saber é o seguinte

2

Dois problemas acontecerão aqui:

  1. Carregamento da página (conteúdo oculto)
  2. Links internos como esse rolam para o topo e ficam ocultos pela barra de navegação:
<nav>...</nav>              <!-- 70 pixels tall -->
<a href="#hello">hello</a>  <!-- click to scroll down -->
<hr style="margin: 100px">
<h1 id="hello">World</h1>   <!-- Help!  I'm 70 pixels hidden! -->

Bootstrap 4 com links de páginas internos

Para corrigir 1), como Martijn Burger disse acima, o modelo inicial do bootstrap v4 css usa:

body {
  padding-top: 5rem;
}

Para corrigir 2), verifique este problema . Esse código funciona principalmente (mas não no segundo clique do mesmo hash):

window.addEventListener("hashchange", function() { scrollBy(0, -70) })

Este código anima os links A com o jQuery (não é o jQuery fino):

  // inline theme global code here
  $(document).ready(function() {
    var body = $('html,body'), NAVBAR_HEIGHT = 70;
    function smoothScrollingTo(target) {
      if($(target)) body.animate({scrollTop:$(target).offset().top - NAVBAR_HEIGHT}, 500);
    }
    $('a[href*=\\#]').on('click', function(event){
      event.preventDefault();
      smoothScrollingTo(this.hash);
    });
    $(document).ready(function(){
      smoothScrollingTo(location.hash);
    });
  })

2

A melhor solução que eu encontrei até agora, que não envolve alturas de codificação e pontos de interrupção, é adicionar uma <nav...tag extra à marcação.

<nav class="navbar navbar-expand-md" aria-hidden="true">
    <a class="navbar-brand" href="#">Navbar</a>
</nav>
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
    <a class="navbar-brand" href="#">Navbar</a>

Ao fazê-lo desta maneira, os @mediapontos de interrupção são idênticos, a altura é idêntica (desde que você navbar-brandseja o objeto mais alto no, navbarmas você pode facilmente substituir outro elemento na fixed-topbarra de navegação não) .

Onde isso falha é com os leitores de tela que agora apresentarão 2 navbar-brandelementos. Isso aponta para a necessidade de uma not-for-srclasse para impedir que esse elemento apareça para os leitores de tela. No entanto, essa classe não existe https://getbootstrap.com/docs/4.0/utilities/screenreaders/

Tentei compensar o problema do leitor de tela, aria-hidden="true"mas https://www.accessibility-developer-guide.com/examples/sensible-aria-usage/hidden/ parece indicar que isso provavelmente não funcionará quando o leitor de tela estiver no modo de foco, que é obviamente a única vez em que você realmente precisa para funcionar ...


1

usar percentageé muito melhor solução do que pixels.

body {
  padding-top: 10%; //This works regardless of display size.
}

Se necessário, você ainda pode ser explícito, adicionando diferentes breakpointsconforme mencionado em outra resposta por@spajus


1

EDIT: Esta solução não é viável para versões mais recentes do Bootstrap, onde as classes navbar-inverse e navbar-static-top não estão disponíveis.

Usando o MVC 5, da maneira que corrigi o meu, era simplesmente adicionar meu próprio Site.css, carregado após os outros, com a seguinte linha: body{padding: 0}

e alterei o código no início de _Layout.cshtml, para ser:

<body>
    <div class="navbar navbar-inverse navbar-static-top">
        <div class="container">
            @if (User.Identity.IsAuthenticated) {
                <div class="top-navbar">

navbar-static-topnão está definido no Bootstrap4. Não énavbar-inverse
boatcoder 16/07/19

Acho que essa resposta está desatualizada, então. Vou adicionar uma nota à resposta.
Ultroman the Tacoman

0
<div class='navbar' data-spy="affix" data-offset-top="0">

Se sua barra de navegação estiver originalmente na parte superior da página, defina o valor como 0. Caso contrário, defina o valor para data-offset-topcom o valor do conteúdo acima da barra de navegação.

Enquanto isso, você precisa modificar o seguinte css:

.affix{
  width:100%;
  top:0;
  z-index: 10;
}


0

você deveria adicionar

#page {
  padding-top: 65px
}

para não destruir um rodapé pegajoso ou qualquer outra coisa


-1

Adicione ao seu JS:

jQuery(document).ready(function($) {
  $("body").css({
    'padding-top': $(".navbar").outerHeight() + 'px'
  })
});

Isso não funcionará se a janela for redimensionada, pois a parte superior do preenchimento é aplicada apenas quando o documento estiver pronto.
boatcoder

-2

você pode definir margem com base na resolução da tela

@media screen and (min-width:768px) and (max-width:991px) {
body {
    margin-top:100px;
}

@media screen and (min-width:992px) and (max-width:1199px) {
  body {
    margin-top:50px;
  }
}

body{
  padding-top: 10%;
}

#nav{
   position: fixed;
   background-color: #8b0000;
   width: 100%;
   top:0;
}
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.