twitter bootstrap导航栏固定顶部重叠站点


347

我在网站上使用引导程序,并且导航栏固定顶部出现问题。当我只使用常规导航栏时,一切都很好。但是,当我尝试将其切换到导航栏固定顶部时,该网站上的所有其他内容都会向上移动,就像导航栏不存在并且导航栏与之重叠一样。我基本上是这样布置的:

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

我试图完全复制引导程序示例,但仅在使用navbar fixed top时仍然存在此问题。我究竟做错了什么?

Answers:


527

您的答案是正确的docs

需要身体填充

固定的导航栏将覆盖您的其他内容,除非您将其添加padding到的顶部<body>。试用您自己的值或使用下面的代码段。提示:默认情况下,导航栏的高度为50px。

body { padding-top: 70px; }

确保在核心Bootstrap CSS 之后添加此名称。

并在Bootstrap 4文档中...

固定的导航栏使用位置:固定,这意味着它们是从DOM的正常流程中拉出的,并且可能需要自定义CSS(例如上的padding-top)以防止与其他元素重叠。


16
但是,当你最小化窗口后40像素导航栏出现我应该如何处理呢..
Aravindhan

5
它出现在40像素之后,可能是因为您没有“在核心Bootstrap CSS之后和可选的响应CSS之前添加此代码”。
collimarco 2012年

1
这个答案是正确的,但是只有当您使40px填充成为响应式样式时,它才能很好地起作用,请参见Dan或Nick的答案。
Tony Bathgate

1
如果您不想添加填充(或其他内容),请参阅@ qub1n的答案。
2015年

2
@JerSchneid w3schools.com上的navbar-fixed-top的示例显示了相同的行为。我倾向于称它为错误。
托尼·马丁

125

正如其他人所说,在身体上添加填充顶部效果很好。但是,当您将屏幕变窄(以手机宽度为单位)时,导航栏和机身之间会出现间隙。同样,拥挤的导航栏可以包装到多行栏,再次覆盖某些内容。

这为我解决了这类问题

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

默认情况下,这会产生40px的填充,而在768px宽度以下时会填充0px(根据bootstrap的文档,这是将在其中创建间隙的手机布局截止点)


1
此解决方案是否也在核心Bootstrap CSS和响应CSS导入之间使用?当窗口宽度小于980时,我仍然看到间隙。我猜测稍后会导入响应CSS覆盖。如果我将此解决方案移至自适应CSS导入下,那么我仍然会得到正文填充,在菜单栏中了一行。
树懒熊

我正在使用Twitter Bootstrap 2.3.2。我注意到该文档不再包含40px的建议,尽管这种需求仍然存在。
懒惰的猫,

1
嗯,40px的建议仍然存在,它只是移动了。对不起,此评论为垃圾邮件。
懒惰的猫,

3
由Bootstrap 3. + body { padding-top: 40px; }够了
andilabs 2014年

8
这个解决方案是正确的。如所记录的,仅将填充物放在身体上是不够的,即使在3. +上也是如此。通过正确组合媒体查询,可以在导航栏调整浏览器大小的同时实现预期的效果。在我的情况下,我需要更改1148px,900px和768px宽度的填充。
John McCann 2014年

34

一个更方便的解决方案供您参考,它在我的所有项目中都非常完美:

从更改第一行

.navbar.navbar-fixed-top

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

1
你只是在拖钓吗?还是我监督了什么?
chyno

这是如何获得10次投票的?导航栏默认仅添加颜色和背景色...
丹尼·穆勒

2
navbar-static-top是更改,它对我有用。谢谢!
kevthanewversi

1
navbar-static-top也为我修复了该问题。最少打扰。
xpagesbeast

3
如果您不需要导航栏始终在屏幕顶部可见,则此方法有效。navbar-static-top不固定,它随着屏幕滚动。这体现了不同的导航栏样式:getbootstrap.com/docs/3.3/examples/navbar-static-top
Victor Ionescu,

26

这个问题是已知的,并且在twitter引导站点中有一种解决方法:

当您粘贴导航栏时,请记住考虑下面的隐藏区域。向中添加40px或更多的填充<body>。确保将其添加到核心Bootstrap CSS之后和可选的响应CSS之前。

这为我工作:

body { padding-top: 40px; }

9
但是,当您最小化窗口时,导航栏会在40px之后出现,我应该如何处理
。.– Aravindhan 2012年

1
是的,此解决方案不适用于手机屏幕尺寸。实际上,在手机的宽屏模式下,它基本上使该站点无用。
Tony Bathgate 2013年

什么可选的响应式CSS?我曾经只使用过一个(核心)引导CSS-我说的是3.7.x以上版本;是在3.7.x版之前的其他CSS中拆分的吗?
joedotnot

26

@Ryan,您是对的,对高度进行硬编码会使其在自定义导航栏的情况下无法正常工作。这是我愉快地用于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
而不是使用parseInt上高度的CSS值,我只是用$('#main-navbar').height(),但在其他方面,这是非常有帮助,解决了我的问题,谢谢。
tylerwal

除非您的导航栏是固定高度,否则这就是您所需要的。
CraigP

21

我把它放在yield容器之前:

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

我喜欢这种方法,因为它记录了使其工作所需的hack,此外它还适用于移动导航。

