Twitter bootstrap navbar fisso superiore sito sovrapposto


347

Sto usando bootstrap sul mio sito e sto riscontrando problemi con la barra fissa superiore. Quando sto solo usando la normale barra di navigazione, va tutto bene. Tuttavia, quando provo a passare a navbar fixed top, tutti gli altri contenuti del sito si spostano come se la barra di navigazione non fosse presente e la barra di navigazione si sovrapponga. ecco praticamente come l'ho presentato:

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

ho provato a copiare esattamente gli esempi di bootstrap ma continuando a riscontrare questo problema solo quando si utilizzava la barra fissa in alto. Che cosa sto facendo di sbagliato?

Risposte:


527

La tua risposta è proprio nei documenti :

Imbottitura del corpo richiesta

La barra di navigazione fissa sovrapporrà gli altri tuoi contenuti, a meno che tu non li aggiunga paddingall'inizio <body>. Prova i tuoi valori o usa il nostro frammento di seguito. Suggerimento: per impostazione predefinita, la barra di navigazione è alta 50 px.

body { padding-top: 70px; }

Assicurati di includerlo dopo il core Bootstrap CSS.

e nei documenti Bootstrap 4 ...

Le navette fisse usano la posizione: fisse, il che significa che sono estratte dal normale flusso del DOM e potrebbero richiedere CSS personalizzati (ad esempio, padding-top sul) per evitare la sovrapposizione con altri elementi.


16
Ma quando si minimizza la finestra, dopo 40px appare la barra di navigazione come devo gestirla ..
Aravindhan,

5
Appare dopo 40px probabilmente perché non "aggiungi questo dopo il CSS Bootstrap di base e prima del CSS reattivo opzionale".
Collimarco,

1
Questa risposta è vera, ma funziona bene solo quando rendi l'imbottitura 40px uno stile reattivo, vedi la risposta di Dan o Nick.
Tony Bathgate,

1
Vedi la risposta da @ qub1n se non vuoi aggiungere il padding (o qualsiasi altra cosa).
scharfmn,

2
@JerSchneid L'esempio per navbar-fixed-top su w3schools.com mostra lo stesso comportamento. Sono propenso a chiamarlo un bug.
Tony Martin,

125

Come altri hanno già detto, l'aggiunta di una parte superiore imbottita al corpo funziona alla grande. Ma quando restringi lo schermo (alle larghezze del cellulare) c'è uno spazio tra la barra di navigazione e il corpo. Inoltre, una barra di navigazione affollata può passare a una barra a più righe, sovrascrivendo nuovamente parte del contenuto.

Questo ha risolto questo tipo di problemi per me

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

Questo rende un'imbottitura 40px per impostazione predefinita e 0px quando la larghezza è inferiore a 768px (che secondo i documenti di bootstrap è il taglio del layout del telefono cellulare in cui verrà creato il divario)


1
Questa soluzione va anche tra il core Bootstrap CSS e le importazioni CSS reattive? Sto ancora vedendo il divario quando la larghezza della finestra è inferiore a 980. Suppongo che la successiva importazione delle sostituzioni CSS reattive. Se sposto questa soluzione sotto l'importazione CSS reattiva, ottengo ancora il riempimento del corpo, oltre a una linea aggiuntiva nella barra dei menu.
pigrizia

Sto usando Twitter Bootstrap 2.3.2. Ho notato che il documento non contiene più il suggerimento 40px, anche se la necessità esiste ancora.
pigrizia

1
Eh, il suggerimento 40px è ancora lì, si è appena spostato. Ci scusiamo per il commento spam.
bradipo

3
di Bootstrap 3. + body { padding-top: 40px; }è abbastanza
andilabs

8
Questa soluzione è sulla buona strada. Mettere semplicemente l'imbottitura nel corpo, come documentato, non è sufficiente, anche su 3. +. Con la giusta combinazione di query multimediali l'effetto desiderato può essere ottenuto man mano che la barra di navigazione si avvolge con il ridimensionamento del browser. Nel mio caso ho bisogno di cambiare l'imbottitura con larghezze di 1148 px, 900 px e 768 px.
John McCann,

34

una soluzione molto più utile per il tuo riferimento, funziona perfettamente in tutti i miei progetti:

cambia la tua prima riga da

.navbar.navbar-fixed-top

per

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

1
stai solo trollando? o ho supervisionato qualcosa?
chyno,

Come hanno ottenuto 10 voti positivi? navbar-default aggiunge solo colore e colore di sfondo ...
Denny Mueller,

