Twitterブートストラップレスポンシブを使用してナビゲーションバーの折りたたみしきい値を変更する方法


94

私はRails 3.1.2プロジェクトでTwitter Bootstrap 2.0.1を使用しており、bootstrap-sassで実装されています。とファイル、bootstrap.cssおよびJavaScriptの両方をロードしていbootstrap-responsive.cssますbootstrap-collapse.js

例に似たナビゲーションバーを備えた流動的なレイアウトがあります。これは、ここにあるナビゲーションバーの「レスポンシブバリエーション」の手順に従います。それは正常に動作します。ページが約940pxより狭い場合、ナビゲーションバーは折りたたまれ、「ボタン」が表示され、クリックして展開できます。

ただし、私のナビゲーションバーは、幅が約550pxまで見栄えが良く、画面が非常に狭い場合を除いて、縮小する必要はありません。

画面の幅が550px未満の場合にのみ、ナビゲーションバーを折りたたむようにBootstrapに指示するにはどうすればよいですか?

この時点では、要素を並べて表示する代わりに要素を積み重ねるなど、他の応答動作を変更したくないことに注意してください。


すばらしい質問です。あなたがあなたの質問で与えた情報から、私は何もないところから始まる折りたたみ可能なナビゲーションバーを実装することができました。ありがとう!
methodMan 2012年

回答:


41

あなたは239行目を探しています bootstrap-responsive.css

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

max-width値がレスポンシブナビゲーションをトリガーする場所。それを550px程度に変更すると、適切にサイズ変更されます。


12
ありがとう。bootstrap-responsive.cssbootstrap-sass gemに埋め込まれています。はい、編集することはできますが、gemが更新されたら、もう一度編集する必要があります。他のCSS要素をオーバーライドするのと同様に、@ mediaクエリをオーバーライドする方法はありますか?
マークベリー

すべてのCSS宣言を再記述せずにオーバーライドを実現する方法は考えられません。
methodofaction 2012

わかりました。私はこのアプローチを試し、gemコードのその行をオーバーライドしましたが、それはうまくいきましたが、おそらく@media (max-width: 767px)ブロック内のCSSが原因で、ナビゲーションバーの767px幅より下に余分な水平パディングが表示されます。アンドレス・イリッヒの回答で示唆されているように、私はより広範なオーバーライドを行わなければならないようです。
Mark Berry、

2
@Andres Ilichの回答に関する私のコメントで述べたように、保守性に関しては、ソースコードを直接更新する方が2つの悪のどちらか少ない方に見えるので、ここではこの解決策を受け入れます。767pxを最小しきい値として使用できますが、navbarのカスタムコンテナーを作成して、影響を受けなかったカスタムコンテナーを作成することで、それをさらに減らすことができ@media (max-width: 767px)ます。うまくいけば、Bootstrap(またはbootstrap-sass)に、変数を使用してしきい値を設定する手段が含まれるようになると思いますが、メディアセレクターでの補間が必要になると思います。
Mark Berry、

1
navbarブレークポイントオーバーライドCSSがBootstrap 3で変更されました-これが3.1の動作例です:bootply.com/120604
Zim

73

ブートストラップ> 2.1 && <3

  • ブートストラップのバージョンを下げる
  • variables.lessの@navbarCollapseWidth変数を変更します
  • 再コンパイルします。

2013年更新:簡単な方法

(THXからArchonicへのコメント)

アップデート2014:ブートストラップ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& "Compile and Download"
digitalextremist

これ@navbarCollapseWidth: 600px;は、boostrap_and_overrides.css.lessのようなものを配置した場合、twitter-bootstrap-rails gemでも機能します。
sffc 2014年

これは、Bootstrap 3ではもはや存在しないようです。:(
CodingWithSpike 14

Bootstrap 4についてはどうですか?
アーロンフランケ

11

新しい@mediaクエリを確立して、必要に応じてnavbar要素をドロップダウンできます。必要なのは、希望するドロップ幅で新しいクエリに対応するように前者をリセットすることだけです。これを例にとります:

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

}

次のコードでは@media979pxマークの前のドロップを処理する元のクエリと、目的のドロップポイントをサポートする新しいクエリをどのように組み込んだかを確認できます550px。元のクエリをブートストラップ対応のcssから直接変更して、navbar要素の特定のクエリに適用されたすべてのスタイルをリセットし、代わりに必要なドロップポイントを含む新しいクエリに移植しました。このようにして、ブートストラップ対応のスタイルシートをいじり回すことなく、元のクエリから新しいクエリにすべてのスタイルを交換できます。このようにして、デフォルト値は引き続きドキュメント内の他の要素に適用されます。

