CSSを触り始めて最初にぶつかる壁が、これです。同じように書いているのに、あるタグは横幅の指定が効いて、あるタグは効かない。原因はタグの性質の違いにあります。

2種類の性質がある

  • ブロック … 前後で改行される。横幅は親いっぱいに広がる。幅と高さを指定できる
  • インライン … 改行されない。横幅は中身のぶんだけ。幅と高さの指定が効かない

代表的なタグを挙げます。おおまかに「文章のかたまり=ブロック、文中の一部=インライン」と覚えておけば大きく外しません。

  • ブロック … div、p、h1〜h6、ul、li、section、header
  • インライン … span、a、strong、em、img(少し特殊)
CODE幅の指定が効くもの、効かないものコードを書き換えると、すぐ下で動きます

どちらにも width: 200px を指定していますが、span のほうは効きません。中身のぶんの幅しか持てないためです。

上のデモで、span が2つとも横に並んでいることにも注目してください。インラインは改行されないので、隣に続きます。div は改行されるので、必ず次の行に落ちます。

上下の余白も効かない

インライン要素は、上下の margin が効きません。padding は見た目には広がりますが、隣の行を押しのけないため、文字が重なることがあります。「余白を入れたのに動かない」の原因はたいていこれです。

解決するのが display

この性質は、CSSの display で変えられます。よく使うのは3つです。

  • display: block … インラインのものをブロックに変える。幅も余白も効くようになる
  • display: inline … ブロックをインラインに変える(使う機会は少ない)
  • display: inline-block … 横に並びつつ、幅と高さも指定できる。いいとこ取り
CODEinline-block にすると両方できるコードを書き換えると、すぐ下で動きます

display の行を消すと、幅の指定が効かなくなって横並びだけが残ります。付けたり消したりして違いを見てください。

いまはFlexboxがあるので、悩む場面は減った

横並びにしたいだけなら、親に display: flex を書くのが早いです。中の要素は自動的に幅と高さを持てるようになるので、ブロックかインラインかを気にする必要がなくなります。

とはいえ、この2つの性質を知らないと「なぜ効かないのか」が分かりません。原因が説明できるようになると、対処法も自分で選べるようになります。

まとめ

  • ブロック … 改行される・幅いっぱい・サイズ指定できる
  • インライン … 改行されない・中身ぶんの幅・サイズ指定できない
  • 幅が効かないときは display: inline-block か、親に display: flex