2
navbar-static-top è il cambiamento e ha funzionato per me. Grazie!
kevthanewversi, il

1
navbar-static-top lo ha riparato anche per me. Almeno invadente.
xpagesbeast

3
Funziona se non hai bisogno della barra di navigazione per essere sempre visibile nella parte superiore dello schermo. Navbar-static-top non è fisso, scorre con lo schermo. Questo esemplifica i diversi stili di barra di navigazione
Victor Ionescu,

26

Questo problema è noto e esiste una soluzione alternativa nel sito Twitter Bootstrap:

Quando apponi la barra di navigazione, ricorda di tenere conto dell'area nascosta sottostante. Aggiungi 40px o più di imbottitura al file <body>. Assicurati di aggiungere questo dopo il CSS di Bootstrap principale e prima del CSS reattivo opzionale.

Questo ha funzionato per me:

body { padding-top: 40px; }

9
Ma quando si minimizza la finestra, dopo 40px appare la barra di navigazione come devo gestirla ..
Aravindhan,

1
sì, questa soluzione non funziona bene su schermi mobili. Infatti in modalità widescreen sul mio telefono rende sostanzialmente inutile il sito.
Tony Bathgate,

quale CSS reattivo opzionale? Ho mai usato solo un (core) bootstrap CSS - Sto parlando sopra la versione 3.7.x UPWARDS; era diviso in diversi CSS precedenti alla versione 3.7.x?
Joedotnot,

26

@Ryan, hai ragione, codificare con difficoltà l'altezza lo farà funzionare male in caso di navbar personalizzati. Questo è il codice che sto usando felicemente per 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
Invece di utilizzare parseInti valori CSS di altezza, ho appena usato $('#main-navbar').height(), ma per il resto questo è stato molto utile e ha risolto il mio problema, grazie.
Tylerwal,

A meno che la barra di navigazione non sia ad altezza fissa, questo è ciò di cui hai bisogno.
CraigP

21

L'ho messo prima del contenitore di resa:

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

Mi piace questo approccio perché documenta l'hacking necessario per farlo funzionare, inoltre funziona anche per il navigatore mobile.

EDIT - funziona molto meglio:

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

16

Il problema è con navbar-fixed-top, che sovrapporrà i tuoi contenuti a meno che non specifichi il body-padding. Nessuna soluzione fornita qui funziona nel 100% dei casi. La soluzione JQuery lampeggia / sposta la pagina dopo che la pagina è stata caricata, il che sembra strano.

La vera soluzione per me non è usare navbar-fixed-top, ma 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
Sì, è meglio, poiché l'imbottitura del corpo è dinamica per ogni dimensione dello schermo, la loro soluzione non è buona.
Ronen Festinger

Ma poi c'è una striscia di spazio bianco vuoto sopra la barra di navigazione.
user2075599

16

Come ho pubblicato in una domanda simile, ho avuto un buon successo con la creazione di una barra di navigazione fittizia non fissa proprio prima della mia vera barra di navigazione fissa.

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

La spaziatura funziona alla grande su tutte le dimensioni dello schermo.


Questo è ciò che facciamo .. posiziona il contenuto del corpo esattamente nel punto corretto senza alcun codice js, indovinando o altro. .
FredArters,

1
Merita molto più voti, Funziona perfettamente, è brutto da
morire

Grazie, questa è una soluzione molto più elegante rispetto ai pixel di imbottitura o margine superiore e cose del genere ...
Pedro Reis

3
Sfortunatamente questo non funziona per i dispositivi mobili, quando i navigatori entrano in 1 colonna.
Pedro Reis

16

La soluzione per Bootstrap 4, funziona perfettamente in tutti i miei progetti:

cambia la tua prima riga da

navbar-fixed-top

per

sticky-top

Riferimenti alla documentazione di Bootstrap

A proposito di tempo hanno fatto bene: D


Alcune persone potrebbero utilizzare la parte fissa per visualizzare i collegamenti mentre si scorre la pagina; anche se questa funzione potrebbe essere utile se non ti interessa :)
knowledge_is_power

Si noti inoltre che .sticky-top utilizza position: sticky, che non è completamente supportato in tutti i browser.
live-love,

14

Tutte le precedenti soluzioni codificano 40 pixel in modo specifico nell'html o CSS in un modo o nell'altro. Cosa succede se la barra di navigazione contiene una dimensione del carattere o un'immagine diversa? Cosa succede se ho una buona ragione per non pasticciare con l' imbottitura del corpo in primo luogo? Ho cercato una soluzione a questo problema, ed ecco cosa mi è venuto in mente:

$(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'});
});

Puoi spostarlo verso l'alto o verso il basso regolando '1'. Sembra funzionare per me indipendentemente dalle dimensioni del contenuto nella barra di navigazione, prima e dopo il ridimensionamento.

Sono curioso di sapere cosa ne pensano gli altri: per favore, condividi i tuoi pensieri. (Sarà refactored per non ripetere, tra l'altro.) Oltre ad usare jQuery, ci sono altri motivi per non affrontare il problema in questo modo? Ho persino funzionato con una barra di navigazione secondaria come questa:

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

PS: sopra è su Bootstrap 2.3.2 - funzionerà in 3.x Fintanto che i nomi di classe generici rimangono ... in effetti, dovrebbe funzionare indipendentemente da bootstrap, giusto?

EDIT: Ecco una funzione jquery completa che gestisce due navbar fissi impilati, responsive di dimensioni dinamiche. Richiede 3 classi html (o potrebbe usare l'id): user-top, admin-top e 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'
        });
});

FYI Sto usando questo e funziona benissimo, ma per qualche strana ragione se ho due navbar, una dimensione normale e una per schermi piccoli funziona solo su quella più grande?
NaughtySquid,

@LiamDawe forse hai più di un '.user-top' (per esempio) sulla pagina, nel qual caso il .height () potrebbe confondersi ...?
Ryan,

14

Basta cambiare fixed-topcon sticky-top. in questo modo non dovrai calcolare l'imbottitura.
E funziona !!


4
Secondo BS4, questa dovrebbe essere la risposta corretta. +1
Pedro Sousa,

11

Per gestire le linee di avvolgimento nella barra dei menu, applica un ID alla barra di navigazione, in questo modo:

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

e aggiungi questo piccolo script nella testa dopo aver incluso jquery, in questo modo:

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

In questo modo, l'imbottitura superiore del corpo viene regolata automaticamente.


Ho dovuto modificare il secondo riferimento all'altezza nel tuo esempio per essere $ ('# topnavbar'). Height () e quindi questo ha funzionato perfettamente per me. Grazie!
spietato

1
Grazie per il commento! L'ho risolto nella risposta.
Oliver Konig,

Questa è la migliore soluzione che ho trovato che funziona su PC, iOS, Android - tutti i dispositivi. Tutti gli altri sono valori di pixel hardcoded o troppo lunghi e non funzionano su tutti i dispositivi.
Oracular Man,

Bella soluzione. Avevo delle piccole compensazioni che non venivano prese in considerazione nel calcolo. Immagino che fosse perché la mia barra di navigazione aveva dei margini. Ho scelto di cambiare la chiamata height () per una chiamata outerHeight () invece di tenerne conto.
Leonardo Santos,

4

per Bootstrap 3. +, utilizzerei il seguente CSS per correggere navbar-fixed-top e il problema dell'ancoraggio si sovrapponeva basato su 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; 
}

Stesso problema, bella risposta.
McGrady,

2

usa questa classe all'interno del tag nav

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

Per bootstrap 4


Non saprò mai perché è stato sottoposto a downgrade, dato che funzionava per me e tutti gli altri.
Kynginthenorth,

Questo è corretto. L'unico problema è che, in base ai documenti, si dice "L'utilità .sticky-top utilizza la posizione CSS: appiccicosa, che non è pienamente supportata in tutti i browser"
José,

1

Tutto quello che devi fare è

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

0

Oltre alla risposta di Nick Bisby, se riscontri questo problema usando HAML nelle rotaie e hai applicato la correzione di Roberto Barros qui:

Ho sostituito il requisito nel "bootstrap_and_overrides.css" a:

= richiede twitter-bootstrap-static / bootstrap.css.erb

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

... devi mettere il CSS del corpo prima dell'istruzione request come segue:

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

Se l'istruzione request è prima del CSS del corpo, non avrà effetto.


0

Vorrei fare questo:

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

Questo dovrebbe assicurarsi che il blocco nav non si estenda verso il basso e copre il contenuto della pagina.


-4

Ho appena avvolto la barra di navigazione in a

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

Nessuna fantasia ad hoc ma ha funzionato ..


La tua risposta non è chiara e non riesce a risolvere il problema. Cosa nav-? ??rappresenta?
fragilewindows
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.