Bootstrap 4 tutorial

レイアウト: 概要 / グリッド / レイアウトユーティリティ

概要

コンテナ

Bootstrapではレイアウトのトップレベル要素(コンテナ)として .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文字を用いたレスポンシブ設定を用いる。ルールは次の通り。

Z-index

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(-fluid)? にはガター(gutter)と呼ばれる左右15pxずつのパディング(内部要素との余白)が設定され、レイアウトする要素はその内側に配置される。そのため実際の内部要素の(最大)幅は div.container の幅(ブレークポイント)から左右15pxずつ引いた値になる。

本ページ自身もコンテナを用いたレイアウトでガターが設定されている。次はそれを示す例で、仕組みが分かるようにコンテナに灰色のボーダー、内部要素の領域に淡い背景色を付けている。左右に15pxずつパディング(ガター)が付き、その内側にレイアウトされる。

ガターはレイアウトの余白を確保するためのもので、列 .col を複数横に配置すると30pxの余白を取る(Bootstrap標準値)。なおパディング(ガター)を設定した .col の内部がコンテンツ領域なので、背景を設定する場合は内部にもう1レベル div などの要素が必要になる(上の例のライトグレー背景の部分)。

グリッドを用いる場合はこの内部に行 div.row を配置し、さらにその内側に列 div.col を配置するが、ガターの扱いが各レベルで全て異なり、特殊な設定が行われている。次はそれを示す実例(内部の文章はその解説)。コンテナ/行/列にはそれぞれ別の色のボーダーを設定しているが、結果的に同じ領域になるため3つ重なって表示される。

  • 親: コンテナ div.container (灰色ボーダー)
    • ガターを設定: padding-(left|right): 15px
  • 子: 行 div.row (赤ボーダー)
    • ガターをキャンセル: margin-(left|right) : -15px
    • パディングなし: padding-(left|right): 0
  • 孫: 列 div.col (青ボーダー)
    • マージンなし: margin-(left|right): 0
    • ガターを(再)設定: padding-(left|right): 15px
  • 内部要素(この部分) (淡い背景色)
注: 特に .row で左右マージンに負の値を設定してガターをキャンセルしている点に注意。そのためコンテナ/行/列への横方向のマージン/パディング設定を行う場合は注意が必要。特に行の横マージン、列の横パディングを独自に設定するとガターの設定を壊してしまい、予測外の結果になることが多い。

列の等分配置

div.row の中に列 div.col を複数用いると行の中に等分配置する。行の幅や内部要素の幅、種類などから一行に入る列の最大数をブラウザが判定し、それを超えると次の行に折り返す。

次は環境別の最大個数確認用に作った例(20個まで)。

1/1
1/2
2/2
1/3
2/3
3/3
1/4
2/4
3/4
4/4
1/5
2/5
3/5
4/5
5/5
1/6
2/6
3/6
4/6
5/6
6/6
1/7
2/7
3/7
4/7
5/7
6/7
7/7
1/8
2/8
3/8
4/8
5/8
6/8
7/8
8/8
1/9
2/9
3/9
4/9
5/9
6/9
7/9
8/9
9/9
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10
1/11
2/11
3/11
4/11
5/11
6/11
7/11
8/11
9/11
10/11
11/11
1/12
2/12
3/12
4/12
5/12
6/12
7/12
8/12
9/12
10/12
11/12
12/12
1/13
2/13
3/13
4/13
5/13
6/13
7/13
8/13
9/13
10/13
11/13
12/13
13/13
1/14
2/14
3/14
4/14
5/14
6/14
7/14
8/14
9/14
10/14
11/14
12/14
13/14
14/14
1/15
2/15
3/15
4/15
5/15
6/15
7/15
8/15
9/15
10/15
11/15
12/15
13/15
14/15
15/15
1/16
2/16
3/16
4/16
5/16
6/16
7/16
8/16
9/16
10/16
11/16
12/16
13/16
14/16
15/16
16/16
1/17
2/17
3/17
4/17
5/17
6/17
7/17
8/17
9/17
10/17
11/17
12/17
13/17
14/17
15/17
16/17
17/17
1/18
2/18
3/18
4/18
5/18
6/18
7/18
8/18
9/18
10/18
11/18
12/18
13/18
14/18
15/18
16/18
17/18
18/18
1/19
2/19
3/19
4/19
5/19
6/19
7/19
8/19
9/19
10/19
11/19
12/19
13/19
14/19
15/19
16/19
17/19
18/19
19/19
1/20
2/20
3/20
4/20
5/20
6/20
7/20
8/20
9/20
10/20
11/20
12/20
13/20
14/20
15/20
16/20
17/20
18/20
19/20
20/20

構造は次の通り(以下すべて親のコンテナ div.container は省略)。

折り返し(改行)

div.col を用いた等分配置で、特定位置で折り返す場合は中身が空の div.w-100 を挿入する。

.row
.row.w-100
.row
.row
.row.w-100
.row
.row
.row
.row

列の幅指定(1/12ステップ)

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)

幅の自動設定

