ChatGPT解决这个技术问题 Extra ChatGPT

twitter bootstrap navbar fixed top overlapping site

I am using bootstrap on my site and am having issues with the navbar fixed top. When I am just using the regular navbar, everything is fine. However, when i try to switch it to navbar fixed top, all the other content on the site shifts up like the navbar isn't there and the navbar overlaps it. here's basically how i laid it out:

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

i tried to copy bootstraps examples exactly but still having this issue only when using navbar fixed top. what am I doing wrong?


C
Community

Your answer is right in the docs:

Body padding required The fixed navbar will overlay your other content, unless you add padding to the top of the . Try out your own values or use our snippet below. Tip: By default, the navbar is 50px high. body { padding-top: 70px; } Make sure to include this after the core Bootstrap CSS.

and in the Bootstrap 4 docs...

Fixed navbars use position: fixed, meaning they’re pulled from the normal flow of the DOM and may require custom CSS (e.g., padding-top on the ) to prevent overlap with other elements.


But when you minimizing the window the navbar appears after 40px how should i handle it..
It appears after 40px probably because you don't "add this after the core Bootstrap CSS and before the optional responsive CSS."
This answer is true, but it only works well when you make the 40px padding a responsive styling, see Dan or Nick's answer.
See the answer from @qub1n if you do not want to add padding (or anything else).
@JerSchneid The example for navbar-fixed-top on w3schools.com shows the same behaviour. I'm inclined to call it a bug.
N
Nick Bisby

As others have stated adding a padding-top to body works great. But when you make the screen narrower (to cell phone widths) there is a gap between the navbar and the body. Also, a crowded navbar can wrap to a multi-line bar, overwriting some of the content again.

This solved these kinds of issues for me

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

This makes a 40px padding by default and 0px when under 768px width (which according to bootstrap's docs is the cell phone layout cutoff where the gap would be created)


Does this solution also go between the core Bootstrap CSS and the responsive CSS imports? I'm still seeing the gap when the window width is less than 980. I'm guessing the later import of the responsive CSS overrides. If I move this solution under the responsive CSS import, then I still get the body padding, plus an extra line in the menu bar.
I'm using Twitter Bootstrap 2.3.2. I noticed the doc no longer contains the 40px suggestion, though the need still exists.
Eh, the 40px suggestion is still there, it just moved. Sorry for the comment spam.
by Bootstrap 3.+ body { padding-top: 40px; } is enough
This solution is on the right track. Simply putting padding in the body, as documented, is not enough, even on 3.+. With the right combination of media queries the desired effect can be achieved as the navbar wraps with browser re-sizing. In my case I need to change the padding at 1148px, 900px, and 768px widths.
c
catsky

a much more handy solution for your reference, it works perfect in all of my projects:

change your first line from

.navbar.navbar-fixed-top

to

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

are you just trolling? or have i overseen something?
How did this get 10 upvotes? navbar-default just adds color and background color...
navbar-static-top is the the change and it worked for me. Thanks!
navbar-static-top fixed it for me as well. Least intrusive.
This works if you don't need the navbar to be always visible on top of the screen. The navbar-static-top is not fixed, it scrolls with the screen. This exemplifies the different navbar styles: getbootstrap.com/docs/3.3/examples/navbar-static-top
s
shivampip

Just change fixed-top with sticky-top. this way you won't have to calculate the padding.
And it works!!


Also note that .sticky-top uses position: sticky, which isn’t fully supported in every browser. See - getbootstrap.com/docs/4.5/components/navbar/#placement
This looks like a repeat answer. Someone put this in 2018.
Similar result as fixed-top. Does an overlay.
R
Rick

The solution for Bootstrap 4, it works perfect in all of my projects:

change your first line from

navbar-fixed-top

to

sticky-top

Bootstrap documentation reference

About time they did this right :D


Some people might use fixed-top in order to see the links as you scroll down the page; though this feature could be useful if you don't care about that :)
Also note that .sticky-top uses position: sticky, which isn’t fully supported in every browser.
Other than the comments the others wrote, this does seem an updated way in comparison to the: body { padding-top: 70px; }. It is obviously way easier, but I will have to look to see if it works without issues.
Changing to sticky-top from fixed-top still leaves the site overlapping on the top. Definition is Position an element at the top of the viewport, from edge to edge, but only after you scroll past it..
A
Aram Paronikyan

@Ryan, you are right, hard-coding the height will make it work bad in case of custom navbars. This is the code I am using for BS 3.0.0 happily:

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

Instead of using parseInt on the css values of height, I just used $('#main-navbar').height(), but otherwise this was very helpful and solved my issue, thank you.
Unless your navbar is fixed height, this is what you need.
What is the height() jquery function in vanilla js? what is main-navbar related to which html element?
f
friism

This issue is known and there's a workaround in the twitter bootstrap site:

When you affix the navbar, remember to account for the hidden area underneath. Add 40px or more of padding to the . Be sure to add this after the core Bootstrap CSS and before the optional responsive CSS.

This worked for me:

body { padding-top: 40px; }

But when you minimizing the window the navbar appears after 40px how should i handle it..
yes, this solution doesn't work well on mobile screen sizes. In fact in wide-screen mode on my phone it basically renders the site useless.
what optional responsive CSS ? I've ever only used one (core) bootstrap CSS - I'm talking above version 3.7.x UPWARDS; was it split in different CSS's prior to version 3.7.x ?
D
Dan

I put this before the yield container:

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

I like this approach because it documents the hack needed to get it work, plus it also works for the mobile nav.

EDIT - this works much better:

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

J
Jason Butler

As I've posted in a similar question, I've had good success with creating a dummy non-fixed nav bar right before my real fixed nav bar.

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

The spacing works out great on all screen sizes.


This is what we do.. places the body content in exactly the correct spot without any js code, guessing or anything. .
Thid deserves way more upvotes, Works perfectly fine, is ugly as hell but only the code :D
Thanks, this is a much more elegant solution than top padding or margin pixels and stuff...
Unfortunately this doesn't work for mobile, when navs get into 1 column.
T
Tomas Kubes

The problem is with navbar-fixed-top, which will overlay your content unless specify body-padding. No solution provided here works in 100% cases. The JQuery solution blink/shift the page after the page is loaded, which looks weird.

The real solution for me is not to use navbar-fixed-top, but 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>

Yes, that's better, because the padding of the body is dynamic for each screen size, their solution is not good.
But then there's a strip of blank white space above the navbar.
R
Ryan

All the previous solutions hard-code 40 pixels specifically into the html or CSS in one fashion or another. What if the navbar contains a different font-size or an image? What if I have a good reason not to mess with the body padding in the first place? I have been searching for a solution to this problem, and here is what I came up with:

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

You can move it up or down by adjusting the '1'. It seems to work for me regardless of the size of the content in the navbar, before and after resizing.

I am curious what others think about this: please share your thoughts. (It will be refactored as not to repeat, btw.) Besides using jQuery, are there any other reasons not to approach the problem this way? I've even got it working with a secondary navbar like this:

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

PS: Above is on Bootstrap 2.3.2 - will it work in 3.x As long as the generic class names remain... in fact, it should work independent of bootstrap, right?

EDIT: Here is a complete jquery function that handles two stacked, responsive fixed navbars of dynamic size. It requires 3 html classes(or could use id's): user-top, admin-top, and 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'
        });
});

