「ブロック要素」と「インライン要素」— 幅と改行の正体
「なぜか横に並ばない」「幅を指定しても効かない」。この2大つまずきの答えが、この言葉の違いです。図でも説明でもなく、実際に動かして体で覚えます。
CSSを触り始めて最初にぶつかる壁が、これです。同じように書いているのに、あるタグは横幅の指定が効いて、あるタグは効かない。原因はタグの性質の違いにあります。
2種類の性質がある
- ブロック … 前後で改行される。横幅は親いっぱいに広がる。幅と高さを指定できる
- インライン … 改行されない。横幅は中身のぶんだけ。幅と高さの指定が効かない
代表的なタグを挙げます。おおまかに「文章のかたまり=ブロック、文中の一部=インライン」と覚えておけば大きく外しません。
- ブロック … div、p、h1〜h6、ul、li、section、header
- インライン … span、a、strong、em、img(少し特殊)
どちらにも width: 200px を指定していますが、span のほうは効きません。中身のぶんの幅しか持てないためです。
上のデモで、span が2つとも横に並んでいることにも注目してください。インラインは改行されないので、隣に続きます。div は改行されるので、必ず次の行に落ちます。
上下の余白も効かない
インライン要素は、上下の margin が効きません。padding は見た目には広がりますが、隣の行を押しのけないため、文字が重なることがあります。「余白を入れたのに動かない」の原因はたいていこれです。
解決するのが display
この性質は、CSSの display で変えられます。よく使うのは3つです。
- display: block … インラインのものをブロックに変える。幅も余白も効くようになる
- display: inline … ブロックをインラインに変える(使う機会は少ない)
- display: inline-block … 横に並びつつ、幅と高さも指定できる。いいとこ取り
display の行を消すと、幅の指定が効かなくなって横並びだけが残ります。付けたり消したりして違いを見てください。
いまはFlexboxがあるので、悩む場面は減った
横並びにしたいだけなら、親に display: flex を書くのが早いです。中の要素は自動的に幅と高さを持てるようになるので、ブロックかインラインかを気にする必要がなくなります。
とはいえ、この2つの性質を知らないと「なぜ効かないのか」が分かりません。原因が説明できるようになると、対処法も自分で選べるようになります。
まとめ
- ブロック … 改行される・幅いっぱい・サイズ指定できる
- インライン … 改行されない・中身ぶんの幅・サイズ指定できない
- 幅が効かないときは display: inline-block か、親に display: flex