使用Bootstrap创建带有左、中、右对齐项目的导航栏

616

Bootstrap 中,创建一个导航栏,最平台友好的方式是什么?其中Logo A在左侧,菜单项在中心,Logo B在右侧。

目前我尝试了以下方法,但结果是Logo A在左侧,紧随其后菜单项和Logo B在右侧。

<div class="navbar navbar-fixed-top navbar-custom ">
  <div class="container" >
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#"><span class="navbar-logo">Logo_A</span></a>
    </div>
    <div class="collapse navbar-collapse">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">Home</a></li>
        <li><a href="#about">Menu Item 1</a></li>
        <li><a href="#contact">Menu Item 2</a></li>
        <li><a href="#about">Menu Item 3</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#"><img src="images/Logo_B.png" class="img-responsive"></a></li>
      </ul>
    </div>
  </div>
</div>

这是一个很好的例子。 - undefined
15个回答

1182

2021年更新

Bootstrap 5(beta版)

Bootstrap 5还具有一个flexbox导航栏,并引入了新的RTL支持。因此,“左”和“右”的概念已被替换为“start”和“end”。因此,Bootstrap 5 beta的边距实用程序已更改:

  • ml-auto => ms-auto
  • mr-auto => me-auto

还要注意data-toggledata-target也发生了变化:

  • data-toggle => data-bs-toggle
  • data-target => data-bs-target

Bootstrap 5导航栏演示

Bootstrap 4

现在Bootstrap 4拥有flexbox,Navbar对齐变得更加容易。这里提供Bootstrap 4 Navbar中居中的更新示例,以及其他多种对齐方案的演示

flexboxauto-marginsordering实用类可用于根据需要对齐Navbar内容。有许多要考虑的事情,包括大屏幕和移动/折叠视图上Navbar项目(品牌、链接、切换器)的顺序和对齐方式。不要使用网格类(row、col)来制作Navbar

以下是各种示例...

左、中(品牌)和右链接:

enter image description here

<nav class="navbar navbar-expand-md navbar-dark bg-dark">
    <div class="navbar-collapse collapse w-100 order-1 order-md-0 dual-collapse2">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
                <a class="nav-link" href="#">Left</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="//codeply.com">Codeply</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Link</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Link</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Link</a>
            </li>
        </ul>
    </div>
    <div class="mx-auto order-0">
        <a class="navbar-brand mx-auto" href="#">Navbar 2</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".dual-collapse2">
            <span class="navbar-toggler-icon"></span>
        </button>
    </div>
    <div class="navbar-collapse collapse w-100 order-3 dual-collapse2">
        <ul class="navbar-nav ml-auto">
            <li class="nav-item">
                <a class="nav-link" href="#">Right</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="#">Link</a>
            </li>
        </ul>
    </div>
</nav>

http://codeply.com/go/qhaBrcWp3v


另一个具有居中链接和覆盖式标志图像的BS4导航栏选项:

center links and overlay logo image

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="navbar-collapse collapse w-100 dual-collapse2 order-1 order-md-0">
        <ul class="navbar-nav ml-auto text-center">
            <li class="nav-item active">
                <a class="nav-link" href="#">Link</a>
            </li>
        </ul>
    </div>
    <div class="mx-auto my-2 order-0 order-md-1 position-relative">
        <a class="mx-auto" href="#">
            <img src="//placehold.it/120/ccff00" class="rounded-circle">
        </a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".dual-collapse2">
            <span class="navbar-toggler-icon"></span>
        </button>
    </div>
    <div class="navbar-collapse collapse w-100 dual-collapse2 order-2 order-md-2">
        <ul class="navbar-nav mr-auto text-center">
            <li class="nav-item">
                <a class="nav-link" href="#">Link</a>
            </li>
        </ul>
    </div>
</nav>

或者,这些其他的Bootstrap 4对齐方案:

品牌居左,中心链接,(右侧为空)

Navbar brand left, dead center links


品牌和链接中心,左右两侧图标

enter image description here


