顶部导航栏阻止页面的顶部内容


296

我有这个Twitter Bootstrap代码

  <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>

但是,当我查看页面的开头时,导航栏阻止了页面顶部附近的某些内容。关于如何使它在查看页面顶部时将内容的其余部分降低的任何想法,以便使内容不会被导航栏阻止?



2
@ user2428107这个问题稍后发布。
jazzpi 2015年

Answers:


254

添加到您的CSS:

body { 
    padding-top: 65px; 
}

Bootstrap文档

除非您在正文顶部添加填充,否则固定的导航栏将覆盖您的其他内容。


11
请参阅以下@Spajus的其他答案,以了解如何为响应式Bootstrap编写此代码
Jason Capriotti 2012年

4
使用@media(最小宽度:980像素),{} {正文{padding-top:60px; }
泰德(Ted)

3
尽管其他答案确实能更雄辩地解决此问题,但这是Bootstrap文档中的“固定
导航栏”

1
如果用户的屏幕更窄或仅调整窗口大小,该怎么办?扩展的导航栏部分将再次阻止最上面的内容。
Konrad Viltersten '16

366

如果您使用的是响应式引导程序,则仅添加这样的填充是不够的。在这种情况下,当您调整窗口大小时,页面顶部和导航栏之间会出现间隙。正确的解决方案如下所示:

body {
  padding-top: 60px;
}
@media (max-width: 979px) {
  body {
    padding-top: 0px;
  }
}

19
完善。这确实应该以某种方式集成到引导程序中。您应该分叉并提交拉取请求。
brittohalloran

1
好的解决方案,但是仍然有一些问题没有解决。看一下我刚才提出的这个问题,看看是否有人可以帮上忙。stackoverflow.com/questions/12763707/...
ElPiter

27
更加简洁:@media(最小宽度:981px){body {padding-top:60px; }
泰德(Ted)2012年

4
@Ted对我来说必须是最小宽度:980像素;-)
white_gecko 2012年

3
@white_gecko哈哈。是的 980只是想成为一点特别的独特而已;-)
Ted

143

对于自举3,类navbar-static-top而不是navbar-fixed-top防止这个问题,除非你需要导航栏始终可见。


2
但是,此方法可能会在导航栏上方保留一些空间。您可能需要修改site.css并从正文中删除padding-top 80px。
ZZZ 2015年

9
我尝试了一切,这是唯一有效的答案。因为这是最通用的解决方案,并且与屏幕尺寸无关,所以这应该是正确的答案。
Blairg23'2

1
这解决了问题。为什么不使用navbar-fixed-top?
hlyates 2015年

它对于引导3.3.4无效。我在引导站点getbootstrap.com/examples/navbar-fixed-top上看到了固定的nav示例,它使用padding-top
Alireza Fattahi 2015年

2
在执行此操作时,它会使导航栏变为静态且未固定。这意味着当您向下滚动时,导航栏将消失……至少对我而言这不好。
tbkn23 '18

62

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

更改您的第一个“ div”

<div class='navbar navbar-fixed-top'>

<div class="navbar navbar-default navbar-static-top">

28
滚动时,静态导航栏消失。
Daniel C. Sobral

1
回复:@ DanielC.Sobral响应-如果它在顶部滚动,您可以将其切换为js中的固定对象
服从

17

我正在使用jQuery解决此问题。这是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);        
});

2
我在导航栏上使用了图像,但隐藏内容时遇到了实际问题。这很好用!谢谢!
理查德·瓦诺

2
非常感谢您的解决方案。这个答案对我来说就像是一种魅力:)我想补充一件事。当您加载页面时,主体会在自动调整自身之前设置为顶部,因为jquery不会立即运行。为了使它更平滑,我在CSS body {padding-top://我的导航栏的初始高度;}这有助于平稳过渡!再次感谢你!
AAA

1
感谢您启发编程解决方案!我现在在GWT中有一个很好的工作实现,使用了很好的封装结构良好的代码...由于缺少Javascript ;-)
Alex Worden

9

我在真正的固定导航栏之前创建了一个虚拟的非固定导航栏,取得了成功。

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

该间距在所有屏幕尺寸上都非常合适。


