はじめに
CSSでWebページのレイアウトを構築する際、「なぜこの要素は横に並ばないのか」「なぜ幅や高さの指定が効かないのか」といった疑問に直面することがあります。これらの問題を理解するには、displayプロパティの仕組みを知ることが不可欠です。
displayプロパティは、要素がどのように表示されるか、そして子要素がどのようにレイアウトされるかを決定するCSSの根幹となるプロパティです。このプロパティを正しく理解することで、意図したレイアウトを効率的に実現できるようになります。
本記事では、displayプロパティについて以下の内容を解説します。
- ブロック要素(
block)とインライン要素(inline)の違い inline-blockの特性と活用場面displayプロパティの主要な値(none、flex、gridなど)の概要- 実務で役立つ使い分けのポイント
前提条件
本記事を読み進めるにあたり、以下の知識があることを前提としています。
- HTMLの基本的なタグ構造(
div、span、pなど) - CSSの基本構文(セレクタ・プロパティ・値の関係)
- CSSボックスモデルの基本的な理解
動作確認環境
- Google Chrome 131以降
- Firefox 133以降
- Safari 18以降
- Microsoft Edge 131以降
displayプロパティとは
MDN Web Docsでは、displayプロパティを次のように説明しています。
displayはCSSのプロパティで、要素をブロックボックスとインラインボックスのどちらとして扱うか、およびその子要素のために使用されるレイアウト(フローレイアウト、グリッド、フレックスなど)を設定します。
つまり、displayプロパティは要素の「外側の表示型」と「内側の表示型」の2つを定義します。
flowchart TB
subgraph display["displayプロパティ"]
direction TB
outer["外側の表示型(outer display type)"]
inner["内側の表示型(inner display type)"]
end
outer --> outer_desc["親要素のフローレイアウトでの振る舞い<br>(block / inline)"]
inner --> inner_desc["子要素のレイアウト方法<br>(flow / flex / grid など)"]| 表示型 | 説明 |
|---|---|
| 外側の表示型 | 要素が親要素のフローレイアウトにどう参加するかを決定 |
| 内側の表示型 | 要素内の子要素がどのようにレイアウトされるかを決定 |
ブロック要素(display: block)
display: blockを指定した要素は、ブロックボックスを生成します。ブロック要素には以下の特性があります。
ブロック要素の特性
| 特性 | 説明 |
|---|---|
| 改行 | 要素の前後で改行が発生し、常に新しい行から始まる |
| 幅 | デフォルトで親要素の幅いっぱいに広がる |
| サイズ指定 | widthとheightの指定が有効 |
| 余白 | marginとpaddingが上下左右すべてで有効 |
HTMLでのデフォルトブロック要素
以下のHTML要素は、デフォルトでdisplay: blockとして表示されます。
<div><p><h1>〜<h6><ul>、<ol>、<li><header>、<footer>、<section>、<article><form>
ブロック要素の使用例
|
|
|
|
この例では、各<p>要素がブロック要素として表示され、それぞれが新しい行に配置されます。
flowchart TB
subgraph container["親要素(div)"]
direction TB
p1["1つ目の段落です。"]
p2["2つ目の段落です。"]
p3["3つ目の段落です。"]
end
p1 --> p2
p2 --> p3インライン要素(display: inline)
display: inlineを指定した要素は、インラインボックスを生成します。インライン要素は、ブロック要素とは異なる特性を持ちます。
インライン要素の特性
| 特性 | 説明 |
|---|---|
| 改行 | 要素の前後で改行が発生しない(テキストのように横に流れる) |
| 幅 | コンテンツの幅に合わせて縮小する |
| サイズ指定 | widthとheightの指定が無効 |
| 余白 | 水平方向のmarginとpaddingは有効、垂直方向は他の要素に影響しない |
HTMLでのデフォルトインライン要素
以下のHTML要素は、デフォルトでdisplay: inlineとして表示されます。
<span><a><strong>、<em><img>(ただし置換要素として特殊な振る舞いをする)<code>、<kbd><br>
インライン要素の使用例
|
|
|
|
この例では、<span>要素と<a>要素がテキストの流れの中に自然に配置されます。
インライン要素の注意点
インライン要素には、widthとheightを指定しても効果がありません。
|
|
また、垂直方向のmarginも他の要素のレイアウトに影響を与えません。
|
|
inline-blockの特性と活用場面
display: inline-blockは、インライン要素とブロック要素の両方の特性を併せ持つ表示型です。CSS Display Level 3の仕様では、inline-blockはinline flow-rootと等価であると定義されています。
inline-blockの特性
| 特性 | 説明 |
|---|---|
| 配置 | インライン要素のように横に並ぶ |
| サイズ指定 | ブロック要素のようにwidthとheightが有効 |
| 余白 | marginとpaddingが上下左右すべてで有効 |
| 改行 | 要素の前後で改行が発生しない |
flowchart LR
subgraph inline-block["inline-blockの特性"]
inline["インラインの特性<br>・横に並ぶ<br>・改行しない"]
block["ブロックの特性<br>・width/height有効<br>・垂直marginが有効"]
endinline-blockの使用例:ナビゲーションメニュー
inline-blockは、横並びのナビゲーションメニューを作成する際によく使用されます。
|
|
|
|
inline-blockの使用例:ボタングループ
|
|
|
|
inline-blockの注意点:ホワイトスペース問題
inline-block要素間には、HTMLのホワイトスペース(改行やスペース)に起因する隙間が発生します。
|
|
この問題を解決する方法はいくつかあります。
方法1: 親要素のfont-sizeを0にする
|
|
方法2: HTML要素を改行なしで記述する
|
|
方法3: Flexboxを使用する(推奨)
現代のWeb開発では、Flexboxを使用することでこの問題を回避できます。
|
|
block・inline・inline-blockの比較
3つの表示型の違いを比較表にまとめます。
| 特性 | block | inline | inline-block |
|---|---|---|---|
| 改行 | 前後で改行 | 改行なし | 改行なし |
| 横並び | 不可 | 可能 | 可能 |
| width/height | 有効 | 無効 | 有効 |
| 垂直margin | 有効 | 無効(レイアウトに影響しない) | 有効 |
| 垂直padding | 有効 | 視覚的には有効(レイアウトに影響しない) | 有効 |
視覚的な比較
|
|
|
|
その他のdisplay値の概要
displayプロパティには、block、inline、inline-block以外にも多くの値があります。ここでは、主要な値の概要を紹介します。
display: none
display: noneを指定した要素は、表示されなくなり、レイアウトにも影響を与えなくなります。
|
|
display: noneとvisibility: hiddenの違いは以下の通りです。
| プロパティ | 表示 | スペース確保 | アクセシビリティツリー |
|---|---|---|---|
display: none |
非表示 | なし | 削除される |
visibility: hidden |
非表示 | あり | 維持される |
display: flex
display: flexを指定した要素はフレックスコンテナとなり、子要素(フレックスアイテム)を柔軟に配置できます。
|
|
Flexboxの主な特徴は以下の通りです。
- 1次元レイアウト(行または列の方向)に特化
- 要素の配置と順序を柔軟に制御可能
- 要素間の余白を自動調整可能
display: grid
display: gridを指定した要素はグリッドコンテナとなり、子要素を2次元のグリッドに配置できます。
|
|
CSS Gridの主な特徴は以下の通りです。
- 2次元レイアウト(行と列の両方向)に対応
- 複雑なレイアウトを簡潔に記述可能
- 要素の配置を明示的に制御可能
display: inline-flex / inline-grid
inline-flexとinline-gridは、それぞれFlexboxとGridのインライン版です。要素自体はインライン要素のように振る舞い、内部の子要素はFlexbox/Gridでレイアウトされます。
|
|
display: contents
display: contentsを指定した要素は、ボックスを生成せず、その子要素が親要素の直接の子であるかのように振る舞います。
|
|
複数キーワード構文
CSS Display Level 3では、外側と内側の表示型を明示的に指定できる複数キーワード構文が導入されました。
|
|
主な対応関係は以下の通りです。
| 単一キーワード | 複数キーワード |
|---|---|
block |
block flow |
inline |
inline flow |
inline-block |
inline flow-root |
flex |
block flex |
inline-flex |
inline flex |
grid |
block grid |
inline-grid |
inline grid |
実務での使い分け
displayプロパティの値を適切に選択することで、効率的にレイアウトを構築できます。
使い分けの指針
flowchart TD
A["要素のレイアウト方法を選択"] --> B{"横並びが必要?"}
B -->|"いいえ"| C["display: block"]
B -->|"はい"| D{"子要素の柔軟な配置が必要?"}
D -->|"いいえ"| E["display: inline-block"]
D -->|"はい"| F{"2次元配置が必要?"}
F -->|"いいえ"| G["display: flex"]
F -->|"はい"| H["display: grid"]シナリオ別の推奨値
| シナリオ | 推奨値 | 理由 |
|---|---|---|
| セクション分割 | block |
垂直方向の区切りが明確になる |
| テキスト内の装飾 | inline |
文章の流れを崩さない |
| ナビゲーションメニュー | flex |
均等配置や中央揃えが容易 |
| カードレイアウト | grid |
2次元の整列が容易 |
| ボタングループ(シンプル) | inline-block |
基本的な横並びに対応 |
| 要素の非表示 | none |
レイアウトから完全に除外 |
ブラウザ対応状況
displayプロパティの各値は、モダンブラウザで広くサポートされています。
| 値 | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
block |
1以降 | 1以降 | 1以降 | 12以降 |
inline |
1以降 | 1以降 | 1以降 | 12以降 |
inline-block |
1以降 | 1以降 | 1以降 | 12以降 |
none |
1以降 | 1以降 | 1以降 | 12以降 |
flex |
29以降 | 20以降 | 9以降 | 12以降 |
grid |
57以降 | 52以降 | 10.1以降 | 16以降 |
contents |
65以降 | 37以降 | 11.1以降 | 79以降 |
flow-root |
58以降 | 53以降 | 13以降 | 79以降 |
| 複数キーワード構文 | 115以降 | 70以降 | 15以降 | 115以降 |
まとめ
本記事では、CSSのdisplayプロパティについて、基本的な値の違いから実務での使い分けまで解説しました。
重要ポイント
- block要素: 前後で改行が発生し、
width/heightの指定が可能 - inline要素: 横に並び、
width/heightの指定は無効 - inline-block: 横に並びつつ、
width/heightの指定が可能 - flex/grid: 現代のWebレイアウトの主流
displayプロパティを正しく理解し使い分けることで、意図したレイアウトを効率的に実現できます。特に、FlexboxやGridと組み合わせることで、レスポンシブで柔軟なレイアウトを構築できるようになります。
次のステップとして、Flexboxの詳細な使い方を学ぶことで、より実践的なレイアウト技術を身につけることができます。