如何使用Twitter引导响应式更改导航栏折叠阈值?


94

我在用bootstrap-sass实现的Rails 3.1.2项目中使用Twitter Bootstrap 2.0.1。我正在加载bootstrap.css和和bootstrap-responsive.css文件,以及bootstrap-collapse.jsJavascript。

我有一个与示例类似的导航栏,布局流畅。在此之前,导航栏“响应变化”说明这里。效果很好:如果页面的宽度小于940px,导航栏将折叠并显示一个“按钮”,我可以单击该按钮来展开。

但是,我的导航栏看起来不错,可宽至550像素左右,也就是说,除非屏幕非常狭窄,否则不需要折叠它。

如果屏幕宽度小于550像素,如何告诉Bootstrap仅折叠导航栏?

请注意,在这一点上我希望修改其它响应行为,如堆叠的元素,而不是并排显示他们一边。


好问题!根据您在问题中提供的信息,我能够从零开始实现可折叠的导航栏。谢谢!
methodMan 2012年

Answers:


41

您正在寻找的第239行 bootstrap-responsive.css

@media (max-width: 979px) {...}

max-width值触发响应式导航的位置。将其更改为550px左右,并且应该调整大小。


12
谢谢。bootstrap-responsive.css被埋在bootstrap-sass宝石中。是的,我可以编辑它,但是当gem更新后,我将不得不再次进行编辑。有没有一种方法可以覆盖@media查询,就像覆盖其他CSS元素一样?
马克·贝里

我想不出任何方法,而无需重述所有CSS声明。
methodofaction'2

好的谢谢。我尝试了这种方法,覆盖了gem代码中的那一行,虽然有点用,但是我在导航栏中获得了宽度小于767px的额外水平填充,这大概是因为@media (max-width: 767px)块中的CSS 。看起来我将不得不按照Andres Ilich的答案中的建议进行更广泛的覆盖。
马克·贝里

2
如我对@Andres Ilich的回答的评论中所述,在可维护性方面,直接更新源代码似乎少了两个弊端,因此,我现在将接受此解决方案。我可以将767px作为最小阈值,尽管我可以通过为不受影响的navbar创建一个自定义容器来进一步降低该阈值@media (max-width: 767px)。希望Bootstrap(或bootstrap-sass)有一天会提供一种使用变量设置阈值的方法,但我认为这需要在媒体选择器中进行插值
马克·贝里

1
引导程序3的导航栏断点覆盖CSS已更改-这是3.1的工作示例:bootply.com/120604
Zim

73

引导程序> 2.1 && <3

  • 使用较少版本的引导程序
  • 在variables.less中更改@navbarCollapseWidth变量
  • 重新编译。

2013年更新:简单方法

(通过评论将THX发送给Archonic)

2014年更新:Bootstrap 3.1.1和3.2 (甚至将其添加到文档中

如果要自定义或覆盖/编辑.less变量,则需要寻找:

//** Point at which the navbar becomes uncollapsed.
@grid-float-breakpoint:     @screen-sm-min;
//** Point at which the navbar begins collapsing.
@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);

6
您可以访问twitter.github.com/bootstrap/customize.html#variables并更改宽度和下载。无需编译。
Archonic

链接和按钮文本已更新:getbootstrap.com/customize/#less-variables和“编译和下载”
digitalextremist

如果将类似的内容@navbarCollapseWidth: 600px;放在boostrap_and_overrides.css.less中,则它也适用于twitter-bootstrap-rails gem 。
sffc 2014年

