górny pasek nawigacyjny blokujący górną zawartość strony


296

Mam ten kod Bootstrap na Twitterze

  <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>

Ale gdy przeglądam początek strony, pasek nawigacyjny blokuje niektóre treści znajdujące się w górnej części strony. Masz pomysł, jak przesunąć resztę zawartości w dół, gdy przeglądana jest góra strony, aby zawartość nie była blokowana przez pasek nawigacyjny?



2
@ user2428107 To pytanie zostało opublikowane później.
jazzpi

Odpowiedzi:


254

Dodaj do swojego CSS:

body { 
    padding-top: 65px; 
}

Z dokumentów Bootstrap :

Naprawiony pasek nawigacyjny będzie nakładał inne treści, chyba że dodasz dopełnienie u góry ciała.


11
Zobacz dodatkową odpowiedź poniżej @Spajus, aby dowiedzieć się, jak to zakodować dla responsywnego Bootstrap
Jason Capriotti,

4
Zdecydowanie rzuć drugą odpowiedzią z nieco większą zwięzłością z @media (min-width: 980px) {body {padding-top: 60px; }}
Ted

3
Podczas gdy inne odpowiedzi zajmują się tym bardziej wymownie, jest to oficjalna odpowiedź, jak zauważono w dokumentacji Bootstrap dla łącza
Navbar

1
Jak to zadziała, jeśli użytkownik ma węższy ekran lub po prostu zmienia rozmiar okna? Najwyższa zawartość zostanie ponownie zablokowana przez rozwiniętą sekcję paska nawigacyjnego.
Konrad Viltersten 21.04.16

366

Dodanie takiego wypełnienia nie wystarczy, jeśli używasz responsywnego bootstrapu. W takim przypadku po zmianie rozmiaru okna pojawi się przerwa między górą strony a paskiem nawigacyjnym. Właściwe rozwiązanie wygląda następująco:

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

19
Doskonały. To naprawdę powinno być jakoś zintegrowane z bootstrapem. Powinieneś rozwidlić i przesłać żądanie ściągnięcia.
brittohalloran

1
Dobre rozwiązanie, ale wciąż jest coś nierozwiązanego. Spójrz na pytanie, które właśnie zadałem, i sprawdź, czy ktoś może pomóc. stackoverflow.com/questions/12763707/…
ElPiter,

27
Jeszcze bardziej zwięźle: @media (min-width: 981px) {body {padding-top: 60px; }}
Ted,

4
@Ted dla mnie to musi być min-szerokość: 980px ;-)
white_gecko

3
@white_gecko lol. Tak. Że 980 chciał być tylko trochę wyjątkowym wyjątkowym ;-)
Ted

143

W przypadku bootstrap 3 klasa navbar-static-topzamiast navbar-fixed-topzapobiega temu problemowi, chyba że pasek nawigacyjny jest zawsze widoczny.


2
Działa to jednak może pozostawić trochę miejsca nad paskiem nawigacyjnym. Być może trzeba zmodyfikować site.css i usunąć padding-top 80px z ciała.
ZZZ

9
Próbowałem wszystkiego i to jest jedyna odpowiedź, która zadziałała. Ponieważ jest to najbardziej ogólne rozwiązanie i nie zależy od wielkości ekranu, powinna to być poprawna odpowiedź.
Blairg23,

1
To rozwiązało problem. Dlaczego to działa zamiast na pasku stałym?
hlyates

Nie działało to dla bootstap 3.3.4. Widzę naprawiony przykład nawigacji na stronie bootstrap getbootstrap.com/examples/navbar-fixed-top , używa padding-top
Alireza Fattahi

2
podczas gdy to działa, powoduje, że pasek nawigacyjny jest statyczny i nie jest naprawiony. oznacza to, że kiedy przewiniesz w dół pasek nawigacji zniknie ... przynajmniej dla mnie to nie jest dobre.
tbkn23

62

o wiele bardziej przydatne rozwiązanie w celach informacyjnych, działa idealnie we wszystkich moich projektach:

zmień swój pierwszy „div” z

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

do

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

28
Statyczny pasek nawigacyjny znika podczas przewijania.
Daniel C. Sobral,

1
Re: @ DanielC.Sobral response - możesz go wyłączyć na naprawiony w js, jeśli przewinie się od góry
obie

17

Korzystam z jQuery, aby rozwiązać ten problem. To jest fragment kodu 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
Używałem obrazu nad paskiem nawigacyjnym i miałem poważne problemy z ukrywaniem zawartości. To działało idealnie! Dzięki!
Richard Varno

2
bardzo dziękuję za twoje rozwiązanie. ta odpowiedź działała dla mnie jak urok :) Chciałbym dodać jedną rzecz. Po załadowaniu strony treść jest ustawiana na górze, zanim dostosuje się automatycznie, ponieważ jquery nie uruchamia się natychmiast. Aby było płynniej, dodałem to w treści CSS {padding-top: // początkowa wysokość mojego paska nawigacyjnego; } Pomaga to w płynnym przejściu! Jeszcze raz dziękuję!
AAA,

1
Dzięki za inspirację programowego rozwiązania! Mam teraz świetną działającą implementację w GWT z ładnym, dobrze ustrukturyzowanym kodem ... dzięki brakowi Javascript ;-)
Alex Worden

9

Odniosłem duży sukces, tworząc fałszywy, niezmienny pasek nawigacyjny tuż przed moim prawdziwym stałym paskiem nawigacyjnym.

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

