twitter bootstrap pasek nawigacji naprawiono nakładającą się stronę


347

Korzystam z bootstrap na mojej stronie i mam problemy ze stałym paskiem nawigacyjnym. Kiedy używam zwykłego paska nawigacyjnego, wszystko jest w porządku. Jednak gdy próbuję zmienić go na stały pasek nawigacyjny, cała inna zawartość witryny przesuwa się w górę, tak jakby paska nawigacyjnego nie było, a pasek nawigacyjny nakłada się na niego. oto w zasadzie jak to ułożyłem:

.navbar.navbar-fixed-top
  .navbar-inner
    .container
.container
  .row
    //yield content

Próbowałem dokładnie skopiować przykłady bootstraps, ale ten problem nadal występuje tylko wtedy, gdy korzystam z paska nawigacyjnego naprawionego u góry. Co ja robię źle?

Odpowiedzi:


527

Twoja odpowiedź jest w dokumentach :

Wymagana wyściółka ciała

Naprawiony pasek nawigacyjny będzie nakładał inne treści, chyba że dodasz paddingje u góry <body>. Wypróbuj własne wartości lub skorzystaj z naszego fragmentu poniżej. Wskazówka: domyślnie pasek nawigacyjny ma wysokość 50 pikseli.

body { padding-top: 70px; }

Pamiętaj, aby dołączyć to po głównym CSS Bootstrap.

oraz w dokumentach Bootstrap 4 ...

Naprawiono użycie pozycji pasków nawigacyjnych: naprawiono, co oznacza, że ​​są wyciągane z normalnego przepływu DOM i mogą wymagać niestandardowego CSS (np. Pad-top na), aby zapobiec nakładaniu się na inne elementy.


16
Ale kiedy minimalizujesz okno, pasek nawigacyjny pojawia się po 40px, jak mam go obsługiwać.
— Aravindhan

5
Pojawia się po 40px prawdopodobnie dlatego, że „nie dodajesz tego po podstawowym CSS Bootstrap i przed opcjonalnym responsywnym CSS”.
— collimarco

1
Ta odpowiedź jest prawdziwa, ale działa dobrze tylko wtedy, gdy wypełnienie 40px jest responsywnym stylem, zobacz odpowiedź Dana lub Nicka.
— Tony Bathgate

1
Zobacz odpowiedź z @ qub1n, jeśli nie chcesz dodawać wypełnienia (lub czegokolwiek innego).
— scharfmn

2
@JerSchneid Przykład navbar-fixed-top na w3schools.com pokazuje to samo zachowanie. Jestem skłonny nazwać to błędem.
— Tony Martin

125

Jak inni stwierdzili, dodanie wyściółki do ciała działa świetnie. Ale kiedy zwężasz ekran (do szerokości telefonu komórkowego), pomiędzy paskiem nawigacyjnym a ciałem jest przerwa. Ponadto zatłoczony pasek nawigacyjny może zawijać się do paska wieloliniowego, zastępując ponownie część zawartości.

To rozwiązało dla mnie tego rodzaju problemy

body { padding-top: 40px; }
@media screen and (max-width: 768px) {
    body { padding-top: 0px; }
}

Powoduje to domyślnie wypełnienie o wielkości 40 pikseli i 0 pikseli przy szerokości poniżej 768 pikseli (co zgodnie z dokumentami bootstrap to odcięcie układu telefonu komórkowego, w którym utworzona zostanie przerwa)


1
Czy to rozwiązanie obejmuje także podstawowy CSS Bootstrap i responsywny import CSS? Nadal widzę lukę, gdy szerokość okna jest mniejsza niż 980. Domyślam się, że późniejszy import responsywnych CSS zastępuje. Jeśli przeniosę to rozwiązanie w ramach responsywnego importu CSS, nadal otrzymuję wypełnienie nadwozia oraz dodatkową linię na pasku menu.
— slothbear

Używam Twitter Bootstrap 2.3.2. Zauważyłem, że dokument nie zawiera już sugestii 40 pikseli, choć potrzeba nadal istnieje.
— slothbear

1
Echa, sugestia 40 pikseli wciąż tam jest, po prostu się zmieniła. Przepraszamy za komentarz spam.
— slothbear

3
przez Bootstrap 3. + body { padding-top: 40px; }wystarczy
— andilabs

