4.7.3 导航条中的按钮、文本、链接

在普通导航条里,除了可以使用navbar-brand样式的a元素和navbar-nav的ul和form以外,也可以使用其他元素,比如button(navbar-btn)、文本(navbar-text)、普通链接(navbar-link)等。但Bootstrap对另外这些元素有些限制,那就是如果单独应用button、文本或普通链接,将只支持一个,或者最多两个(需要设置左右浮动),并且需要配合ul或者navbar-brand样式的a元素一起使用。我们来解释一下原因。

首先了解一下Bootstrap对这3种特殊元素是如何支持的。源码如下:

  1. // 源码3918行
  2. .navbar-btn { margin-top: 8px; margin-bottom: 8px; /* 仅设置了上下外边距值 */ }
  3. .navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px;}
  4. .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px;}
  5. .navbar-text { margin-top: 15px; margin-bottom: 15px;}
  6. @media (min-width: 768px) { /* 普通宽屏浏览器下,增加左右外边距*/
  7. .navbar-text { float: left; margin-right: 15px; margin-left: 15px; }
  8. .navbar-text.navbar-right:last-child { margin-right: 0; }
  9. }
  10. /*以下代码在3956行*/
  11. .navbar-default .navbar-text { color: #777777; /*设置navbar-text的文本颜色*/ }
  12. /*以下代码在4021行*/
  13. .navbar-default .navbar-link { color: #777; /*内部链接的文本颜色*/ }
  14. .navbar-default .navbar-link:hover { color: #333; /*内部链接在鼠标移动时的文本颜色*/ }

可以发现,CSS的设置项非常少,只是象征性地设置了margin和颜色,但威力却非常强大(大家再仔细看一遍.navbar-default的源码就能知道,其实该风格控制了很多东西),所以不管怎么应用,都不会出现问题。来看看如下几个示例:

  1. <nav class="navbar navbar-default" role="navigation">
  2. <div class="navbar-header"><a class="navbar-brand" href="#">Brand</a></div>
  3. <ul class="nav navbar-nav">
  4. <li class="active"><a href="#">Home</a></li>
  5. <li><a href="#">Link</a></li>
  6. <li><a href="#">Link</a></li>
  7. </ul>
  8. <button class="btn btn-success navbar-btn" type="button">和ul一起使用的按钮</button>
  9. </nav>
  10. <nav class="navbar navbar-default" role="navigation">
  11. <div class="navbar-header"><a class="navbar-brand" href="#">Brand</a></div>
  12. <div class="nav navbar-nav">
  13. <button class="btn btn-warning navbar-btn" type="button">和navbar-
  14. brand一起使用的按钮</button>
  15. <button class="btn btn-warning navbar-btn" type="button">另外一个按钮</button>
  16. </div>
  17. </nav>
  18. <nav class="navbar navbar-default" role="navigation">
  19. <div class="navbar-header"><a class="navbar-brand" href="#">Brand</a></div>
  20. <div class="nav navbar-nav">
  21. <button class="btn btn-danger navbar-btn" type="button">2个单独的按钮A</button>
  22. <button class="btn btn-danger navbar-btn" type="button">2个单独的按钮B</button>
  23. </div>
  24. </nav>

上述代码的运行效果如图4-42所示。

4.7.3 导航条中的按钮、文本、链接 - 图1 图4-42 导航条中的按钮运行效果

而对于文本和链接,如果连续放置两个相同的元素,则会出现一些问题。示例代码如下:

  1. <nav class="navbar navbar-default" role="navigation">
  2. <div class="navbar-header"><a class="navbar-brand" href="#">Brand</a></div>
  3. <div class="nav navbar-nav">
  4. <label class="navbar-text">文本A</label>
  5. <label class="navbar-text">文本A</label>
  6. </div>
  7. </nav>
  8. <nav class="navbar navbar-default" role="navigation">
  9. <div class="navbar-header"><a class="navbar-brand" href="#">Brand</a></div>
  10. <div class="nav navbar-nav">
  11. <p class="navbar-text">文本A</p>
  12. <p class="navbar-text">文本A</p>
  13. </div>
  14. </nav>
  15. <nav class="navbar navbar-default" role="navigation">
  16. <div class="navbar-header"><a class="navbar-brand" href="#">Brand</a></div>
  17. <div class="nav navbar-nav">
  18. <a href="#" class="navbar-link">汤姆大叔</a>
  19. <a href="#" class="navbar-link">汤姆大叔</a>
  20. </div>
  21. </nav>

上述代码的运行效果如图4-43所示。

4.7.3 导航条中的按钮、文本、链接 - 图2 图4-43 导航条中的文本运行效果

可以看出,navbar-text在label和p元素上使用的时候还比较正常,但是navbar-link就有问题了,因为没有设置padding值。解决方法是,在navbar-link样式上再应用navbar-text样式就可以了(或者在外面的容器上应用navbar-text样式)。

Button方面也有问题,如果将多个button放到navbar-nav样式的多个li元素里或者放到navbar-form样式的form元素会正常吗?也不会,不信看如图4-44所示的运行效果。

4.7.3 导航条中的按钮、文本、链接 - 图3 图4-44 导航条中的按钮运行bug

在li元素里放button,就会让多个button重叠在一起,因为li默认设置了margin-left为负值。而在form里放的话,左右间距是正常了,但是上下间距又不正常了。但上述方式内放置文本和链接却是正常的,因为li本身就支持,而且-1像素的margin-left对文本和链接没有太大影响。

总结,要尽量避免使用这些元素,如果非要用,就自己实现一个灰色背景,自己控制间距,没有必要在导航条的基础上做。按照上面的建议设置各个元素所需要改进的地方。或者如果需要显示两个,就使用navbar-left和navbar-left进行浮动显示吧。