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?

GeekedOut
źródło
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.

Akuta
źródło
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;
  }
}
Spajus
źródło
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.

gtrak
źródło
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">
catsky
źródło
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);        
});
Aram Paronikyan
źródło
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.

Jason Butler
źródło
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; }

Mola B.
źródło
6

Szablon startowy css bootstrap v4 używa:

body {
  padding-top: 5rem;
}
Martijn Burger
źródło
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" />
Nabil Kadimi
źródło
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.

Eldiyar Talantbek
źródło
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);
    });
  })
Michael Cole
źródło
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 ...

Boatcoder
źródło
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

Abhilash
źródło
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">
Ultroman the Tacoman
źródło
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;
}
wentylator internetowy
źródło
0

Dodaj:

.navbar {
  position: relative;
}
imcoder
źródło
0

powinieneś dodać

#page {
  padding-top: 65px
}

aby nie zniszczyć lepkiej stopki lub czegoś innego

Sebastian Viereck
źródło
-1

Dodaj do swojego JS:

jQuery(document).ready(function($) {
  $("body").css({
    'padding-top': $(".navbar").outerHeight() + 'px'
  })
});
Cottonova
źródło
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;
}
BradDaley
źródło