Odstępy sprawdzają się doskonale na wszystkich rozmiarach ekranu.


Na początku myślałem, że to odpowiedź i wszystko było gotowe, aby wyrazić opinię. Ale potem zdałem sobie sprawę, że to nie działa, gdy rozmiar staje się wystarczająco wąski, aby ustawiać przyciski menu. :-(
Steve W CO

Masz rację, nie będzie działać ze stosami menu bez dodatkowego kodu. Zwykle po prostu trzymam paski menu na jednej linii wysokości i zmieniam opcje menu w przycisk hamburgera, gdy rozmiar się zmniejsza.
Jason Butler,

nie mam pojęcia dlaczego, ale to działa. czy możesz wyjaśnić, dlaczego to działa?
czerwone bezpieczeństwo

Świetny pomysł! ponieważ jest to przydatne, gdy niektóre strony mają pasek nawigacyjny, a niektóre nie, ponieważ nie można odróżnić pliku CSS.
Laurent,

To zdecydowanie najlepsza droga. Działa na wszystkich urządzeniach, nawet gdy pasek nawigacyjny rozpada się na dwie linie. +1

7

W moim projekcie pochodzącym z samouczka MVC 5 odkryłem, że zmiana wyściółki ciała nie miała żadnego wpływu. Dla mnie działało:

@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;
    }
}

Rozwiązuje przypadki, w których pasek nawigacyjny składa się w 2 lub 3 linie. Można go wstawić do bootstrap.css w dowolnym miejscu po treści linii {margin: 0; }



4

Jak widać na tym przykładzie z Twittera, dodaj to przed wierszem zawierającym deklaracje stylów responsywnych:

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

Tak jak:

<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

z navbar domyślnie navbar wszystko działa dobrze, ale jeśli używasz navbar-fixed-top , musisz dołączyć niestandardowy styl body {padding-top: 60px;}, inaczej zablokuje zawartość pod spodem.


3
Nie dodaje to żadnych informacji, których nie ma jeszcze w innych odpowiedziach.
Tom Zych

2

Staną się tutaj dwa problemy:

  1. Ładowanie strony (treść ukryta)
  2. Takie linki wewnętrzne zostaną przewinięte do góry i ukryte przez pasek nawigacyjny:
<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 z wewnętrznymi linkami do stron

Aby naprawić 1), jak powiedział powyżej Martijn Burger, szablon startowy css bootstrap v4 używa:

body {
  padding-top: 5rem;
}

Aby naprawić 2) sprawdź ten problem . Ten kod działa głównie (ale nie przy drugim kliknięciu tego samego skrótu):

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

Ten kod animuje linki A z jQuery (nie slim jQuery):

  // 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

Najlepszym rozwiązaniem, jakie do tej pory znalazłem, które nie wymaga sztywnego kodowania wysokości i punktów przerwania, jest dodanie dodatkowego <nav...znacznika do znaczników.

<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>

Robiąc to w ten sposób, @mediapunkty przerwania są identyczne, wysokość jest identyczna (pod warunkiem, że twój navbar-brandjest najwyższym obiektem w, navbarale możesz łatwo zastąpić inny element w fixed-toppasku innym niż navbar.

Jeśli to się nie powiedzie, to czytniki ekranu, które będą teraz prezentować 2 navbar-brandelementy. Wskazuje to na potrzebę istnienia not-for-srklasy, która uniemożliwi wyświetlanie tego elementu w czytnikach ekranu. Jednak ta klasa nie istnieje https://getbootstrap.com/docs/4.0/utilities/screenreaders/

Próbowałem naprawić problem z czytnikiem ekranu, aria-hidden="true"ale https://www.accessibility-developer-guide.com/examples/sensible-aria-usage/hidden/ wydaje się wskazywać, że to prawdopodobnie nie zadziała, gdy czytnik ekranu jest w trybie ustawiania ostrości, który jest oczywiście jedynym czasem, kiedy potrzebujesz go do pracy ...


1

używanie percentagejest znacznie lepszym rozwiązaniem niż pixels.

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

W razie potrzeby możesz nadal być wyraźny, dodając inny, breakpointsjak wspomniano w innej odpowiedzi autorstwa@spajus


1

EDYCJA: To rozwiązanie nie jest wykonalne w nowszych wersjach Bootstrap, w których klasy navbar-inverse i navbar-static-top nie są dostępne.

Za pomocą MVC 5, w sposób, w jaki naprawiłem mój, było po prostu dodanie własnego Site.css, załadowanego po innych, w następującym wierszu: body{padding: 0}

i zmieniłem kod na początku _Layout.cshtml, aby był:

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

navbar-static-topnie jest zdefiniowany w Bootstrap4. Ani teżnavbar-inverse
Boatcoder

Wydaje mi się, że ta odpowiedź jest nieaktualna. Dodam notatkę do odpowiedzi.
Ultroman the Tacoman

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

Jeśli pasek nawigacyjny znajduje się początkowo na górze strony, ustaw wartość na 0. W przeciwnym razie ustaw wartość na data-offset-topwartość zawartości powyżej paska nawigacyjnego.

W międzyczasie musisz zmodyfikować css:

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



-1

Dodaj do swojego JS:

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

To nie zadziała, jeśli rozmiar okna zostanie zmieniony, ponieważ Twój padding-top jest stosowany tylko wtedy, gdy dokument jest gotowy.
Boatcoder

-2

margines można ustawić na podstawie rozdzielczości ekranu

@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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.