Just FYI I am using this and it works great, but for some odd reason if I have two navbars, one normal size and one for small screens it only works on the bigger one?
@LiamDawe maybe you have more than one '.user-top' (for example) on the page, in which case the .height() might get confused...?
O
Oliver Konig

For handling wrapping lines in menu-bar, apply an id to the navbar, like this:

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

and add this small script in the head after including the jquery, like this:

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

That way, the top-padding of the body gets automatically adjusted.


I had to change the second reference to height in your example to be $('#topnavbar').height() and then this worked perfectly for me. Thanks!
Thanks for the comment! I fixed it in the answer.
This is the best solution I have come across that works on the PC, iOS, Android - all devices. All others are either hard-coded pixel values or too lengthy and do not work across all devices.
Nice solution. I was having some small offsets that were not being taken into account in the calculation. I guess it was because my navigation bar was having some margins. I chose to change the height() call for a outerHeight() call instead to take this into consideration.
I
IamButtman

use this class inside nav tag

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

For bootstrap 4


I'll never know why it was downvoted, since it was working for me and all others.
This is correct. The only issue is that, at the docs, it say "The .sticky-top utility uses CSS’s position: sticky, which isn’t fully supported in all browsers"
this is definitely the one that did it for me.
Maybe was down-voted because, like another answer here, it has already been said.
g
gasolin

for Bootstrap 3.+ , I'd use following CSS to fix navbar-fixed-top and the anchor jump overlapped issue based on 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; 
}

Same issue, nice answer.
V
Venkat Kotra

All you have to do is

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

C
Community

Further to Nick Bisby's answer, if you get this problem using HAML in rails and you have applied Roberto Barros' fix here:

I replaced the require in the "bootstrap_and_overrides.css" to: =require twitter-bootstrap-static/bootstrap.css.erb

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

... you need to put the body CSS before the require statement as follows:

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

If the require statement is before the body CSS, it will not take effect.


d
developer10

I would do this:

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

This should make sure the nav block doesn't stretch downpage and covers the page content.


X
X 47 48 - IR

This works and looks good for me.

<body class="pt-5 mt-4">....</body>

Tbh that looks like tailwind to me. Not everyone uses 2 frameworks at the same time. I just use bootstrap alone.
@CheesusToast It's Bootstrap (V5 and V4)
Right ok, my bad. It just looked purely tailwind, so I am a bit behind the times with bootstrap then. I just checked and yes they use pt etc now.
T
TTbooster

I just wrapped the navbar in a

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

No fancy hocus pocus but it worked..


Your answer is unclear and fails to address the issue. What does nav-? ?? represent?