Menu

CSS display プロパティ: block、inline、inline-block、none、flex

display プロパティは、要素がレイアウトにどう参加するかを決めます。block、inline、inline-block の違いを並べたボックスで確かめ、display: none と visibility: hidden の違い、flex、grid、flow-root、contents の使いどころを解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

display の役割

すべての要素には、レイアウトのされ方を決める display の値があります。最初に出会うのは block、inline、inline-block の 3 つです。次の 3 つのボックスは width、height、padding、margin がすべて同じで、display だけが違います:

blockinlineinline-block
新しい行から始まるはいいいえいいえ
初期状態の幅コンテナいっぱい内容に合わせる内容に合わせる
width と height効く無視される効く
上下の margin効く無視される効く
上下の padding内容を押し広げる描かれるが、行の間隔は広がらない内容を押し広げる
代表的な要素div、p、h1、ul、sectionspan、a、strong、embutton、input、img (置換要素はこの動きをします)

プレビューでは、block のボックスは幅 120px で 1 行を占めます。inline のボックスは幅と高さを無視して単語だけを囲み、上下の padding と border は行の上下にはみ出しますが、行の高さは変わりません。inline-block のボックスは文章の行の中にとどまりつつ、指定したサイズを保ちます。

display: block

block の要素は使える幅をすべて使い、後に続くものを新しい行に押し出します。リンクを block にすると、行全体をクリックできるようになります:

.menu a {
  display: block;       /* the full row is the link */
  padding: 10px 16px;
}

block は幅を指定でき、幅があれば margin: 0 auto で中央に寄せられます。詳しくは div の中央寄せのページ を見てください。

display: inline-block

inline-block は中間の値です。単語のように行の中に流れますが、サイズを指定できます。文章の中のバッジ、ボタン、アイコンに便利です:

inline-block のボックスを横に並べると、HTML の空白のせいで間に小さなすき間ができます。ボックスを横に並べるなら、親に display: flex を使うほうが適しています。

display: none と visibility: hidden の違い

どちらも要素を見えなくします。違いは場所を残すかどうかです:

display: nonevisibility: hiddenopacity: 0
場所を取るいいえはいはい
クリックできるいいえいいえはい
スクリーンリーダーが読むいいえいいえはい
なめらかにアニメーションできるいいえいいえはい

HTML の hidden 属性は、ブラウザのスタイルシートを通じて display: none と同じ働きをします。そのため、要素に display を指定する CSS のルール (たとえば .card { display: flex; }) があるとそれが優先され、要素がまた表示されます。これで困ったら [hidden] { display: none !important; } を追加しましょう。

見た目だけ隠してスクリーンリーダーには残したいとき (アイコンボタンのラベルなど) は、display: none ではなく「visually hidden」のクラスを使います。

display: flex と display: grid

この 2 つは、要素を子要素のためのレイアウトコンテナにします:

  • display: flex は子要素を 1 行または 1 列に並べ、配置と間隔を調整できます。flexbox を参照してください。
  • display: grid は子要素を行と列に同時に配置します。

コンテナ自身は block のままです。inline-flex と inline-grid は子要素に対しては同じ働きをしますが、コンテナ自身を inline-block のように行の中に流します。

そのほかの値

値役割
flow-rootfloat を内側に収め、子要素の margin が外にはみ出さない block。現代の「clearfix」
contents要素自身のボックスが消え、子要素が親の子要素として振る舞う。ボタン、リスト、テーブルには使わないこと: 一部のブラウザでは、スクリーンリーダー向けの要素の意味が失われます
list-itemリストマーカー付きの block。li の初期値
table、table-row、table-cellテーブル以外の要素でテーブルのレイアウトを使う
inline-flex、inline-grid行の中に置かれる flex または grid のコンテナ

よくある間違い

  • span や a に width や height を指定する。 inline 要素では無視されます。inline-block か block にしましょう。
  • inline 要素に上下の margin を付ける。 これも無視されます。直し方は同じです。
  • スクリーンリーダー向けのテキストを display: none で隠す。 スクリーンリーダーからも隠れてしまいます。
  • display: none の親の中で子要素が表示されると思う。 隠れた親の中は何も描画されません。
  • display のルールが hidden 属性を上書きする。 CSS のルールが優先されます。
  • display をアニメーションさせようとする。 display: none にすると、フェードせずにすぐ消えます。opacity をアニメーションさせ、最後に display (または visibility) を切り替えましょう。

よくある質問

block、inline、inline-block の違いは何ですか?

block の要素は新しい行から始まり、使える幅いっぱいに広がります。inline の要素は文章の中に流し込まれ、width、height、上下の margin を無視します。inline-block は inline のように文章の中に流れますが、block のように幅、高さ、padding、margin が効きます。

display: none は何をしますか?

要素をページから完全に取り除きます。場所を取らず、描画されず、スクリーンリーダーからも隠れます。子要素も一緒に隠れ、子要素に display を指定しても表示できません。

display: none と visibility: hidden の違いは何ですか?

display: none は要素とその場所を取り除きます。visibility: hidden は要素を見えなくしますが、レイアウト上の場所は残るので、ほかの要素は動きません。

div は初期状態で block ですか、inline ですか?

block です。div、p、見出し、ul、section、form は初期状態で block です。span、a、strong、em、img、input、button は inline か inline-block です。

inline-block の要素の間にすき間ができるのはなぜですか?

HTML のタグとタグの間の空白が、単語の間と同じように 1 つのスペースとして表示されるからです。代わりに親に display: flex と gap を使うか、空白を取り除きます。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める