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

Posted

技术标签:

【中文标题】顶部导航栏阻止页面的顶部内容【英文标题】:top nav bar blocking top content of the page 【发布时间】:2012-05-07 08:23:17 【问题描述】:

我有这个 Twitter 引导代码

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

但是当我查看页面的开头时,导航栏挡住了页面顶部附近的一些内容。有什么想法可以在查看页面顶部时将其余内容向下推,以免内容被导航栏挡住?

【问题讨论】:

twitter bootstrap navbar fixed top overlapping site 的可能重复项 @user2428107 这个问题后来贴出来了。 【参考方案1】:

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

body 
  padding-top: 60px;

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

【讨论】:

完美。这应该以某种方式真正集成到引导程序中。你应该 fork 并提交一个 pull request。 很好的解决方案,但仍有一些问题没有解决。看看我刚刚提出的这个问题,看看是否有人可以帮忙。 ***.com/questions/12763707/… 更简洁:@media (min-width: 981px) body padding-top: 60px; @Ted 对我来说它必须是 min-width: 980px ;-) @white_gecko 哈哈。是的。那个 980 想要变得更加特别独特 ;-)【参考方案2】:

添加到您的 CSS:

body  
    padding-top: 65px; 

来自Bootstrap docs:

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

【讨论】:

请参阅下面@Spajus 的其他答案,了解如何为响应式 Bootstrap 编写代码 使用@media (min-width: 980px) body padding-top: 60px; 虽然其他答案确实更雄辩地解决了这个问题,但这是固定导航栏的引导文档中所述的官方答案link 如果用户有一个更窄的屏幕或只是调整窗口大小,这将如何工作?展开的导航栏部分将再次阻止最顶部的内容。【参考方案3】:

对于引导程序 3,类 navbar-static-top 而不是 navbar-fixed-top 可以防止此问题,除非您需要导航栏始终可见。

【讨论】:

这可行,但可能会在导航栏上方留下一些空间。您可能需要修改 site.css 并从正文中删除 padding-top 80px。 我尝试了一切,这是唯一有效的答案。因为这是最通用的解决方案,并且不依赖于屏幕大小,所以这应该是正确的答案。 这解决了问题。为什么这个工作而不是 navbar-fixed-top? 它不适用于 bootstap 3.3.4。我在引导站点getbootstrap.com/examples/navbar-fixed-top 看到了固定导航示例,它使用填充顶部 虽然这有效,但它使导航栏成为静态而不是固定的。这意味着当你向下滚动时导航栏会消失......至少对我来说这不好。【参考方案4】:

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

改变你的第一个“div”

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

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

【讨论】:

滚动时静态导航栏消失。 回复:@DanielC.Sobral 回复 - 如果它从顶部滚动,您可以将其切换为 js 中的固定项【参考方案5】:

我正在使用 jQuery 来解决这个问题。这是 BS 3.0.0 的 sn-p:

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

【讨论】:

我在导航栏上使用了图像,并且在隐藏内容时遇到了实际问题。这非常有效!谢谢! 非常感谢您的解决方案。这个答案对我来说就像一个魅力:) 我想补充一件事。当您加载页面时,主体在它自动调整之前设置为顶部,因为 jquery 不会立即运行。为了使它更平滑,我在 CSS body padding-top: //我的导航栏的初始高度中添加了这个;这有助于顺利过渡!再次感谢您! 感谢您启发编程解决方案!我现在在 GWT 中有一个很好的工作实现,带有很好的封装结构良好的代码......由于缺乏 javascript ;-)【参考方案6】:

在我从MVC 5 tutorial 派生的项目中,我发现更改主体填充没有效果。以下对我有用:

@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 行的情况。这可以插入到 bootstrap.css 行之后的任何位置 身体 边距:0;

【讨论】:

在研究了所有答案之后,这似乎是最好的解决方案。 (navbar-static-top 使其在滚动时消失,并且虚拟导航栏没有考虑真正的导航栏菜单可能会如何包装。)我发现引导程序有四种硬编码宽度情况:1199。查看您的菜单在这 4 种情况下的表现。对于我网站的非管理员用户,我只需要 768-991 机箱的 100 像素就足够了。被放入site.css。或者,我注意到我们的菜单对于管理员用户来说更宽,并且更容易包装。所以我们把条件样式代码放在_Layout.cshtml 使用 margin-top 而不是 padding-top 向下移动导航栏下方的内容。确实,应用于 body 的 padding-top 在 MVC 中不起作用,但它似乎在应用于 body 容器时起作用。【参考方案7】:

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

<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 文件区分开来。 这绝对是要走的路。它适用于所有设备,即使导航栏分成两行也是如此。 +1【参考方案8】:

bootstrap v4 starter template css 使用:

body 
  padding-top: 5rem;

【讨论】:

【参考方案9】:

正如 Twitter 的 this example 所见,在包含响应式样式声明的行之前添加以下内容:

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

【讨论】:

【参考方案10】:

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

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

如果需要,您仍然可以通过添加不同的breakpoints 来明确表达,正如@spajus 的另一个答案中提到的那样

【讨论】:

【参考方案11】:

使用 navbar navbar-default 一切正常,但如果您使用的是 navbar-fixed-top,则必须包含自定义样式 body padding-top: 60px; 否则它将阻止下面的内容。

【讨论】:

这不会添加其他答案中没有的任何信息。【参考方案12】:

这里会出现两个问题:

    页面加载(内容隐藏) 这样的内部链接会滚动到顶部,并被导航栏隐藏:
<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 starter 模板 css 使用:

body 
  padding-top: 5rem;

修复 2) 查看this issue。这段代码大部分都有效(但不是在第二次点击相同的哈希时):

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

这段代码用 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);
    );
  )

【讨论】:

【参考方案13】:

到目前为止,我发现的最好的解决方案是在标记中添加一个额外的&lt;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-brandnavbar 中最高的对象,但您可以轻松替换非 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/ 似乎表明当屏幕阅读器处于焦点模式时这可能不起作用,这当然是你真正需要它的唯一时间工作...

【讨论】:

【参考方案14】:

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

使用 MVC 5,我修复我的方式是简单地添加我自己的 Site.css,在其他人之后加载,并带有以下行: bodypadding: 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 也不是 我想这个答案已经过时了。我会在答案中添加注释。【参考方案15】:

你应该添加

#page 
  padding-top: 65px

不破坏粘性页脚或其他内容

【讨论】:

【参考方案16】:
<div class='navbar' data-spy="affix" data-offset-top="0">

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

同时,您需要修改css

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

【讨论】:

【参考方案17】:

添加这个:

.navbar 
  position: relative;

【讨论】:

【参考方案18】:

添加到您的 JS:

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

【讨论】:

如果调整窗口大小,这将不起作用,因为您的 padding-top 仅在文档​​准备好时应用。【参考方案19】:

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

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

【讨论】:

以上是关于顶部导航栏阻止页面的顶部内容的主要内容,如果未能解决你的问题,请参考以下文章

小程序自定义导航栏仿原生固定在顶部

【微信小程序】自定义顶部导航栏

如何在页面顶部保留导航栏?

HTML5如何才能让导航栏固定顶部不动,且!且!且!不遮挡住下面的DIV???

向下滚动时如何停止页面顶部的导航栏

微信小程序--仿京东UI样式顶部导航栏