8
To rozwiązanie jest na dobrej drodze. Po prostu umieszczenie wypełnienia w ciele, jak udokumentowano, nie wystarczy, nawet na 3. +. Odpowiednia kombinacja zapytań o media pozwala uzyskać pożądany efekt, gdy pasek nawigacyjny owija się przy zmianie rozmiaru przeglądarki. W moim przypadku muszę zmienić wypełnienie przy szerokościach 1148px, 900px i 768px.
— John McCann,

34

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

zmień swój pierwszy wiersz z

.navbar.navbar-fixed-top

do

.navbar.navbar-default.navbar-static-top

1
po prostu trollujesz? czy coś nadzorowałem?
— chyno

Jak to uzyskało 10 głosów pozytywnych? domyślny pasek nawigacji dodaje tylko kolor i kolor tła ...
— Denny Mueller

2
navbar-static-top to zmiana, która zadziałała dla mnie. Dzięki!
— kevthanewversi

1
navbar-static-top naprawił to również dla mnie. Najmniej inwazyjne.
— xpagesbeast

3
Działa to, jeśli nie potrzebujesz, aby pasek nawigacyjny był zawsze widoczny na górze ekranu. Pasek nawigacyjny-static-top nie jest stały, przewija się wraz z ekranem. Jest to przykład różnych stylów paska nawigacyjnego: getbootstrap.com/docs/3.3/examples/navbar-static-top
— Victor Ionescu

26

Ten problem jest znany i istnieje obejście tego problemu w serwisie startowym Twittera:

Po zamocowaniu paska nawigacyjnego pamiętaj o uwzględnieniu ukrytego obszaru poniżej. Dodaj co najmniej 40 pikseli wypełnienia do <body>. Pamiętaj, aby dodać to po głównym CSS Bootstrap i przed opcjonalnym responsywnym CSS.

To działało dla mnie:

body { padding-top: 40px; }

9
Ale kiedy minimalizujesz okno, pasek nawigacyjny pojawia się po 40px, jak mam go obsługiwać.
— Aravindhan

1
tak, to rozwiązanie nie działa dobrze na ekranach mobilnych. W rzeczywistości w trybie szerokoekranowym na moim telefonie strona w zasadzie czyni ją bezużyteczną.
— Tony Bathgate

jaki opcjonalny responsywny CSS? Używałem tylko jednego (podstawowego) kodu ładującego CSS - mówię powyżej wersji 3.7.x W GÓRĘ; czy był podzielony na różne CSS przed wersją 3.7.x?
— joedotnot

26

@ Ryan, masz rację, twarde kodowanie wysokości sprawi, że będzie działać źle w przypadku niestandardowych pasków nawigacyjnych. Oto kod, z którego korzystam szczęśliwie dla 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);         
}); 

3
Zamiast używać parseIntwartości css wysokości, właśnie użyłem $('#main-navbar').height(), ale poza tym było to bardzo pomocne i rozwiązało mój problem, dziękuję.
— tylerwal

O ile pasek nawigacji nie ma stałej wysokości, właśnie tego potrzebujesz.
— CraigP,

21

Stawiam to przed pojemnikiem z plonem:

<div id="fix-for-navbar-fixed-top-spacing" style="height: 42px;">&nbsp;</div>

Podoba mi się to podejście, ponieważ dokumentuje włamanie potrzebne do jego działania, a także działa w przypadku mobilnej nawigacji.

EDYCJA - działa to znacznie lepiej:

@media (min-width: 980px) {
  body {
    padding-top: 60px;
    padding-bottom: 42px;
  }
}

16

Problem polega na tym, że pasek nawigacyjny jest przymocowany do góry, który nakłada się na zawartość, chyba że określono dopełnienie body. Żadne z podanych tutaj rozwiązań nie działa w 100% przypadkach. Rozwiązanie JQuery miga / przesuwa stronę po załadowaniu strony, co wygląda dziwnie.

Prawdziwym rozwiązaniem dla mnie nie jest użycie navbar-fixed-top, ale navbar-static-top.

.navbar { margin-bottom:0px;} //for jumtron support, see http://stackoverflow.com/questions/23911242/gap-between-navbar-and-jumbotron

<nav class="navbar navbar-inverse navbar-static-top">
...
</nav>

1
Tak, to lepiej, ponieważ wypełnienie korpusu jest dynamiczne dla każdego rozmiaru ekranu, ich rozwiązanie nie jest dobre.
— Ronen Festinger