编辑-效果更好:

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

16

问题在于navbar-fixed-top,除非指定正文填充,否则它将覆盖您的内容。在100%的情况下,此处提供的解决方案均无效。页面加载后,JQuery解决方案使页面闪烁/移动,这看起来很奇怪。

对我而言,真正的解决方案不是使用navbar-fixed-top,而是使用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
是的,这样更好,因为每种屏幕尺寸的主体填充都是动态的,因此其解决方案不是很好。
罗南·费斯汀格

但是,导航栏上方有一排空白。
user2075599

16

正如我在类似问题中发布的那样,我在真正的固定导航栏之前创建了一个虚拟的非固定导航栏取得了成功。

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

在所有屏幕尺寸上,间距都很好。


这就是我们所做的..将正文内容完全正确地放置在没有任何js代码,猜测或任何内容的地方。。
FredArters

1
Thid应该得到更多支持,工作得非常好,很难受,但只有代码:D
JRsz

谢谢,这是比顶部填充或边距像素和填充物更优雅的解决方案……
Pedro Reis

3
不幸的是,当导航进入1列时,这不适用于移动设备。
佩德罗·雷斯

15

Bootstrap 4的解决方案在我的所有项目中均能完美运行:

从更改第一行

navbar-fixed-top

sticky-top

Bootstrap文档参考

大约他们做对了:D


某些人可能会使用固定顶部,以便在您向下滚动页面时查看链接。尽管如果您不关心此功能,该功能可能会很有用:)
Knowledge_is_power

另请注意,.sticky-top使用position:sticky,并非在所有浏览器中都完全支持。
live-love

14

以前的所有解决方案都以一种或另一种方式将40像素专门硬编码到html或CSS中。如果导航栏包含其他字体大小或图像,该怎么办?如果我有充分的理由首先不弄乱身体填充怎么办?我一直在寻找解决此问题的方法,这是我想到的:

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

您可以通过调整“ 1”上下移动它。大小调整前后,无论导航栏中内容的大小如何,它似乎都对我有用。

我很好奇其他人对此有何看法:请分享您的想法。(顺便说一句,它将被重构为不再重复)。除了使用jQuery,还有其他原因不能以这种方式解决问题吗?我什至可以使用辅助导航栏来像这样:

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

PS:上面的内容在Bootstrap 2.3.2上-它将在3.x中工作,只要保留通用类名...实际上,它应该独立于引导程序工作,对吗?

编辑:这是一个完整的jquery函数,可以处理两个堆叠的,动态大小的响应式固定导航栏。它需要3个html类(或可以使用id):user-top,admin-top和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'
        });
});

仅供参考,我正在使用它,并且效果很好,但是由于某些奇怪的原因,如果我有两个导航栏,一个导航栏正常,而一个用于小屏幕,它只能在较大的导航栏上工作?
NaughtySquid 2014年

@LiamDawe也许您在页面上有多个“ .user-top”(例如),在这种情况下,.height()可能会感到困惑...?
Ryan


11

要在菜单栏中处理换行,请向导航栏应用一个id,如下所示:

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

并在包含jquery之后在头中添加此小脚本,如下所示:

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

这样,主体的顶部填充会自动调整。


在您的示例中,我不得不将对高度的第二个引用更改为$('#topnavbar')。height(),然后这对我来说非常有效。谢谢!
不知疲倦的2014年

1
感谢您的评论!我将其固定在答案中。
奥利弗·科尼格

这是我遇到的最好的解决方案,适用于PC,iOS,Android-所有设备。所有其他像素要么是硬编码的像素值,要么太长,因此无法在所有设备上使用。
Oracular Man

不错的解决方案。我有一些小的偏移量,在计算中没有考虑在内。我想那是因为我的导航栏有一些边距。我选择将height()调用更改为externalHeight()调用,以考虑到这一点。
莱昂纳多·桑托斯

4

对于Bootstrap 3. +,我将使用以下CSS来基于https://github.com/twbs/bootstrap/issues/1768修复navbar-fixed-top和锚跳转重叠的问题

/* 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; 
}

同样的问题,很好的答案。
麦迪

2

在nav标签内使用此类

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

对于bootstrap 4


我永远不会知道为什么它被否决了,因为它对我和其他所有人都有效。
Kynginthenorth

这是对的。唯一的问题是,在文档,它说:“该.sticky顶工具使用CSS的位置:粘粘的,这是不完全在所有浏览器都支持”
何塞


0

除了Nick Bisby的答案,如果您在轨道中使用HAML遇到此问题,并且已在此处应用Roberto Barros的修复程序:

我将“ bootstrap_and_overrides.css”中的require替换为:

=需要twitter-bootstrap-static / bootstrap.css.erb

(参见https://github.com/seyhunak/twitter-bootstrap-rails/issues/91

...您需要将主体CSS放在require语句之前,如下所示:

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

如果require语句在正文CSS之前,则不会生效。


0

我会这样做:

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

这应确保nav块不会拉长页面范围并覆盖页面内容。


-4

我只是将导航栏包裹在一个

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

没有花哨的轨迹,但是奏效了。


您的答案不清楚,无法解决该问题。什么是nav-? ??代表?
脆弱的窗户
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.