更多 Bootstrap 4 示例

在移动端左侧显示 toggler ,品牌在右侧
在移动端居中显示品牌和链接
在桌面端右对齐链接,在移动端居中显示链接
在左侧显示链接和 toggler,居中显示品牌,搜索在右侧


还可以参考以下内容:Bootstrap将导航栏项目对齐到右侧
Bootstrap 4导航栏右侧对齐,不会在移动设备上折叠的按钮
在Bootstrap导航栏中居中一个元素


Bootstrap 3

选项1 - 品牌中心,带左/右导航链接:

enter image description here

<nav class="navbar navbar-default" role="navigation">
  <div class="navbar-header">
    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>    
  </div>
  <a class="navbar-brand" href="#">Brand</a>
  <div class="navbar-collapse collapse">
    <ul class="nav navbar-nav navbar-left">
        <li><a href="#">Left</a></li>
        <li><a href="#about">Left</a></li>
    </ul>
    <ul class="nav navbar-nav navbar-right">
      <li><a href="#about">Right</a></li>
      <li><a href="#contact">Right</a></li>
    </ul>
  </div>
</nav>

.navbar-brand
{
    position: absolute;
    width: 100%;
    left: 0;
    text-align: center;
    margin:0 auto;
}
.navbar-toggle {
    z-index:3;
}

https://codeply.com/p/X6Uv70mMVi(3.x)


选项2 - 左侧、中间和右侧导航链接:

enter image description here

<nav class="navbar navbar-default" role="navigation">
  <div class="navbar-header">
    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>    
  </div>
  <div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
        <li><a href="#">Left</a></li>
    </ul>
    <ul class="nav navbar-nav navbar-center">
        <li><a href="#">Center</a></li>
        <li><a href="#">Center</a></li>
      <li><a href="#">Center</a></li>
    </ul>
    <ul class="nav navbar-nav navbar-right">
        <li><a href="#">Right</a></li>
    </ul>
  </div>
</nav>

@media (min-width: 768px) {
  .navbar-nav.navbar-center {
    position: absolute;
    left: 50%;
    transform: translatex(-50%);
  }
}

https://codeply.com/p/v7pQKZacTg

选项3 - 品牌和链接都居中

enter image description here

.navbar .navbar-header,
.navbar-collapse {
    float:none;
    display:inline-block;
    vertical-align: top;
}

@media (max-width: 768px) {
    .navbar-collapse  {
        display: block;
    }
}

http://codeply.com/go/1lrdvNH9GI

更多示例:

左侧品牌,中心链接
左侧切换器,中心品牌

对于3.x版本,还请参阅nav-justified:Bootstrap居中导航栏


在Bootstrap中居中导航栏

将Bootstrap导航栏项目对齐到右侧