Ale nad paskiem nawigacyjnym jest pasek pustej białej przestrzeni.
— user2075599

16

Jak napisałem w podobnym pytaniu, odniosłem duży sukces, tworząc fałszywy, nie naprawiony 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.


To jest to, co robimy ... umieszcza zawartość ciała we właściwym miejscu, bez kodu js, zgadywania lub czegokolwiek. .
— FredArters,

1
To zasługuje na znacznie więcej entuzjastów, działa idealnie, jest brzydkie jak diabli, ale tylko kod: D
— JRsz

Dzięki, jest to znacznie bardziej eleganckie rozwiązanie niż górne dopełnienie lub marginesy i tym podobne ...
— Pedro Reis

3
Niestety nie działa to na urządzeniach mobilnych, gdy nawigacje trafiają do 1 kolumny.
— Pedro Reis,

16

Rozwiązanie dla Bootstrap 4, działa idealnie we wszystkich moich projektach:

zmień swój pierwszy wiersz z

navbar-fixed-top

do

sticky-top

Dokumentacja bootstrapu

O czasie zrobili to dobrze: D


Niektóre osoby mogą używać fixed-top, aby zobaczyć linki podczas przewijania strony; chociaż ta funkcja może być przydatna, jeśli nie przejmujesz się tym :)
— Knowledge_is_power

Zauważ też, że .sticky-top używa position: sticky, co nie jest w pełni obsługiwane w każdej przeglądarce.
— live-love

14

Wszystkie poprzednie rozwiązania kodują 40 pikseli na stałe w HTML lub CSS w taki czy inny sposób. Co się stanie, jeśli pasek nawigacyjny zawiera inny rozmiar czcionki lub obraz? Co zrobić, jeśli mam dobry powód, aby nie zadzierać z wyściółką ciała ? Szukałem rozwiązania tego problemu i oto, co wymyśliłem:

$(document).ready(function(){
    $('.contentwrap') .css({'margin-top': (($('.navbar-fixed-top').height()) + 1 )+'px'});
    $(window).resize(function(){
        $('.contentwrap') .css({'margin-top': (($('.navbar-fixed-top').height()) + 1 )+'px'});
});

Możesz go przesuwać w górę lub w dół, dostosowując „1”. Wydaje mi się, że działa dla mnie niezależnie od rozmiaru zawartości paska nawigacyjnego, przed i po zmianie rozmiaru.

Jestem ciekaw, co myślą o tym inni: podziel się swoimi przemyśleniami. (Zostanie to zrefaktoryzowane, aby się nie powtarzało, btw.) Czy oprócz używania jQuery istnieją jeszcze inne powody, aby nie podejść do problemu w ten sposób? Mam go nawet z dodatkowym paskiem nawigacyjnym, takim jak ten:

$('.contentwrap') .css({'margin-top': (($('.navbar-fixed-top').height())
        + $('.admin-nav').height() + 1 )+'px'});

PS: Powyżej znajduje się na Bootstrap 2.3.2 - czy będzie działał w wersji 3.x Dopóki ogólne nazwy klas pozostaną ... w rzeczywistości powinno działać niezależnie od bootstrap, prawda?

EDYCJA: Oto pełna funkcja jquery, która obsługuje dwa skumulowane, responsywne stałe paski nawigacyjne o dynamicznym rozmiarze. Wymaga 3 klas HTML (lub mógłby użyć identyfikatorów): user-top, admin-top i contentwrap:

$(document).ready(function(){

    $('.admin-top').css({'margin-top':($('.user-top').height()+0)+'px'});
    $('.contentwrap') .css({'padding-top': (
        $('.user-top').height()
         + $('.admin-top').height()
         + 0 )+'px'
    });

    $(window).resize(function(){
        $('.admin-top').css({'margin-top':($('.user-top').height()+0)+'px'});
        $('.contentwrap') .css({'padding-top': (
            $('.user-top').height()
             + $('.admin-top').height()
             + 0 )+'px'
        });
});

Po prostu korzystam z tego i działa świetnie, ale z jakiegoś dziwnego powodu, jeśli mam dwa paski nawigacyjne, jeden normalny rozmiar i jeden dla małych ekranów, działa tylko na większym?
— NaughtySquid

@LiamDawe może na stronie jest więcej niż jeden „.serser top” (na przykład), w którym to przypadku .height () może się pomylić…?
— Ryan


11

Aby obsługiwać linie zawijania na pasku menu, zastosuj identyfikator na pasku nawigacyjnym, tak jak poniżej:

<div class="navbar navbar-default navbar-fixed-top" role="navigation" id="topnavbar">

i dodaj ten mały skrypt do głowy po dołączeniu jquery, w ten sposób:

<script>
    $(document).ready(function(){
        $(document.body).css('padding-top', $('#topnavbar').height() + 10);
        $(window).resize(function(){
            $(document.body).css('padding-top', $('#topnavbar').height() + 10);
        });
    });
</script>

W ten sposób górna wyściółka korpusu zostaje automatycznie dostosowana.


Musiałem zmienić drugie odniesienie do wysokości w twoim przykładzie na $ ('# topnavbar'). Height () i wtedy to działało idealnie dla mnie. Dzięki!
— bezwzględnie

1
Dziękuję za komentarz! Naprawiłem to w odpowiedzi.
— Oliver Konig

To najlepsze rozwiązanie, na jakie się natknąłem, które działa na PC, iOS, Android - wszystkie urządzenia. Wszystkie pozostałe są albo zakodowanymi na stałe wartościami w pikselach, albo są zbyt długie i nie działają na wszystkich urządzeniach.
— Oracular Man

Niezłe rozwiązanie. Miałem pewne niewielkie przesunięcia, które nie były uwzględniane w obliczeniach. Chyba dlatego, że mój pasek nawigacji miał pewne marginesy. Wybrałem zmianę wywołania height () dla wywołania outerHeight (), aby wziąć to pod uwagę.
— Leonardo Santos

4

w przypadku Bootstrap 3. + użyłbym następującego CSS, aby naprawić navbar-fixed-top, a problem z zakotwiczeniem skoku nakładał się na podstawie https://github.com/twbs/bootstrap/issues/1768

/* fix fixed-bar */
body { padding-top: 40px; }
@media screen and (max-width: 768px) {
  body { padding-top: 40px; }
}

/* fix fixed-bar jumping to in-page anchor issue */
*[id]:before { 
  display: block; 
  content: " "; 
  margin-top: -75px; 
  height: 75px; 
  visibility: hidden; 
}

Ten sam problem, ładna odpowiedź.
— McGrady,

2

użyj tej klasy w tagu nav

class = "navbar navbar-expand-lg navbar-light bg-light sticky-top "

Do bootstrap 4


Nigdy nie dowiem się, dlaczego został odrzucony, ponieważ działał dla mnie i wszystkich innych.
— Kynginthenorth,

To jest poprawne. Jedynym problemem jest to, że w dokumentacji napisano: „Narzędzie .sticky-top wykorzystuje pozycję CSS: lepki, który nie jest w pełni obsługiwany we wszystkich przeglądarkach”
— José

1

Wszystko co musisz zrobić to

@media (min-width: 980px) { body { padding-top: 40px; } } 

0

Zgodnie z odpowiedzią Nicka Bisby'ego, jeśli napotkasz ten problem przy użyciu HAML w szynach i zastosowałeś tutaj poprawkę Roberto Barrosa:

Wymieniłem wymaganie w „bootstrap_and_overrides.css” na:

= wymagają twitter-bootstrap-static / bootstrap.css.erb

(Zobacz https://github.com/seyhunak/twitter-bootstrap-rails/issues/91 )

... musisz umieścić treść CSS przed instrukcją request w następujący sposób:

@import "twitter/bootstrap/bootstrap";
body { padding-top: 40px; }
@import "twitter/bootstrap/responsive";
=require twitter-bootstrap-static/bootstrap.css.erb

Jeśli instrukcja wymaga przed CSS treści, nie zadziała.


0

Zrobiłbym to:

// add appropriate media query if required to target mobile nav only
.nav { overflow-y: hidden !important }

To powinno upewnić się, że blok nawigacyjny nie rozciąga się na dół strony i nie obejmuje zawartości strony.


-4

Właśnie owinąłem pasek nawigacyjny w

<div width="100%">
<div class="nav-? ??">
...
</nav>
</div>

Brak wymyślnego hokusa, ale zadziałało ..


Twoja odpowiedź jest niejasna i nie rozwiązuje problemu. Co nav-? ??reprezentuje?
— fragilewindows
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.