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 griddisplay: 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 にしていきましょう。