我以为这是一开始的答案,并且所有人都将对此表示赞同。但是后来我意识到,当尺寸变得足够狭窄以至于无法堆叠菜单按钮时,它将无法工作。:-(
史蒂夫·

没错,如果没有其他代码,它将无法与菜单堆栈一起使用。我通常只将菜单栏保持在一行的高度,然后在尺寸变窄时将菜单选项变成一个汉堡包按钮。
杰森·巴特勒

我不知道为什么,但这行得通。您能详细说明它为什么起作用吗?
红色保安

好点子!因为某些页面具有导航栏而有些页面没有导航栏时很有用,因为无法与css文件区分开。
Laurent

这绝对是要走的路。即使导航栏分为两行,它也可以在所有设备上使用。+1

7

在从MVC 5教程派生的项目中,我发现更改主体填充无效。以下为我工作:

@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;
    }
}

它解决了导航栏折叠为2或3行的情况。可以在body {margin:0;; }



4

从Twitter的示例中可以看到,将其添加到包含响应样式声明的行之前:

<style> 
    body {
        padding-top: 60px;
    }
</style>

像这样:

<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" />


2

这里将发生两个问题:

  1. 页面加载(内容隐藏)
  2. 这样的内部链接将滚动到顶部,并被导航栏隐藏:
<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

要解决1),如Martijn Burger所说,bootstrap v4入门模板css使用:

body {
  padding-top: 5rem;
}

解决方法2)检查此问题。此代码通常有效(但不能单击相同哈希值的第二次单击):

window.addEventListener("hashchange", function() { scrollBy(0, -70) })

这段代码可以使A链接到jQuery(不是苗条的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);
    });
  })

2

到目前为止,我发现的不涉及硬编码高度和断点的最佳解决方案是<nav...在标记中添加一个额外的标签。

<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>

通过这种方式,@media断点是相同的,高度是相同的(前提navbar-brand是您是中的最高对象,navbar但是您可以轻松地替换非对象中的另一个元素fixed-top导航栏中的。

失败的地方在于屏幕阅读器,该屏幕阅读器现在将显示2个navbar-brand元素。这表明需要一个not-for-sr类来防止该元素出现在屏幕阅读器中。但是该类不存在 https://getbootstrap.com/docs/4.0/utilities/screenreaders/

我已经尝试用以下方法补偿屏幕阅读器的问题,aria-hidden="true"https://www.accessibility-developer-guide.com/examples/sensible-aria-usage/hidden/似乎表明当屏幕阅读器为在对焦模式下,这当然是您真正需要它工作的唯一时间...


1

使用percentage是比更好的解决方案pixels

body {
  padding-top: 10%; //This works regardless of display size.
}

如果需要,您仍然可以通过添加breakpoints其他答案中提到的其他内容来明确表示@spajus


1

编辑:此解决方案不适用于较新版本的Bootstrap,在该版本中,navbar-inverse和navbar-static-top类不可用。

使用MVC 5修复我的问题的方法是,只需添加我自己的Site.css,然后在其他代码之后加载,并添加以下行: body{padding: 0}

并且我将_Layout.cshtml开头的代码更改为:

<body>
    <div class="navbar navbar-inverse navbar-static-top">
        <div class="container">
            @if (User.Identity.IsAuthenticated) {
                <div class="top-navbar">

navbar-static-top在Bootstrap4中未定义。都不是navbar-inverse
boatcoder

我想这个答案已经过时了。我将在答案中添加注释。
塔科马市奥特曼

0
<div class='navbar' data-spy="affix" data-offset-top="0">

如果导航栏最初位于页面顶部,则将该值设置为0。否则,将其设置为 data-offset-top导航栏上方的内容的值。

同时,您需要这样修改css

.affix{
  width:100%;
  top:0;
  z-index: 10;
}



-1

添加到您的JS:

jQuery(document).ready(function($) {
  $("body").css({
    'padding-top': $(".navbar").outerHeight() + 'px'
  })
});

如果调整窗口大小,这将不起作用,因为您的填充顶部仅在准备好文档时应用。
boatcoder

-2

您可以根据屏幕分辨率设置边距

@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;
}
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.