「widthを指定したのに、なぜか効かない部品がある」。CSSを触っていると、そんな不思議に出会います。じつはHTMLの部品には2つの性格があり、それによってふるまいが変わるのです。その性格をあらわすのがdisplayです。
ブロック:縦に積み重なる
<div> <p> <h1>などはブロックという性格。横幅いっぱいに広がり、上から下へ縦に積まれます。widthやheightも、素直に効きます。段落が1つずつ改行されて並ぶのは、この性格のおかげです。
インライン:文中に流れる
いっぽう<a> <span> <strong>などはインライン。文章の中を左から右へ流れ、横に並びます。文の途中でリンクだけ色が変わっても改行されないのは、この性格だからです。ただしインラインには、widthやheightが効きません。
なぜ効かないのでしょう?インラインは文字と同じ仲間として扱われるからです。「あ」という1文字の幅を300pxに広げられないのと同じで、インラインの大きさは中身が決めます。
どっちの性格か見分けるコツ
タグの役割を思い出すと、だいたい見分けられます。「箱」を作るタグはブロック、「文の一部を飾る」タグはインラインです。
| 性格 | 代表的なタグ | イメージ |
|---|---|---|
| ブロック | <div> <p> <h1> <ul> <li> <section> | ページを区切る「箱」 |
| インライン | <a> <span> <strong> <em> | 文の途中に置ける「飾り」 |
新しいタグに出会って迷ったら、「これは箱?それとも文の飾り?」と考えてみましょう。
displayで性格を変える
この性格はdisplayで切り替えられます。
span {
display: block;
}インラインの<span>をブロックに変えると、縦に積まれ、widthも効くようになります。逆にdisplay: none;にすると、その部品はまるごと消えて見えなくなります(あとでJavaScriptで出したり消したりするときに活躍します)。
3つの性格の違いは、同じwidth: 200px;を指定してみると一目でわかります。
width: 200pxと書いてあるのに、効くのはblockとinline-blockだけ。inlineは文字と同じ仲間なので、幅の指定はまるごと無視され、中身の大きさのまま文中を流れます。displayには、flexにも「インラインでもある版」のinline-flexがあります。ふつうのflexはブロックとして縦に積まれますが、inline-flexは文中に並びながら、中身は横一列に並べられるので、アイコンと文字をセットにしたリンク部品などで重宝します。
「消す」にも2種類ある
display: none;と似た道具にvisibility: hidden;があります。ちがいは場所が残るかどうか。
.a { display: none; } /* 場所ごと消える */
.b { visibility: hidden; } /* 見えなくなるが、場所は残る */display: none;は、その部品が最初から無かったかのようにあとの部品が詰めて並びます。visibility: hidden;は姿だけ消えて、そこにぽっかり空白が残ります。「消してもまわりのレイアウトを崩したくない」ならhidden、「完全にしまいたい」ならnone、と使い分けます。
このレッスンのまとめ
- 部品にはブロック(縦に積む)とインライン(文中に流れる)の性格がある
- インラインには
width/heightが効かない displayで性格を変えられる(block/inline-block/none)inline-flexは「文中に並びつつ、中は横一列」といういいとこ取り