1
你如何使左侧项目在另一个左侧的切换中折叠? - gepex
2
我建立了2个jsfiddle示例,因为bootply现在无法正常工作。 [sol 1](https://jsfiddle.net/bxd202o7/)和[sol 2](https://jsfiddle.net/Ljec3ks4/1/)。顺便说一句,soluzion 2效果更好(imho)。 - GiuServ
3
这个为什么没有标记为答案?提供了 BS 3 和 4 的三个选项,谢谢您。 - Murkantilism
1
@BKSpurgeon 它并不来自任何地方.. 你可以使用任何你想要的类。 - Carol Skelly
1
+1 为 Bootstrap 5 的示例。我在布局方面遇到了麻烦。你更新答案到最新版本是非常宝贵的。 - asprin
显示剩余5条评论

97

Bootstrap 4

我们有多种方法来对齐导航栏项目。

左对齐 enter image description here

class = "navbar-nav mr-auto"

右对齐 enter image description here

class = "navbar-nav ml-auto"

居中对齐 enter image description here

class = "navbar-nav mx-auto"

<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
    <a routerLink="/" class="navbar-brand" href="#">Bootstrap 4</a>
    <ul class="navbar-nav ml-auto">
        <li class="nav-item">
            <a class="nav-link" href="home">Home</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="about">About</a>
        </li>
        <li class="nav-item">
            <a class="nav-link" href="contact">Contact us</a>
        </li>
    </ul>
</nav>

1
在 b-nav-item 标签中添加 class="navbar-brand mx-auto" 对我很有帮助。 - Sheece Gardazi

39

Bootstrap 4(截至 alpha 6 版)

导航栏采用 flexbox 布局!与浮动不同,您需要使用 flexbox 和边距工具。

要右对齐,请在 collapse div 上使用 justify-content-end

<div class="collapse navbar-collapse justify-content-end">
  <ul class="navbar-nav">
    <li class="nav-item active">
      <a class="nav-link" href="#">Home</a>
    </li>
  </ul>
</div>

点击此处查看完整示例。


3
对我不起作用... justify-content-end 似乎适用于 nav,但在最新版本的 bootstrap 中似乎对导航栏不起作用。 - Stephane Paquet
1
@stephanePaquet,这适用于alpha 6(最新的引导程序版本)-你在使用什么? - Jeremy Lynch
它仍在运行!Bootstarp v5.1.3 - Zohaib Hamdule
如果在 "collapse navbar-collapse justify-content-end" 和子级类别 <ul class="navbar-nav justify-content-end" 下使用,justify-content-end 对我有效。其他所有尝试都失败了。 - Majte
这应该是被接受的答案。直接从实现中得出。 - mrityunjoynath

36

我需要类似的东西(左、中、右对齐项目),但具有将居中项目标记为活动状态的功能。 对我有用的是:

http://www.bootply.com/CSI2KcCoEM

<nav class="navbar navbar-default" role="navigation">
  <div class="navbar-header">
    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>    
  </div>
  <div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
      <li class="navbar-left"><a href="#">Left 1</a></li>
      <li class="navbar-left"><a href="#">Left 2</a></li>
      <li class="active"><a href="#">Center 1</a></li>
      <li><a href="#">Center 2</a></li>
      <li><a href="#">Center 3</a></li>
      <li class="navbar-right"><a href="#">Right 1</a></li>
      <li class="navbar-right"><a href="#">Right 2</a></li>
    </ul>
  </div>
</nav>

CSS:

@media (min-width: 768px) {
  .navbar-nav {
    width: 100%;
    text-align: center;
  }
  .navbar-nav > li {
    float: none;
    display: inline-block;
  }
  .navbar-nav > li.navbar-right {
    float: right !important;
  }
}

1
这很接近,但在折叠时会出现问题。如果您在移动设备上查看它,“品牌”将显示在菜单栏下方。品牌不是实际导航的一部分吗? - spasticninja
1
这个回答更贴近于原帖。 - Roger Dueck
到目前为止,这对我很有效。我没有品牌或右对齐元素,只有3个居中选项。谢谢。 - Alessandro
我认为这个解决方案比大多数投票最高的答案做得更好,因为在减小屏幕尺寸时,没有任何元素会悬挂在导航栏之外(至少在共享示例代码中)。 - pravin

14

在Bootstrap 5中,类别已经发生了变化,所以 ml-auto 改为 ms-auto, 而mr-auto改为me-auto

对于left,我们需要使用s代替l,而对于right,我们需要使用e代替r


12

啊,我自己再看了一遍回答,才意识到楼主是要求把两个标志放在左右两侧,中间有一个菜单,不是反过来。

这可以通过在HTML中严格使用Bootstrap的"navbar-right"和"navbar-left"来实现标志,然后使用"nav-justified"而不是"navbar-nav"作为您的UL。不需要额外的CSS(除非你想把导航栏折叠开关放在xs视口的中心,那么你需要覆盖一点CSS,但是这取决于你)。

<nav class="navbar navbar-default" role="navigation">
  <div class="navbar-header">
    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>
    <div class="navbar-brand navbar-left"><a href="#"><img src="http://placehold.it/150x30"></a></div>

  </div>
  <div class="navbar-brand navbar-right"><a href="#"><img src="http://placehold.it/150x30"></a></div>

  <div class="navbar-collapse collapse">
    <ul class="nav nav-justified">
        <li><a href="#">home</a></li>
        <li><a href="#about">about</a></li>
    </ul>
  </div>
</nav>

Bootply: http://www.bootply.com/W6uB8YfKxm


如果你来到这里是为了让“品牌”居中,这是我的旧答案:

我知道这个帖子有点旧了,但我想分享一下我在工作时的发现。我决定基于skelly的答案来解决问题,因为tomaszbak的方法在折叠时会出问题。首先,在CSS中创建一个“navbar-center”,并关闭普通导航栏的浮动:

.navbar-center
{
   position: absolute;
   width: 100%;
   left: 0;
   text-align: center;
   margin: auto;
}

.navbar-brand{
   float:none;
}

然而,skelly的回答存在一个问题,如果你的品牌名称非常长(或者你想使用品牌图片),那么一旦到达sm视口,由于绝对定位可能会发生重叠,正如评论者所说,一旦到达xs视口,切换开关就会失效(除非使用Z定位,但我真的不想担心这个)。因此,我利用了Bootstrap 响应式实用工具来创建多个版本的品牌区块:

<nav class="navbar navbar-default" role="navigation">
<div class="navbar-header">
  <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
  </button>
  <div class="navbar-brand visible-xs"><a href="#">Brand That is Really Long</a></div>
</div>
<div class="navbar-brand visible-sm text-center"><a href="#">Brand That is Really Long</a></div>
<div class="navbar-brand navbar-center hidden-xs hidden-sm"><a href="#">Brand That is Really Long</a></div>

<div class="navbar-collapse collapse">
  <ul class="nav navbar-nav navbar-left">
      <li><a href="#">Left</a></li>
      <li><a href="#about">Left</a></li>
      <li><a href="#">Left</a></li>
      <li><a href="#about">Left</a></li>
      <li><a href="#">Left</a></li>
      <li><a href="#about">Left</a></li>
  </ul>
  <ul class="nav navbar-nav navbar-right">
    <li><a href="#about">Right</a></li>
    <li><a href="#contact">Right</a></li>
    <li><a href="#about">Right</a></li>
    <li><a href="#contact">Right</a></li>
    <li><a href="#about">Right</a></li>
    <li><a href="#contact">Right</a></li>
  </ul>
</div>

现在,在lg和md视口中,品牌位于中心,链接位于左右两侧。一旦进入sm视口,您的链接就会下移到下一行,以避免与品牌重叠。最后,在xs视口中,折叠功能启动,您可以使用切换按钮。您可以进一步修改navbar-right和navbar-left的媒体查询,以配合navbar-brand在sm视口中使所有链接都居中,但我没有时间去验证它。

您可以在这里检查我的旧bootply:www.bootply.com/n3PXXropP3

我想拥有3个品牌可能会带来和“z”一样多的麻烦,但我觉得在响应式设计的世界中,这个解决方案更适合我的风格。


9
在Bootstrap 5中,ms-auto 对我来说可以将导航项向右移动。
Bootstrap的代码如下:
 <nav class="navbar navbar-expand-lg navbar-light bg-light">
  <div class="container-fluid">
    <a class="navbar-brand" href="#">Navbar</a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarNav">
      <ul class="navbar-nav">
        <li class="nav-item">
          <a class="nav-link active" aria-current="page" href="#">Home</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Features</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Pricing</a>
        </li>
        <li class="nav-item">
          <a class="nav-link disabled">Disabled</a>
        </li>
      </ul>
    </div>
  </div>
</nav>

我在ul标签中将<ul class="navbar-nav">修改为<ul class="navbar-nav ms-auto mb-2 mb-lg-0">,这样对我来说运行良好。

我编辑后的代码如下:

 <nav class="navbar navbar-expand-lg navbar-light">
    <div class="container-fluid">
      <a class="navbar-brand nav-title" href="#">Cooking Master</a>
      <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navbarNav">
        <ul class="navbar-nav ms-auto mb-2 mb-lg-0">
          <li class="nav-item">
            <a class="nav-link active" aria-current="page" href="#">Home</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Features</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#">Pricing</a>
          </li>
          <li class="nav-item">
            <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
          </li>
        </ul>
      </div>
    </div>
  </nav>

9

这是针对BS5的更新和对@Zim答案的建议性修改。不幸的是,由于编辑队列已满,我无法提交该编辑。如果有高声望的用户在队列允许新的编辑后提交该编辑,则会很好。

2021 更新

Bootstrap 5.0.0 beta-1

随着RTL支持的加入,ml-automr-auto变成了ms-autome-auto(左/右到开头/结尾)。

Bootstrap 5还要求将导航栏包含在container div中。

以下代码生成了第一个Bootstrap 4示例的等效内容:

左,中心(brand)和右链接:

enter image description here

<nav class="navbar navbar-expand-md navbar-dark bg-dark">
  <div class="container-fluid">
    <div class="navbar-collapse collapse w-100 order-1 order-md-0 dual-collapse2">
      <ul class="navbar-nav me-auto">
        <li class="nav-item active">
          <a class="nav-link" href="#">Left</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="//codeply.com">Codeply</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Link</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Link</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Link</a>
        </li>
      </ul>
    </div>
    <div class="mx-auto order-0">
      <a class="navbar-brand mx-auto" href="#">Navbar 2</a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".dual-collapse2">
        <span class="navbar-toggler-icon"></span>
      </button>
    </div>
    <div class="navbar-collapse collapse w-100 order-3 dual-collapse2">
      <ul class="navbar-nav ms-auto">
        <li class="nav-item">
          <a class="nav-link" href="#">Right</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Link</a>
        </li>
      </ul>
    </div>
  </div>
</nav>

这有助于解决升级到Bootstrap 5时的问题,谢谢。 - OJB1
ml-auto和mr-auto变成ms-auto和me-auto - 无价的。 - user3135691

6

当您希望将某个部分向右移动时,您可以将其左边距设置为auto,即ml-auto。

 <nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
  <span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
  <div class="navbar-nav ml-auto"> !<--MARGIN LEFT AUTO HERE !-->
    <a class="nav-item nav-link active" href="#">Home <span class="sr-only">(current)</span></a>
    <a class="nav-item nav-link" href="#">Features</a>
    <a class="nav-item nav-link" href="#">Pricing</a>
    <a class="nav-item nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
  </div>
</div>


1
这是一个过时的问题,但我在Bootstrap的GitHub页面上找到了一种替代解决方案要分享。文档尚未更新,也有其他问题在SO上询问相同的解决方案,尽管问题略有不同。该解决方案并不特定于您的情况,但是您可以看到解决方案是在<nav class="navbar navbar-default navbar-fixed-top">之后的<div class="container">,但也可以根据需要替换为<div class="container-fluid"
<!DOCTYPE html>
<html>

<head>
  <title>Navbar right padding broken </title>
  <script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
</head>

<body>
  <nav class="navbar navbar-default navbar-fixed-top">
    <div class="container">
      <div class="navbar-header">
        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
          <span class="sr-only">Toggle navigation</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
        <a href="#/" class="navbar-brand">Hello</a>
      </div>
      <div class="collapse navbar-collapse navbar-ex1-collapse">

        <ul class="nav navbar-nav navbar-right">
          <li>
            <div class="btn-group navbar-btn" role="group" aria-label="...">
              <button type="button" class="btn btn-default" data-toggle="modal" data-target="#modalLogin">Se connecter</button>
              <button type="button" class="btn btn-default" data-toggle="modal" data-target="#modalSignin">Créer un compte</button>
            </div>
          </li>
        </ul>
      </div>
    </div>
  </nav>
</body>

</html>

在这个页面的小提琴上找到了解决方案: https://github.com/twbs/bootstrap/issues/18362

并且在 V3 中被列为不会修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接