これは、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。そのため、タグを比較して、何を行っているかを確認するのが困難です。
Mark Berry、

@MarkBerryあなたは正しい軌道に乗っています。@media (max-width: 550px)私が書いたクエリが初期従っていない@media (max-width: 979px)私がしたすべてが貼り付け放火犯とコピー/を通じて手でそれをオーバーライドする簡単な例であったため、クエリの構文を、1つ上の怠け者だが、あなたはあなたの第二の上に述べたようにそれを行うには正しい方法ですポイント。
Andres Ilich

1
メンテナンス性に関しては、これは難しいコールです。この種の広範なオーバーライドは、絶対的な制御を提供しながら、@ Duopixelの提案に従って1つまたは2つのソースコード行を直接更新するのではなく、ブートストラップを更新するたびに多くの手動チェックを行うことになると思います。私はCSSの専門家ではないため、Bootstrapを部分的に使用しているので、今のところはより簡単なソリューションを使用すると思います。
マークベリー

6

bootstrap-sassは、次のバージョン(2.2.1.0)で変数$ navbarCollapseWidthをサポートします。そのバージョンが公開されたら、あなたはそれを更新してあなたが望むとおりに行うことができます!


この変数をどこに置くか説明してもらえますか?
アンディヘイデン

Bootstrapのインポート前など@import "bootstrap";
アシュリー


4

私はこれが公式な方法ですぐに実装されると思います(そして期待しています)。その間、私は単純なcssハックを行っています。ドロップダウンボタンのvisible-phoneと、ナビゲーションバーに配置した2番目のボタンセットの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

これが私のコードです(他のすべてのソリューションでは、ナビゲーションバーがドロップしたときにファンキーなスクロールバーが表示されたので、コードを編集してそうしませんでした)。他の回答は投稿できなかったので、他の人が見つけられるようにここで行います。私は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

ブートストラップ3.x

LESSを使用すると、の値を変更し@screen-smallて最小サイズをターゲットにすることができます

例: @screen-small: 600px;

幅が600px未満になった場合にのみ、これを使用して「小型デバイス」モードに切り替えます


SCSSでこれを行う方法を知っていますか?
bcackerman 2013

すみません。私はブートストラップがLESSを使用して開発されたと思ったので、.cssの方法で行う必要があるかもしれません(上記のブートストラップ2の回答を参照)
JasonS 2013

1

ブートストラップ3.x

SASSを使用すると、$ screen-smの値を変更して最小サイズをターゲットにすることができます

例:$ screen-sm:600px;

この値は、@ import "ブートストラップ"の前にapplication.scssファイルに入れる必要があります。

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

"@"で始まる変数は、インポート前にオーバーライドするために "$"に変更しただけです。

以下は変数のリストです。


これは機能を壊します
Blnc

1

ブートストラップ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-*です。Bootstrap4.xのようにMobile-first)

キャロル・スケリーによるこの記事のクレジット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)

もちろん... 提案された方法の 1つを使用してLESSをコンパイルする必要があります


どうやらBootstrap 2.0.4はレスポンシブなもののファイル構造を変更しました。bootstrap-sass作成者@Thomas McDonald のコメントを参照してください。まだこれを掘り下げていませんが、SASSバージョンでもしきい値を簡単に変更できる場合があります。
Mark Berry

申し訳ありません; 私は質問のSassコメントを完全に逃しました...私はカテゴリに基づいてBootstrapに集中していました。ただし、ファイル構造は、Bootstrapで確認していたものと同じに見えます。どちらにしても、回答を更新して質問に回答します。
Jason Capriotti 2012年

心配ない。そして、最善の解決策は、navbarの折りたたみのしきい値を制御する変数または一連の変数をネイティブに提供するブートストラップが最善であることに完全に同意します。CSS、LESS、SASS、またはメディアクエリを十分に経験していないため、その拡張機能を記述できません;)。
Mark Berry、

0

折りたたみ可能なメインナビゲーションの項目に目に見える電話クラスのブロックと非表示の電話クラスを追加して、タイラーのハックをさらに進め、1つまたは2つの折りたたまれた項目を「引き出し」、電話のナビゲーションバーにも表示できます。

<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;
        }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.