2025 年版displayマルチキーワード構文超入門ガイド

本記事は備忘録として記録した内容です(2025年7月時点)。
可能な限り正確を期していますが、仕様やブラウザの更新により結果が異なることがあります。実装の最終判断は公式仕様・MDN などの一次情報と実機検証に基づいて行ってください。
display: block grid;
など “2 語” 指定の読み解き方- 3 語になる特別ケース ‑
list-item
の正体 flow‑root
・contents
など、今どき必須の特殊値- 2025 年7月現在のブラウザ対応状況と安全なフォールバック

.card { display: block; } /* 要素じたいはブロック */
.card__items { display: grid; }/* 子どもはグリッドで並べる */
CSS.card {
display: block grid; /* ← 1 行で完結! */
}
CSS- 1 語目=外側 (outer)
その要素じたいが文書内でどう並ぶ?(block
/inline
など) - 2 語目=内側 (inner)
要素の中で子どもをどう並べる?(flex
/grid
/flow
など)
「外側 → 内側」の順で 2 語を並べるだけ。
外側(outer) | 内側(inner) | 具体例 | ひとこと |
---|---|---|---|
block | flow | display:block flow; | 従来の「ブロック要素」 |
block | flex | display:block flex; | フレックスコンテナ |
block | grid | display:block grid; | グリッドコンテナ |
inline | flex | display:inline flex; | テキスト行の中でも崩れにくい |
inline | grid | display:inline grid; | インライングリッド |
display: grid
=display: block grid
display: block
=display: block flow
- CSS1の時代は、レイアウトモデルが少なく「外側だけ」分かれば十分でした(
block
/inline
など)。 - CSS2の時代 で
table
が登場し、内側のモデルという考え方が広がります。 - Flexbox / Grid の普及で「外側」と「内側」を明示しないと表現できない場面が増え、2 値構文が主流に。
つまり、設計の意図を 1 行でハッキリ書けるようになった、が最大のメリットです。
フロー系
従来(シングル) | 新しい 2 値 | 生成ボックス |
---|---|---|
block | block flow | ブロック |
inline | inline flow | インライン |
inline-block | inline flow-root | インラインブロック |
flow-root | block flow-root | ブロック(ルート) |
run-in | run-in flow | ランイン |
list-item | block flow list-item | マーカー付きブロック |
※ run-in は仕様上の値ですが主要ブラウザでは未実装です。
フロー以外
従来(シングル) | 新しい 2 値 | 生成ボックス |
---|---|---|
flex | block flex | フレックスコンテナ |
grid | block grid | グリッドコンテナ |
table | block table | テーブルラッパー |
ruby | inline ruby | ルビコンテナ |
inline-flex | inline flex | インラインフレックス |
inline-grid | inline grid | インライングリッド |
inline-table | inline table | テーブル(インライン) |
none | ー | 非表示 (単独キーワード) |
contents | ー | 子階層に置き換え (単独キーワード) |
インラインフレックスで “価格+バッジ”
<span class="price">¥9,800 <span class="tax">税込</span></span>
HTML.price{
display: inline flex; /* outer: inline / inner: flex */
gap: .25em;
align-items: baseline;
}
CSSclearfix をやめて flow-root
.div{
display: block flow-root; /* margin のはみ出しを防止 */
}
CSS
ラッパーを消してネスト削減(contents
)
/* PC 幅では .card__body のボックスを作らず、子だけ並べる */
@media (min-width: 800px){
.card__body{ display: contents; }
}
CSScontents
は要素じたいの 背景や枠線・margin/padding が無効 になります。必要な装飾は子要素へ移動しましょう。
3つ目の語が付いて3値になるのは、list-item を使うときだけです。
flow-root は内側(inner)で使う2値構文、contents は単独キーワード(外側・内側を持たない)です。
/* 自動で ::marker(番号・黒丸など)が付く */
h2.section-title{
display: block flow list-item; /* 3 語 */
}
/* 省略形(内部的には上と同義)*/
h2.section-title{
display: list-item; /* = block flow list-item */
}
CSSflow-root
や contents
を「3 値」と呼ぶのは誤りです。flow-root
は 2 値の内側、contents
は 単独キーワード。
フォーム要素(label / fieldset など)の親や、位置計算に依存する場面では display: contents を避けるのが安全です。
- Chrome / Edge / Firefox / Safari(デスクトップ・モバイル)
… 2 値構文・list-item
・flow-root
・contents
は概ね対応済み - IE11 など旧環境
… 非対応。フォールバックが必要
/* 1) まず旧式(シングル値)を書く */
.list{ display: grid; }
/* 2) すぐ下で 2 値を上書き(モダン環境が勝つ) */
.list{ display: block grid; }
CSSdisplay
は 2つの言葉を並べて「外側のふるまい」と「内側のレイアウト」を同時に指定できます。
例)display: block grid;
は「要素はブロックとして並び、子どもはグリッドで並べる」の意味。
3つ目の言葉が必要になるのは list-item
を付けるときだけ。
flow-root
や contents
を使えば、昔の clearfix や余計なラッパーもぐっと減らせます。
主要ブラウザはすでに対応済み。まずは小さな UI から 1行だけ 新しい書き方に置き換えて、効果を確認してみましょう。
display: <外側> <内側>
が基本。grid
=block grid
、block
=block flow
と理解しておくと迷わない- 3値構文は
list-item
のときだけ(=block flow list-item
相当) flow-root
で clearfix 不要に、contents
で余計な div を削減- 主要ブラウザは対応済み。古い環境が混在する場合は
旧式 → 新式の順に 重ね書き すれば安全
「どこから直せばいい?」と迷ったら、まずは ボタン+アイコン を inline flex
に。
つまずいたところや、うまくいった事例があれば、ぜひコメントで教えてください。
一緒に、読みやすく壊れにくい CSS にしていきましょう。