在Bootstrap 3中,这似乎不再是一件事情。:(
CodingWithSpike 2014年

Bootstrap 4呢?
亚伦·弗兰克

11

您可以建立一个新@media查询以将导航栏元素拖放到您认为合适的位置,您所要做的就是重设前者以适应具有所需放置宽度的新查询。以这个为例:

的CSS

/** Modified Responsive CSS **/

@media (max-width: 979px) {
    .btn-navbar {
        display: none;
    }
    .navbar .nav-collapse {
        clear: none;
    }

    .nav-collapse {
        height: auto;
        overflow: auto;
    }

    .navbar .nav {
        float: left;
        margin: 0 10px 0 0;
    }

    .navbar .brand {
        margin-left: -20px;
        padding: 8px 20px 12px;
    }

    .navbar .dropdown-menu:before, .navbar .dropdown-menu:after {
        display: block;
    }

    .navbar .nav > li > a, .navbar .dropdown-menu a {
        border-radius: 0;
        color: #999999;
        font-weight: normal;
        padding: 10px 10px 11px;
    }

    .navbar .nav > li {
        float: left;
    }

    .navbar .dropdown-menu {
        background-clip: padding-box;
        background-color: #FFFFFF;
        border-color: rgba(0, 0, 0, 0.2);
        border-radius: 0 0 5px 5px;
        border-style: solid;
        border-width: 1px;
        box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
        display: none;
        float: left;
        left: 0;
        list-style: none outside none;
        margin: 0;
        min-width: 160px;
        padding: 4px 0;
        position: absolute;
        top: 100%;
        z-index: 1000;
    }

    .navbar-form, .navbar-search {
        border:none;
        box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1) inset, 0 1px 0 rgba(255, 255, 255, 0.1);
        float: left;
        margin-bottom: 0;
        margin-top:6px;
        padding: 9px 15px;
    }

    .navbar .nav.pull-right {
        float: right;
        margin-left: auto;
    }
}

@media (max-width: 550px) {
    .btn-navbar {
        display: block;
    }
    .navbar .nav-collapse {
        clear: left;
    }

    .nav-collapse {
        height: 0;
        overflow: hidden;
    }

    .navbar .nav {
        float: none;
        margin: 0 0 9px;
    }

    .navbar .brand {
        margin: 0 0 0 -5px;
        padding-left: 10px;
        padding-right: 10px;
    }

    .navbar .dropdown-menu:before, .navbar .dropdown-menu:after {
        display: none;
    }

    .navbar .nav > li > a, .navbar .dropdown-menu a {
        border-radius: 3px 3px 3px 3px;
        color: #999999;
        font-weight: bold;
        padding: 6px 15px;
    }

    .navbar .nav > li {
        float: none;
    }

    .navbar .dropdown-menu {
        background-color: transparent;
        border: medium none;
        border-radius: 0 0 0 0;
        box-shadow: none;
        display: block;
        float: none;
        left: auto;
        margin: 0 15px;
        max-width: none;
        padding: 0;
        position: static;
        top: auto;
    }

    .navbar-form, .navbar-search {
        border-bottom: 1px solid #222222;
        border-top: 1px solid #222222;
        box-shadow: 0 1px 0 rgba(255, 255, 255, 0.1) inset, 0 1px 0 rgba(255, 255, 255, 0.1);
        float: none;
        margin: 9px 0;
        padding: 9px 15px;
    }

    .navbar .nav.pull-right {
        float: none;
        margin-left: 0;
    }

}

在下面的代码中,您可以看到我如何包含@media处理979px标记之前的放置的原始查询和支持所需放置点的新查询550px。我直接从引导响应的CSS修改了原始查询,以重置应用于该特定查询的导航栏元素的所有样式,并将它们移植到带有您需要的放置点的新查询中。这样,我们可以将所有样式从原始查询向下转换为新查询,而不会在启动响应式样式表中造成麻烦,这样默认值仍将应用于文档中的其他元素。

这是一个简短的演示,其中的媒体查询可以550px根据需要设置:http : //jsfiddle.net/wU8MW/

注意:我将上述修改后的@media查询放置在css框架下方,因为新的修改后的css应该比响应式css首先加载。


感谢您的详细回答。它似乎确实有效-我仍在尝试找出方法。如果我对您的理解正确,则您(1)克隆了原始@media (max-width: 979px)查询以进行新@media (max-width: 550px)查询。然后(2)您手动编码了一个新的979px查询,以覆盖主菜单中979px查询的效果bootstrap-responsive.css。CSS中标签的顺序似乎不遵循中的顺序bootstrap-responsive.css,因此我很难比较它们以查看您的操作。
马克·贝里

@MarkBerry您在正确的轨道上。@media (max-width: 550px)我编写的查询不遵循初始@media (max-width: 979px)查询语法,因为我所做的只是一个简单的示例,该示例通过Firebug和复制/粘贴手动覆盖了它,对此很懒,但是正确的方法是您在第二篇中提到的点。
安德烈斯·伊利希

1
当涉及到可维护性时,这是一个艰难的要求。恐怕这种广泛的覆盖,尽管提供了绝对的控制权,却意味着每次Bootstrap更新后都要进行大量的手动检查,而不是根据@Duopixel的建议直接更新一两个源代码行。我之所以使用Bootstrap的部分原因是因为我不是 CSS专家,所以我认为我现在将使用更简单的解决方案。
马克·贝里

