レイアウト: 概要 / グリッド / レイアウトユーティリティ
.container または .container-fluid を用いる。
div.container ⇒ (レスポンシブ) 画面幅の内側に入る固定ステップに調整、中央揃えdiv.container-fluid ⇒ 常に(親要素に対し)横幅100%に設定Bootstrapではレスポンシブ応答する幅のステップ設定をブレークポイント(breakpoint)と呼び、画面幅に対応した5通りの設定がある(詳しくは公式ドキュメントの Grid options 一覧表を参照)。
| 名称 | ビューポート(画面)幅 | .container に設定される幅 |
|---|---|---|
| (xs) | <576px | 設定なし(auto) |
| sm | ≧576px | 540px |
| md | ≧768px | 720px |
| lg | ≧992px | 960px |
| xl | ≧1200px | 1140px |
Bootstrapでは .col-md のように上記2文字を用いたレスポンシブ設定を用いる。ルールは次の通り。
.col )は「全画面幅で有効(デフォルト)」、優先度は最小.col-md )は「この幅以上で有効」、幅指定なしより優先-xs という幅指定は(意図的に)ない。また優先度を利用して特定の幅領域だけ設定を有効にしたり、設定を変えてレイアウトを組み替えたりすることができる。Bootstrapでは 1000 以上の z-index を特定のコンポーネントのために予約している。また 1,2,3 は要素の状態(ホバー、アクティブ、フォーカス)の表示カスタマイズのために用いられる(表示効果用に内部で作成される兄弟要素に設定される)。現在Bootstarpが使用している z-index の一覧は次の通り。
| Z-index | 使用目的(コンポーネント) |
|---|---|
| 1,2,3 | 要素状態(ホバー、アクティブ、フォーカス)の表示効果用 |
| 1000 | ドロップダウン |
| 1020 | 上端張り付き (ナビゲーションバー) |
| 1030 | 上端固定 / 下端固定 (ナビゲーションバー) |
| 1040 | バックドロップ (モーダル背景) |
| 1050 | モーダル |
| 1060 | ポップオーバー |
| 1070 | ツールチップ |
グリッドはBootstrapの基本機能で、次に示す3階層の構造を用いてレイアウトを組む。
div.container (または div.container-fluid )
div.row (ここに display: flex が設定され、内側でflexbox機能を使える)
div.col{+各種設定}コンテナ div.container(-fluid)? にはガター(gutter)と呼ばれる左右15pxずつのパディング(内部要素との余白)が設定され、レイアウトする要素はその内側に配置される。そのため実際の内部要素の(最大)幅は div.container の幅(ブレークポイント)から左右15pxずつ引いた値になる。
本ページ自身もコンテナを用いたレイアウトでガターが設定されている。次はそれを示す例で、仕組みが分かるようにコンテナに灰色のボーダー、内部要素の領域に淡い背景色を付けている。左右に15pxずつパディング(ガター)が付き、その内側にレイアウトされる。
div.container (灰色ボーダーの領域)
padding-(left|right): 15pxガターはレイアウトの余白を確保するためのもので、列 .col を複数横に配置すると30pxの余白を取る(Bootstrap標準値)。なおパディング(ガター)を設定した .col の内部がコンテンツ領域なので、背景を設定する場合は内部にもう1レベル div などの要素が必要になる(上の例のライトグレー背景の部分)。
$grid-gutter-width で設定しており、Sassレベルでカスタマイズすれば変更可能。詳しくはSassソースからのカスタマイズを参照。グリッドを用いる場合はこの内部に行 div.row を配置し、さらにその内側に列 div.col を配置するが、ガターの扱いが各レベルで全て異なり、特殊な設定が行われている。次はそれを示す実例(内部の文章はその解説)。コンテナ/行/列にはそれぞれ別の色のボーダーを設定しているが、結果的に同じ領域になるため3つ重なって表示される。
div.container (灰色ボーダー)
padding-(left|right): 15pxdiv.row (赤ボーダー)
margin-(left|right) : -15pxpadding-(left|right): 0div.col (青ボーダー)
margin-(left|right): 0padding-(left|right): 15px.row で左右マージンに負の値を設定してガターをキャンセルしている点に注意。そのためコンテナ/行/列への横方向のマージン/パディング設定を行う場合は注意が必要。特に行の横マージン、列の横パディングを独自に設定するとガターの設定を壊してしまい、予測外の結果になることが多い。行 div.row の中に列 div.col を複数用いると行の中に等分配置する。行の幅や内部要素の幅、種類などから一行に入る列の最大数をブラウザが判定し、それを超えると次の行に折り返す。
次は環境別の最大個数確認用に作った例(20個まで)。
div.col* にボーダー .borderを付け、さらにコンテンツ領域と左右余白(ガター)の設定状態を表示するためコンテント領域に薄い背景色 .bg-light を付けている。構造は次の通り(以下すべて親のコンテナ div.container は省略)。
div.row
div.col (×設定個数: 1..16)
{行内index}/{設定個数}div.col を用いた等分配置で、特定位置で折り返す場合は中身が空の div.w-100 を挿入する。
.row.row⇒ .w-100.row.row.row⇒ .w-100.row.row.row.rowdiv.row
div.col (×2)div.w-100 (強制折り返し)div.col (×3)div.w-100 (強制折り返し)div.col (×4)div.col-(1|2|3|4|5|6|7|8|9|10|11|12)
.col-1.col-2.col-3.col-4.col-5.col-6.col-7.col-8.col-9.col-10.col-11.col-12.col (1/6).col-6 6/12固定.col (1/6).col (1/6).col (7/36).col (7/36).col-5 5/12固定.col (7/36)div.row
div.coldiv.col-6div.col (×2)div.row
div.col (×2)div.col-5div.col(.col の代わりに).col-auto を用いるとブラウザのデフォルト幅に設定する(CSSの width: auto; を設定)。この場合は(均等配分でなく)内部コンテンツに対応した幅に設定される。
.col-auto 123
.col-auto 1234567890
.col-auto 12345678901234567890
1行に12を超える幅の列を設定した場合は≦12となるように適宜折り返される。
.col-9.col-4.col-7.col-3div.row
div.col-9div.col-4 ⇒ 合計>12のため折り返して次行の先頭として表示div.col-7div.col-3 ⇒ 合計>12のため折り返して次行の先頭として表示幅を指定する場合も中身が空の div.w-100 を挿入するとその位置で強制的に折り返す。
.col-3.col-5⇒ .w-100.col-4div.row
div.col-3div.col-5div.w-100 (強制折り返し)div.col-4.col-(sm|md|lg|xl)(-1|-2|-3|...|-12|-auto)?
.col (常に2列等配分)
.col.col.col-sm (幅≧576pxは2列、未満は2行( .col なしと同じ)
.col-sm.col-sm.col-md (幅≧768pxは2列、未満は2行( .col なしと同じ)
.col-md.col-md.col-lg (幅≧992pxは2列、未満は2行( .col なしと同じ)
.col-lg.col-lg.col-xl (幅≧1200pxは2列、未満は2行( .col なしと同じ)
.col-xl.col-xldiv.row
div.col(-sm|-md|-lg|-xl)? (×2).col-3.col-6.col-sm-3.col-sm-6.col-md-3.col-md-6.col-lg-3.col-lg-6.col-xl-3.col-xl-6div.row
div.col(-sm|-md|-lg|-xl)?-3div.col(-sm|-md|-lg|-xl)?-6.col-auto 12345
.col-auto 12345678901234567890
.col-sm-auto 12345
.col-sm-auto 12345678901234567890
.col-md-auto 12345
.col-md-auto 12345678901234567890
.col-lg-auto 12345
.col-lg-auto 12345678901234567890
.col-xl-auto 12345
.col-xl-auto 12345678901234567890
div.row
div.col(-sm|-md|-lg|-xl)?-auto (×2)
ここから応用例。モバイル/PCで次のようにレイアウトを切り替える場合を考える。
設定例は次の通り(ブラウザで幅を変更すると切り替わる)。なおPC/モバイルの切り替えはmd(≧768px)に設定している(公式ドキュメントの例はsmだがPCブラウザで確認しやすいよう変更)。
.col-md-8.col-md-4.col-md
.col-md
.col-md
div.row
div.col-md-8div.col-md-4div.row
div.col-md (×3)次もモバイル/PCの表示切り替え例。
実際に設定した例は次の通り(mdブレークポイントで切り替え)。
.col-12.col-md-8.col-6.col-md-4.col-6.col-md-4.col-6.col-md-4.col-6.col-md-4.col-6.col-6幅の自動設定、Flexboxとレスポンシブ動作を組み合わせた例(公式ドキュメントより、かなり複雑)。
div.row に .justify-content-md-center (⇒ Flexbox)を設定(md以上で要素を中央寄せ).col-md-auto を設定(md以上でブラウザデフォルト幅).col (等分、または取得できる最大幅).col.col-lg-2 (デフォルトは等分配置、lg以上で幅2)実際に設定したものを先に示す( .col-md-auto を設定した中央要素は色を変えて表示)。
.col.col-lg-2.col-md-auto.col.col-lg-2.col.col-md-auto.col.col-lg-2全ケースのレスポンシブ動作は3通りある。
Flexboxユーティリティを利用する。
以下の例では行 div.row に赤いボーダーを付け、高さを 5rem に固定
.row.align-items-start
.col (1/3)
.col (2/3)
.col (3/3)
.row.align-items-center
.col (1/3)
.col (2/3)
.col (3/3)
.row.align-items-end
.col (1/3)
.col (2/3)
.col (3/3)
.col.align-self-(start|center|end)
-start-center-end.row.justify-content-start
.col-2 (1/3).col-2 (2/3).col-2 (3/3).row.justify-content-center
.col-2 (1/3).col-2 (2/3).col-2 (3/3).row.justify-content-end
.col-2 (1/3).col-2 (2/3).col-2 (3/3).row.justify-content-around
.col-2 (1/3).col-2 (2/3).col-2 (3/3).row.justify-content-between
.col-2 (1/3).col-2 (2/3).col-2 (3/3)グリッドには左右両方に15pxのパディング(ガター)が設定されているが、行 div.row に .no-gutters を追加するとガターを除去して配置する。
div.row
.col-9.col-3div.row.no-gutters
.col-9.col-3実際には単にガターを除去するのではなく次の通り設定している。これに対する通常の設定はガターを参照(比較すること)。
div.row.no-gutters
-15px )を解除( 0 に設定)
15px ずつ短くなる> を用いて)子要素の列 div.col-* のガターを解除( 0 に設定)次は公式ドキュメントからの例(少し補足)。まず実例を示す。
div.row
.col-12.col-sm-6.col-md-8.col-6.col-md-4div.row.no-gutters
.col-12.col-sm-6.col-md-8.col-6.col-md-4これもレスポンシブ動作の例になっている。ガターとは関係ない(本題ではない)が、全応答ケースを示しておく。
div.col はデフォルトでは記述順に配置するが .order-* で順序を制御できる(⇒ Flexbox )。
.order-n (1≦n≦12)を用いて設定 (12⇒1⇒なし⇒7の順に記述した場合: なしは先頭に配置される)
.order-12.order-1.order-7div.row
div.col.order-12div.col.order-1div.coldiv.col.order-7.order-firstは必ず先頭、.order-lastは必ず末尾 (なし⇒last⇒firstの順に記述した場合)
.order-last.order-firstdiv.row
div.coldiv.col.order-lastdiv.col.order-first.offset-*を用いた配置制御
.offset-(1|2|3|...) で数値に対応した空間を確保できる。
.col-4.offset-4.col-4div.row
div.col-4div.offset-4.col-4.offset-3.col-3.offset-3.col-3div.row
div.offset-3.col-3div.offset-3.col-3.offset-3.col-6div.row
div.offset-3.col-6レスポンシブ設定 .offset-(xl|lg|md|sm)-(1|2|3|...)
次は複雑な例(公式ドキュメントより)。まず実際に設定したものを先に示す。
.col-sm-5.col-md-6.offset-sm-2.col-sm-5.offset-md-0.col-md-6.col-sm-6.col-md-5.col-lg-6.col-sm-6.offset-md-2.col-md-5.offset-lg-0.col-lg-6全条件は次の通り
| xs | sm | md | lg,xl | xs | sm | md | lg,xl | ||
|---|---|---|---|---|---|---|---|---|---|
| 1行目左 (1L) |
なし (幅100%) |
幅5 | 幅6 | 1行目右 (1R) |
なし (幅100%) |
オフセット2 幅5 |
オフセット0 [注] 幅6 |
||
| 2行目左 (2L) |
なし (幅100%) |
幅6 | 幅5 | 幅6 | 2行目右 (2R) |
なし (幅100%) |
幅6 | オフセット2 幅5 |
オフセット0 [注] 幅6 |
レスポンシブ動作は次の4通り
空白ユーティリティを用いた例。これも動作がやや複雑なのでまず設定例から示す。
.col-md-4.col-md-4.ml-auto.col-md-3.ml-md-auto.col-md-3.ml-md-auto.col-auto.mr-auto.col-auto条件は次の通り
| < md | ≧ md | < md | ≧ md | ||
|---|---|---|---|---|---|
| 1行目左 (1L) |
なし (幅100%) |
幅4 | 1行目右 (1R) |
なし (幅100%) |
幅4 左マージン auto |
| 2行目左 (2L) |
なし (幅100%) |
幅3 左マージン auto |
2行目右 (2R) |
なし (幅100%) |
幅3 左マージン auto |
| 3行目左 (3L) |
幅 auto右マージン auto |
3行目右 (3R) |
幅 auto |
||
動作は次の通り。
列 div.col(-*) の中に行 div.row(-*) を入れてネストさせることができる(理論的には何重でも可能だが意味があるのはせいぜい2重まで)。例えば次のような(12と素因数の相性が悪い)8分割単位の互い違いレイアウトを作る場合に必要になる。
div.row
div col-6 (左上半分)
div.row (ネストして内部を再分割)
div.col-3 (×4)
div.bg-light
(1|2|3|4)div.row
div.col-6.offset-6 (右下半分)
div.row (ネストして内部を再分割)
div.col-3 (×4)
div.bg-light
(5|6|7|8)構造を色分けしたものを次に示す。構造は上と同じだが要素境界にボーダを追加し、さらに外側 div.row に薄緑、内側 div.row にピンクの背景を付けている(上下パディングも適宜追加)。実際にはガター処理のため左右が15pxずつはみ出していることに注意。通常は行 .row(-*) や列 .col(-*) に背景やボーダーは付けないため見えないが、ここでは構造解説のためわざと見せている。
レイアウト用のBootstrapユーティリティについて(簡単な紹介のみ)