ChatGPT解决这个技术问题 Extra ChatGPT

twitter bootstrap navbar 固定顶部重叠站点

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

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

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


C
Community

您的答案在 docs 中:

需要正文填充 固定导航栏将覆盖您的其他内容,除非您在 的顶部添加填充。尝试您自己的价值观或使用我们下面的代码段。提示:默认情况下,导航栏的高度为 50px。身体{填充顶部:70px;确保在核心 Bootstrap CSS 之后包含它。

在 Bootstrap 4 文档中...

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


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

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

这为我解决了这些问题

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

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


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

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

改变你的第一行

.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
s
shivampip

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


Also note that .sticky-top uses position: sticky, which isn’t fully supported in every browser. 见 - getbootstrap.com/docs/4.5/components/navbar/#placement
这看起来像一个重复的答案。有人在 2018 年提出了这个问题。
fixed-top 类似的结果。做一个覆盖。
R
Rick

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

改变你的第一行

navbar-fixed-top

sticky-top

Bootstrap documentation reference

大约是时候他们做对了:D


当您向下滚动页面时,有些人可能会使用固定顶部来查看链接;虽然如果你不关心这个功能可能会很有用:)
另请注意,.sticky-top 使用 position:sticky,并非每个浏览器都完全支持。
除了其他人写的评论之外,与以下内容相比,这似乎是一种更新的方式:body { padding-top: 70px; }。这显然更容易,但我将不得不看看它是否可以正常工作。
从固定顶部更改为粘性顶部仍然会使站点在顶部重叠。定义为 Position an element at the top of the viewport, from edge to edge, but only after you scroll past it.
A
Aram Paronikyan

@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(),否则这非常有帮助并解决了我的问题,谢谢。
除非您的导航栏是固定高度,否则这就是您所需要的。
vanilla js中的height() jquery函数是什么? main-navbar 与哪个 html 元素相关?
f
friism

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

粘贴导航栏时,请记住考虑下方的隐藏区域。为 添加 40px 或更多的内边距。请务必在核心 Bootstrap CSS 之后和可选的响应式 CSS 之前添加它。

这对我有用:

body { padding-top: 40px; }

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

我把它放在产量容器之前:

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

J
Jason Butler

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

<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 代码、猜测或任何东西。 .
Thid 应该得到更多的支持,工作得很好,丑得要命,但只有代码:D
谢谢,这是一个比顶部填充或边距像素和其他东西更优雅的解决方案......
不幸的是,当导航进入 1 列时,这不适用于移动设备。
T
Tomas Kubes

问题在于 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 的填充对于每个屏幕尺寸都是动态的,他们的解决方案并不好。
但是导航栏上方有一条空白区域。
R
Ryan

所有以前的解决方案都以一种或另一种方式将 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'
        });
});

仅供参考,我正在使用它并且效果很好,但是出于某种奇怪的原因,如果我有两个导航栏,一个正常尺寸,一个用于小屏幕,它只适用于较大的导航栏?
@LiamDawe 也许您在页面上有多个“.user-top”(例如),在这种情况下 .height() 可能会混淆......?
O
Oliver Konig

要处理菜单栏中的换行,请将 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() 调用,以考虑到这一点。
I
IamButtman

在导航标签中使用这个类

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

对于引导程序 4


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

对于 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; 
}

同样的问题,很好的答案。
V
Venkat Kotra

你所要做的就是

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

C
Community

继 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

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

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

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


d
developer10

我会这样做:

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

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


X
X 47 48 - IR

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

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

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

我只是将导航栏包裹在

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

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


您的答案不清楚,无法解决问题。 nav-? ?? 代表什么?