6

bootstrap-sass在下一版本(2.2.1.0)中将支持变量$ navbarCollapseWidth。该版本上线后,您就可以对其进行更新,以完全满足您的要求!


请您解释一下该变量的位置吗?
安迪·海登

在导入任何Bootstrap之前@import "bootstrap";
Ashley


4

我怀疑(并希望)这将很快以正式方式实施。同时,我只是在做一个简单的CSS hack,在下拉按钮上使用visible-phone,在导航栏中放置第二组按钮上使用visible-tablet。所以在它看起来像这样之前:

<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a href="<%= root_url %>" class="brand brandtag"></a>
      <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-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>Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
    </div>
  </div>
</div>

现在看起来像:

<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a href="<%= root_url %>" class="brand brandtag"></a>
      <a class="btn btn-navbar visible-phone" data-toggle="collapse" data-target=".nav-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <div class="visible-tablet">
        <ul class="nav">
          <li>Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
      <div class="nav-collapse">
        <ul class="nav">
          <li>Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
    </div>
  </div>
</div>

请注意,元素的顺序很重要,否则,下一行的元素可能会出现问题


3

我创建了一个单独的SCSS文件,其中列出了引导程序所需的所有部分内容,这样我就可以根据我们站点的需要打开和关闭部分内容。这样,我可以轻松地覆盖断点变量。这是我得到的:

// Core variables and mixins
$grid-float-breakpoint: 991px;
@import "bootstrap/variables";
@import "bootstrap/mixins";

// Reset
@import "bootstrap/normalize";
//@import "bootstrap/print";

// Core CSS
@import "bootstrap/scaffolding";
@import "bootstrap/type";
//@import "bootstrap/code";
@import "bootstrap/grid";
@import "bootstrap/tables";
@import "bootstrap/forms";
@import "bootstrap/buttons";

// Components
@import "bootstrap/component-animations";
@import "bootstrap/glyphicons";
@import "bootstrap/dropdowns";
//@import "bootstrap/button-groups";
//@import "bootstrap/input-groups";
@import "bootstrap/navs";
@import "bootstrap/navbar";
@import "bootstrap/breadcrumbs";
@import "bootstrap/pagination";
@import "bootstrap/pager";
@import "bootstrap/labels";
@import "bootstrap/badges";
//@import "bootstrap/jumbotron";
//@import "bootstrap/thumbnails";
@import "bootstrap/alerts";
//@import "bootstrap/progress-bars";
//@import "bootstrap/media";
//@import "bootstrap/list-group";
@import "bootstrap/panels";
//@import "bootstrap/wells";
@import "bootstrap/close";

// Components w/ JavaScript
@import "bootstrap/modals";
@import "bootstrap/tooltip";
//@import "bootstrap/popovers";
//@import "bootstrap/carousel";

// Utility classes
@import "bootstrap/utilities";
@import "bootstrap/responsive-utilities";

2

这是我的代码(所有其他解决方案在导航栏下降时都显示了时髦的滚动条,因此我对其进行了编辑,因此没有)。我无法发布其他答案,因此我将在此处为其他人找到。我正在用Rails在Bootstrap 3.0中做到这一点。

资产/样式表/框架并覆盖以下内容:(将最大宽度调整为任意值以实现您的目标。)

@media (max-width: 2500px) {
.navbar-header {
    float: none;
}
.navbar-toggle {
    display: block;
}
.navbar-collapse {
    border-top: 1px solid transparent;
    box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);
}
.navbar-collapse.collapse {
    display: none!important;
}
.navbar-collapse.collapse.in {
    display: block!important;
}
.navbar-nav {
    float: none!important;
}
.navbar-nav>li {
    float: none;
}
.navbar-nav>li>a {
    padding-top: 10px;
    padding-bottom: 10px;
}

1

Bootstrap 3.x

使用LESS,您可以更改的值@screen-small以定位您的最小尺寸

例: @screen-small: 600px;

一旦宽度小于600像素,我就使用它仅切换到“微型设备”模式


您知道如何使用SCSS做到这一点吗?
bcackerman 2013年

对不起,我没有。我以为Bootstrap是使用LESS开发的,所以您可能必须使用.css方式(请参见上面的bootstrap 2答案)
JasonS 2013年

1

Bootstrap 3.x

使用SASS,您可以更改$ screen-sm的值以定位您的最小尺寸

例如:$ screen-sm:600px;

您需要将此值放在@import“ bootstrap”之前的application.scss文件中。

