【问题标题】:twitter bootstrap navbar fixed top overlapping sitetwitter bootstrap navbar 固定顶部重叠站点
【发布时间】:2012-06-22 21:32:51
【问题描述】:

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

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

我尝试完全复制引导程序示例,但仅在使用导航栏固定顶部时仍然存在此问题。我做错了什么?

【问题讨论】:

    标签: html twitter-bootstrap


    【解决方案1】:

    你的答案就在docs

    需要身体填充

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

    body { padding-top: 70px; }
    

    确保将这个放在核心 Bootstrap CSS 之后。

    Bootstrap 4 文档中...

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

    【讨论】:

    • 但是当你最小化窗口时,导航栏出现在 40px 之后我应该如何处理它..
    • 它出现在 40px 之后可能是因为您没有“在核心 Bootstrap CSS 之后和可选的响应式 CSS 之前添加它。”
    • 这个答案是正确的,但只有当您将 40px 填充设置为响应式样式时,它才能正常工作,请参阅 Dan 或 Nick 的答案。
    • 如果您不想添加填充(或其他任何内容),请参阅@qub1n 的答案。
    • @JerSchneid w3schools.com 上的 navbar-fixed-top 示例显示了相同的行为。我倾向于称其为错误。
    【解决方案2】:

    正如其他人所说,为 body 添加 padding-top 效果很好。 但是,当您使屏幕变窄(到手机宽度)时,导航栏和主体之间会出现间隙。此外,拥挤的导航栏可以换成多行栏,再次覆盖部分内容。

    这为我解决了这些问题

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

    默认情况下填充 40 像素,宽度低于 768 像素时为 0 像素(根据引导程序的文档,这是将创建间隙的手机布局截止)

    【讨论】:

    • 这个解决方案是否也介于核心 Bootstrap CSS 和响应式 CSS 导入之间?当窗口宽度小于 980 时,我仍然看到差距。我猜测稍后会导入响应式 CSS 覆盖。如果我将此解决方案移动到响应式 CSS 导入下,那么我仍然会得到正文填充,加上菜单栏中的额外行。
    • 我正在使用 Twitter Bootstrap 2.3.2。我注意到文档不再包含 40px 建议,但仍然存在需求。
    • 呃,40px 的建议还在,只是移动了。很抱歉评论垃圾邮件。
    • 通过 Bootstrap 3.+ body { padding-top: 40px; } 就足够了
    • 这个解决方案是正确的。如文件所述,仅在正文中添加填充是不够的,即使在 3.+ 上也是如此。通过媒体查询的正确组合,可以实现所需的效果,因为导航栏与浏览器重新调整大小一起包装。在我的情况下,我需要将填充更改为 1148px、900px 和 768px 宽度。
    【解决方案3】:

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

    改变你的第一行

    .navbar.navbar-fixed-top
    

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

    【讨论】:

    • 你只是在拖钓吗?还是我监督了什么?
    • 这是如何获得 10 票的? navbar-default 只是添加颜色和背景颜色...
    • navbar-static-top 是变化,它对我有用。谢谢!
    • navbar-static-top 也为我修复了它。最少打扰。
    • 如果您不需要导航栏始终在屏幕顶部可见,则此方法有效。 navbar-static-top 不是固定的,它会随着屏幕滚动。这体现了不同的导航栏样式:getbootstrap.com/docs/3.3/examples/navbar-static-top
    【解决方案4】:

    只需将fixed-top 更改为sticky-top。这样您就不必计算填充。
    它有效!

    【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 我没有在高度的css值上使用parseInt,而是使用$('#main-navbar').height(),但否则这非常有帮助并解决了我的问题,谢谢。
    • 除非你的导航栏是固定高度的,否则这就是你所需要的。
    【解决方案6】:

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

    贴上导航栏时,记得考虑隐藏区域 下。为<body> 添加 40 像素或更多的内边距。务必添加 这在核心 Bootstrap CSS 之后和可选响应之前 CSS。

    这对我有用:

    body { padding-top: 40px; }
    

    【讨论】:

    • 但是当你最小化窗口时,导航栏出现在 40px 之后我应该如何处理它..
    • 是的,此解决方案不适用于移动屏幕尺寸。事实上,在我手机的宽屏模式下,它基本上会使网站变得毫无用处。
    • 什么可选的响应式 CSS ?我曾经只使用过一个(核心)引导 CSS - 我说的是 3.7.x UPWARDS 以上版本;在 3.7.x 版本之前,它是否在不同的 CSS 中拆分?
    【解决方案7】:

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

    改变你的第一行

    navbar-fixed-top
    

    sticky-top
    

    Bootstrap documentation reference

    是时候他们做对了:D

    【讨论】:

    • 有些人可能会使用固定顶部以便在您向下滚动页面时看到链接;虽然如果你不关心这个功能可能会很有用:)
    • 另请注意,.sticky-top 使用 position:sticky,并非所有浏览器都完全支持。
    • 除了其他人写的 cmets 之外,与以下内容相比,这似乎是一种更新的方式:body { padding-top: 70px; }。这显然更容易,但我必须看看它是否可以正常工作。
    【解决方案8】:

    我把这个放在 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;
      }
    }
    

    【讨论】:

      【解决方案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>
      

      间距适用于所有屏幕尺寸。

      【讨论】:

      • 这就是我们所做的.. 将正文内容放置在完全正确的位置,无需任何 js 代码、猜测或任何东西。 .
      • 这应该得到更多的支持,工作得很好,丑得要命,但只有代码:D
      • 谢谢,这是一个比顶部填充或边距像素和其他东西更优雅的解决方案......
      • 不幸的是,当导航进入 1 列时,这不适用于移动设备。
      【解决方案10】:

      问题在于 navbar-fixed-top,除非指定 body-padding,否则它将覆盖您的内容。此处提供的解决方案没有在 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>
      

      【讨论】:

      • 是的,这样更好,因为body的padding对于每个屏幕尺寸都是动态的,他们的解决方案不好。
      • 但是导航栏上方有一条空白区域。
      【解决方案11】:

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

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

      【讨论】:

      • 仅供参考,我正在使用它,它工作得很好,但出于某种奇怪的原因,如果我有两个导航栏,一个正常尺寸,一个用于小屏幕,它只适用于较大的?
      • @LiamDawe 页面上可能有多个“.user-top”(例如),在这种情况下 .height() 可能会混淆...?
      【解决方案12】:

      要处理菜单栏中的换行,请将 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() ,然后这对我来说非常有效。谢谢!
      • 感谢您的评论!我在答案中修复了它。
      • 这是我遇到的最好的解决方案,适用于 PC、iOS、Android - 所有设备。所有其他的要么是硬编码的像素值,要么是太长,并且不适用于所有设备。
      • 不错的解决方案。我有一些在计算中没有考虑到的小偏移量。我想这是因为我的导航栏有一些边距。我选择将 height() 调用更改为 outerHeight() 调用,以考虑到这一点。
      【解决方案13】:

      在导航标签中使用这个类

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

      对于引导程序 4

      【讨论】:

      • 我永远不会知道为什么它被否决了,因为它对我和其他所有人都有效。
      • 这是正确的。唯一的问题是,在文档中,它说“.sticky-top 实用程序使用 CSS 的位置:sticky,并非所有浏览器都完全支持”
      • 这绝对是为我做的。
      • 可能被否决了,因为就像这里的另一个答案一样,已经说过了。
      【解决方案14】:

      对于 Bootstrap 3.+ ,我将使用以下 CSS 来修复 navbar-fixed-top 和锚点跳转重叠问题,基于 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; 
      }
      

      【讨论】:

      • 同样的问题,很好的答案。
      【解决方案15】:

      你要做的就是

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

      【讨论】:

        【解决方案16】:

        对于 Nick Bisby 的回答,如果您在 Rails 中使用 HAML 遇到此问题,并且您已在此处应用了 Roberto Barros 的修复:

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

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

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

        ...你需要将body CSS 放在 require 语句之前,如下所示:

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

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

        【讨论】:

          【解决方案17】:

          我会这样做:

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

          这应该确保导航块不会向下延伸并覆盖页面内容。

          【讨论】:

            【解决方案18】:

            这很有效,对我来说看起来不错。

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

            【讨论】:

            • Tbh 在我看来就像顺风。不是每个人都同时使用 2 个框架。我只是单独使用引导程序。
            • @CheesusToast 这是引导程序(V5 和 V4)
            • 好吧好吧,我的错。它看起来纯粹是顺风顺水,所以我在引导时有点落后于时代。我刚刚检查过,是的,他们现在使用 pt 等。
            【解决方案19】:

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

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

            没有花哨的恶作剧,但它有效..

            【讨论】:

            • 您的回答不清楚,无法解决问题。 nav-? ?? 代表什么?
            猜你喜欢
            • 2013-05-22
            • 1970-01-01
            • 2013-12-22
            • 2019-10-11
            • 2014-08-15
            • 1970-01-01
            • 2015-11-13
            相关资源
            最近更新 更多