(.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-3

強制折り返し

幅を指定する場合も中身が空の div.w-100 を挿入するとその位置で強制的に折り返す。

.col-3
.col-5.w-100
.col-4

レスポンシブ幅設定

.col-(sm|md|lg|xl)(-1|-2|-3|...|-12|-auto)?

例1: 等分のレスポンシブ動作

.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-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-6
例3: 自動幅のレスポンシブ動作
.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

レイアウトの縦/横切り替え

ここから応用例。モバイル/PCで次のようにレイアウトを切り替える場合を考える。

モバイル
1-1
1-2
2-1
2-2
2-3
PC
1-1
1-2
2-1
2-2
2-3

設定例は次の通り(ブラウザで幅を変更すると切り替わる)。なおPC/モバイルの切り替えはmd(≧768px)に設定している(公式ドキュメントの例はsmだがPCブラウザで確認しやすいよう変更)。

1-1 .col-md-8
1-2 .col-md-4
2-1 .col-md
2-2 .col-md
2-3 .col-md

幅指定とデバイス幅制御の組み合わせ

次もモバイル/PCの表示切り替え例。

モバイル
1-1
1-2
2-1
2-2
2-3
3-1
3-2
PC
1-1
1-2
2-1
2-2
2-3
3-1
3-2

実際に設定した例は次の通り(mdブレークポイントで切り替え)。

1-1 .col-12.col-md-8
1-2 .col-6.col-md-4
2-1 .col-6.col-md-4
2-2 .col-6.col-md-4
2-3 .col-6.col-md-4
3-1 .col-6
3-2 .col-6

幅の自動設定とFlexboxの組み合わせ

幅の自動設定、Flexboxとレスポンシブ動作を組み合わせた例(公式ドキュメントより、かなり複雑)。

実際に設定したものを先に示す( .col-md-auto を設定した中央要素は色を変えて表示)。

1-1 .col.col-lg-2
1-2 .col-md-auto
1-3 .col.col-lg-2
2-1 .col
2-2 .col-md-auto
2-3 .col.col-lg-2

全ケースのレスポンシブ動作は3通りある。

sm(<768px)
1-1
1-2
1-1
2-1
2-2
2-1
lg(≥992px)
1-1
1-2
1-3
2-1
2-2
2-3
md(768px≤width<992px)
1-1
1-2
1-3
2-1
2-2
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-3

div.row.no-gutters

.col-9
.col-3

実際には単にガターを除去するのではなく次の通り設定している。これに対する通常の設定はガターを参照(比較すること)。

次は公式ドキュメントからの例(少し補足)。まず実例を示す。

div.row

.col-12.col-sm-6.col-md-8
.col-6.col-md-4

div.row.no-gutters

.col-12.col-sm-6.col-md-8
.col-6.col-md-4

これもレスポンシブ動作の例になっている。ガターとは関係ない(本題ではない)が、全応答ケースを示しておく。

xs(<576px)
12
6
12
6
md以上(≥768px)
8
4
8
4
sm(576px≤width<768px)
6
6
6
6

列の順序指定

div.col はデフォルトでは記述順に配置するが .order-* で順序を制御できる(⇒ Flexbox )。

.order-n (1≦n≦12)を用いて設定 (12⇒1⇒なし⇒7の順に記述した場合: なしは先頭に配置される)

.order-12
.order-1
なし
.order-7

.order-firstは必ず先頭、.order-lastは必ず末尾 (なし⇒last⇒firstの順に記述した場合)

なし
.order-last
.order-first

列の左右配置調整

.offset-*を用いた配置制御

.offset-(1|2|3|...) で数値に対応した空間を確保できる。

.col-4
.offset-4.col-4
.offset-3.col-3
.offset-3.col-3
.offset-3.col-6

レスポンシブ設定 .offset-(xl|lg|md|sm)-(1|2|3|...)

次は複雑な例(公式ドキュメントより)。まず実際に設定したものを先に示す。

1L
.col-sm-5
.col-md-6
1R
.offset-sm-2.col-sm-5
.offset-md-0.col-md-6
2L
.col-sm-6
.col-md-5
.col-lg-6
2R
.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通り

xs(<576px)
1L
1R
2L
2R
sm(576px≤width<768px)
1L
1R
2L
2R
md(768px≤width<992px)
1L
1R
2L
2R
lg,xl(≥992px)
1L
1R
2L
2R
マージンユーティリティ

空白ユーティリティを用いた例。これも動作がやや複雑なのでまず設定例から示す。

1L .col-md-4
1R .col-md-4.ml-auto
2L .col-md-3.ml-md-auto
2R .col-md-3.ml-md-auto
3L .col-auto.mr-auto
3R .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

動作は次の通り。

xs, sm (<768px)
1L
1R
2L
2R
3L
3R
md, lg, xl (≥768px)
1L
1R
2L
2R
3L
3R

ネスト

div.col(-*) の中に行 div.row(-*) を入れてネストさせることができる(理論的には何重でも可能だが意味があるのはせいぜい2重まで)。例えば次のような(12と素因数の相性が悪い)8分割単位の互い違いレイアウトを作る場合に必要になる。

1
2
3
4
5
6
7
8

構造を色分けしたものを次に示す。構造は上と同じだが要素境界にボーダを追加し、さらに外側 div.row に薄緑、内側 div.row にピンクの背景を付けている(上下パディングも適宜追加)。実際にはガター処理のため左右が15pxずつはみ出していることに注意。通常は行 .row(-*) や列 .col(-*) に背景やボーダーは付けないため見えないが、ここでは構造解説のためわざと見せている。

1
2
3
4
5
6
7
8

レイアウトユーティリティ

レイアウト用のBootstrapユーティリティについて(簡単な紹介のみ)