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.