$screen-sm:600px;
@import "bootstrap";

较少的变量以“ @”开头,只需将其更改为“ $”即可在导入之前覆盖它们。

这是变量列表。


这破坏了功能
blnc

1

Bootstrap 4.x

更改Bootstrap 4.x中的崩溃阈值非常方便。有6种情况:

  1. 始终展开,永不崩溃(即断点为0px): <nav class="navbar navbar-expand">...</nav>
  2. 断点是sm(576px):<nav class="navbar navbar-expand-sm">...</nav>
  3. 断点为md(768px):<nav class="navbar navbar-expand-md">...</nav>
  4. 断点是lg(992px):<nav class="navbar navbar-expand-lg">...</nav>
  5. 断点为xl(1200px):<nav class="navbar navbar-expand-xl">.../nav>
  6. 始终崩溃,从不扩展(即断点为∞px)。:(<nav class="navbar">...</nav>只需删除navbar-expand-*该类。就像在Bootstrap 4.x中一样,移动优先)

感谢Carol Skelly的这篇文章,我发现https://medium.com/wdstack/examples-bootstrap-4-navbar-b3c9dc0edc1a


0

这是一个很好的示例,可以在其中使用LESS版本的Bootstrap CSS文件。下面是如何执行此操作。

最好将其作为Github上的请求请求提交,这样每个人都可以受益,并且您的“自定义代码”有望成为Bootstrap前进的一部分。

  • variables.less其中添加一个变量,该变量指定何时折叠导航栏。就像是:@navCollapseWidth: 979px
  • 然后修改responsive-navbar.less...
    • 向上更改@media (max-width: 979px)@media (max-width: @navCollapseWidth)
    • 在底部更改@media (min-width: 980px)@media (max-width: @navCollapseWidth - 1)

当然...您必须使用建议的方法之一来编译LESS 。


显然,Bootstrap 2.0.4更改了响应式内容的文件结构。参见bootstrap-sass作者@Thomas McDonald 的评论。尚未深入研究,但即使使用SASS版本,也可以更轻松地修改阈值。
Mark Berry

对不起; 我完全错过了问题中的Sass评论...我只是基于类别来关注Bootstrap。但是,文件结构看起来与我在Bootstrap中查看的结构相同……无论哪种方式,我都会更新对它的回答以回答问题。
杰森·卡普里奥蒂

别担心。我完全同意,最好的解决方案是引导程序本地提供一个或多个变量来控制导航栏折叠阈值。我对CSS,LESS或SASS或媒体查询没有足够的经验来撰写增强内容;)。
马克·贝里2012年

0

通过将可视电话分类的块和隐藏电话分类添加到主可折叠导航中的某个项目,进一步扩展了泰勒的技巧,您可以“拉出”一个或两个折叠的项目,甚至可以在电话导航栏中显示。

<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a href="<%= root_url %>" class="brand brandtag"></a>
      <a class="btn btn-navbar visible-phone" data-toggle="collapse" data-target=".nav-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <div class="visible-tablet">
        <ul class="nav">
          <li>Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
      <div class="visible-phone">
        <ul class="nav">
          <li>Navigation 1</li>
        </ul>
      </div>
      <div class="nav-collapse">
        <ul class="nav">
          <li class="hidden-phone">Navigation 1</li>
          <li>Navigation 2</li>
          <li>Navigation 3</li>
        </ul>
      </div>
    </div>
  </div>
</div>

0

只需将此代码记录在您的自定义style.css文件中,它将起作用

@media (min-width: 768px) and (max-width: 991px) {
        .navbar-collapse.collapse {
            display: none !important;
        }
        .navbar-collapse.collapse.in {
            display: block !important;
        }
        .navbar-header .collapse, .navbar-toggle {
            display:block !important;
        }
        .navbar-header {
            float:none;
        }
        .navbar-nav {
            float: none !important;
            margin: 0px;
        }
        .navbar-nav {
            margin: 7.5px -15px;
        }
        .nav > li {
            position: relative;
            display: block;
        }
        .navbar-nav > li {
            float: none !important;
        }
        .nav > li > a {
            position: relative;
            display: block;
            padding: 10px 15px;
        }
        .navbar-collapse {
            padding-right: 15px;
            padding-left: 15px;
            overflow-x: visible;
            border-top: 1px solid transparent;
            box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.1) inset;
        }
        .nav {
            padding-left: 0px;
            margin-bottom: 0px;
            list-style: outside none none;
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.