HTML/CSS:表示形式(display)
1学習の目的
- block と inline の違いを理解する。「width を指定したのに効かない」という混乱の原因がここにあり、仕組みを知れば解決できるようになる。
- display を切り替えて、要素の並び方を自由に制御できるようになる。次章のFlexboxを学ぶための土台になる。
2基礎解説
HT05で「div は縦に積まれ、span は横に流れる」と触れました。この違いを決めているのが display です。すべての要素は、既定の display を持っています。
| 値 | 並び方 | 幅・高さ |
|---|---|---|
| block | 縦に積まれる | 指定できる |
| inline | 横に流れる | 指定できない |
| inline-block | 横に流れる | 指定できる |
| none | 消える | 場所も取らない |
- block は横幅いっぱいに広がり、縦に積まれる。div・p・h1・section などが該当する。幅・高さ・上下の余白をすべて指定できる。
- ⚠ inline は width と height が効かない。span・a・strong などが該当し、中身の文字の分だけの大きさになる。「幅を指定したのに変わらない」原因の多くはこれ。
- inline にも上下の margin は効かない(左右は効く)。上下に余白を付けたいなら、inline-block か block に変える必要がある。
- inline-block は両方の性質を持つ。横に並びつつ、幅と高さを指定できる。リンクをボタンのように見せたいときによく使う。
- display: none は完全に消える(場所も取らない)。一方 visibility: hidden は見えないが場所は残る——用途が違うので使い分ける。
現場使用例:リンクをボタン化、メニューの横並び、スマホで一部を非表示、アイコンと文字の並び。
/* 既定の display */
div, p, h1, section { display: block; } /* 縦に積まれる */
span, a, strong { display: inline; } /* 横に流れる */
/* ⚠ inline には幅が効かない */
span {
width: 200px; /* 無視される */
height: 50px; /* 無視される */
}
/* block にすれば効く */
span {
display: block;
width: 200px; /* 効く */
height: 50px; /* 効く */
}
/* inline-block:横に並びつつ幅も指定できる */
.btn {
display: inline-block;
width: 150px;
padding: 12px 24px;
text-align: center;
}
/* 非表示の2種類 */
.hidden-a { display: none; } /* 消える・場所も取らない */
.hidden-b { visibility: hidden; } /* 見えない・場所は残る */
/* リストを横並びにする(メニューの定番) */
nav li {
display: inline-block;
margin-right: 20px;
}
3基本ドリル(10問)
実際の幅が200px、高さが50px
display: block; を指定しないと width と height が効かない。
<style>
span {
display: block;
width: 200px;
height: 50px;
background-color: #ddd;
}
</style>
<span>ブロック化した span</span>display を変えるだけで幅と高さが効くようになる。span そのものの性質を変えている。
A. 200pxになる B. 無視される C. エラーになる D. 半分になる 選択★☆☆無料
解答 == B
inline 要素は幅を指定できるか。
B
inline 要素には width が効かない。中身の文字の分だけの幅になる——「指定したのに変わらない」原因の代表例。
display が inline-block、幅が150px
box-sizing も指定すると幅の計算が楽になる。
<style>
.btn {
display: inline-block;
box-sizing: border-box;
width: 150px;
padding: 12px;
background-color: #0066cc;
color: #ffffff;
text-align: center;
text-decoration: none;
}
</style>
<a href="#" class="btn">送信する</a>リンクをボタンに見せる定番の手法。inline のままでは幅も上下の padding も効かないので、inline-block にする必要がある。
<style>
.hidden {
display: ____;
}
</style>
<div class="hidden">隠れる</div>
<div>見える</div>要素の高さが0
「何もない」を意味する4文字の値。
none
display: none は場所も取らずに消える。周りの要素が詰めて表示されるので、レイアウトが変わる点に注意。
A. 同じ B. none は場所も消える、hidden は場所が残る C. none のほうが速い D. hidden は完全に消える 選択★☆☆無料
解答 == B
レイアウトへの影響が違う。
B
none は詰めて表示され、hidden は空白として残る。「一時的に見せたくないが位置は保ちたい」なら hidden を使う。
li が inline-block、3個
li { display: inline-block; margin-right: 20px; } と書く。
<style>
li {
display: inline-block;
margin-right: 20px;
}
</style>
<ul>
<li>ホーム</li>
<li>サービス</li>
<li>お問い合わせ</li>
</ul>これがナビゲーションメニューの古典的な作り方。現在はFlexbox(HT13)を使うことが多いが、仕組みを知っておく価値はある。
<style>
.btn {
display: ____;
width: 120px;
}
</style>
<a href="#" class="btn">ボタン</a>実際の幅が120px
inline と block の両方の性質を持つ値(ハイフン含む12文字)。
inline-block
inline-block は「横に並ぶブロック」。ボタンやカードを横に並べるときの基本になる。
A. 上に20px空く B. 効かない C. 下に空く D. エラーになる 選択★★☆広告解放
解答 == B
inline 要素には上下のマージンが効かない。
B
inline は左右の margin しか効かない。上下に余白が欲しいなら inline-block か block に変える必要がある。
visibilityがhidden、高さは残る
display: none との違いを確認する。
<style>
div {
height: 50px;
background-color: #ddd;
}
.invisible {
visibility: hidden;
}
</style>
<div class="invisible">見えない</div>
<div>見える</div>場所が残るので、下の div は最初から50px下に表示される。display: none なら詰めて上に来る。
3つのdivが横並び、幅100px
div は既定で block なので、inline-block に変える。
<style>
.box {
display: inline-block;
width: 100px;
height: 80px;
background-color: #0066cc;
}
</style>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>block を inline-block に変えると横に並ぶ。ただし要素間にわずかな隙間ができる(HTMLの改行が空白として扱われるため)。
4実践シナリオ(5問)
liが横並び、aがinline-block
li と a の両方に display を指定する。
<style>
nav ul {
list-style: none;
padding: 0;
}
nav li {
display: inline-block;
}
nav a {
display: inline-block;
padding: 12px 20px;
text-decoration: none;
color: #0066cc;
}
</style>
<nav>
<ul>
<li><a href="#">ホーム</a></li>
<li><a href="#">サービス</a></li>
<li><a href="#">お問い合わせ</a></li>
</ul>
</nav>a にも inline-block を指定するのが要点。これで padding が上下にも効き、クリックできる範囲が広がって押しやすくなる。
blockのみ200px、inlineは文字幅
2つの span に別々のクラスを付ける。
<style>
span {
width: 200px;
background-color: #ddd;
}
.block {
display: block;
}
</style>
<span class="block">block(200px)</span>
<span>inline(文字の幅)</span>同じ width を指定しても結果が違う。inline のほうは中身の文字の幅のままで、指定が完全に無視されている。
3つのカードが幅180pxで横並び
box-sizing: border-box を忘れると幅が広がる。vertical-align: top で上端を揃える。
<style>
.card {
display: inline-block;
box-sizing: border-box;
width: 180px;
padding: 16px;
border: 1px solid #ddd;
vertical-align: top;
}
</style>
<div class="card">カード1</div>
<div class="card">カード2</div>
<div class="card">カード3</div>vertical-align: top を付けると上端が揃う。inline-block は既定でベースライン揃えになるため、高さが違うと下がずれて見える。
noneは高さ0、hiddenは40px
高さを測ると、場所を取っているかどうかが分かる。
<style>
div {
height: 40px;
background-color: #ddd;
margin-bottom: 8px;
}
.none {
display: none;
}
.hidden {
visibility: hidden;
}
</style>
<div>1つ目(見える)</div>
<div class="none">2つ目(消える)</div>
<div class="hidden">3つ目(場所は残る)</div>none は高さ0、hidden は40pxのまま。スマホでメニューを隠すときは none、一時的に内容を伏せるだけなら hidden——用途で選ぶ。
3つのspanがinline-block
span を inline-block にすれば上下の padding も効く。
<style>
.tag {
display: inline-block;
padding: 4px 12px;
background-color: #0066cc;
color: #ffffff;
border-radius: 12px;
margin-right: 8px;
font-size: 0.875rem;
}
</style>
<span class="tag">HTML</span>
<span class="tag">CSS</span>
<span class="tag">JavaScript</span>inline のままだと上下の padding が背景に反映されず、他の行と重なる。inline-block にすることで、きれいなラベルになる。
5仕上げ課題
CSSの指定
① *:box-sizing: border-box
② nav ul:list-style: none、padding 0、margin 0
③ nav li:display: inline-block
④ nav a:display: inline-block、padding 12px 20px、下線なし、文字色 #0066cc
⑤ .card:display: inline-block、幅 200px、padding 16px、枠線 1px solid #ddd、vertical-align: top
⑥ .tag:display: inline-block、padding 4px 10px、背景 #0066cc、文字色白、角丸 10px
⑦ .sp-only:display: none(PCでは非表示の想定)
HTML の内容
・nav(ul の中に li × 3、各 li に a)
・div.card を2つ(各カードに h3 と span.tag)
・p.sp-only「スマホ専用の案内」
確認したいこと
・カードの実際の幅が200px(border-box が効く)
・.sp-only の高さが0(完全に消えている) 総合★★★広告解放
すべてのdisplayと寸法が正しい
li と a の両方に inline-block を指定する。card には vertical-align: top を付けて上端を揃える。sp-only は display: none なので高さが0になる。
<style>
* {
box-sizing: border-box;
}
nav ul {
list-style: none;
padding: 0;
margin: 0;
}
nav li {
display: inline-block;
}
nav a {
display: inline-block;
padding: 12px 20px;
text-decoration: none;
color: #0066cc;
}
.card {
display: inline-block;
width: 200px;
padding: 16px;
border: 1px solid #ddd;
vertical-align: top;
}
.tag {
display: inline-block;
padding: 4px 10px;
background-color: #0066cc;
color: #ffffff;
border-radius: 10px;
}
.sp-only {
display: none;
}
</style>
<nav>
<ul>
<li><a href="#">ホーム</a></li>
<li><a href="#">サービス</a></li>
<li><a href="#">お問い合わせ</a></li>
</ul>
</nav>
<div class="card">
<h3>ノートPC</h3>
<span class="tag">人気</span>
</div>
<div class="card">
<h3>マウス</h3>
<span class="tag">新着</span>
</div>
<p class="sp-only">スマホ専用の案内</p>このページには inline-block が5箇所も登場する。メニューの li、リンクの a、カード、タグ——「横に並べたい、でも幅や余白も指定したい」という要求はそれだけ多いということだ。
とくに nav a に inline-block を指定した点が実務的に重要になる。a は既定で inline なので、そのままでは上下の padding が効かない。指定しなければクリックできる範囲が文字の高さだけになり、スマホで押しづらいメニューになってしまう。
vertical-align: top も見逃せない。inline-block は既定で文字のベースラインで揃うため、カードの中身の量が違うと下端がガタつく。top を指定すれば上端で揃い、見た目が安定する。
.sp-only { display: none; } は、HT15のレスポンシブ対応への布石だ。画面幅に応じて none と block を切り替えれば、PCとスマホで表示内容を出し分けられる。
ただし、inline-block での横並びには弱点もある。要素間に謎の隙間ができる、縦方向の中央揃えが難しい、等間隔に配置しにくい——次章の Flexbox は、これらをすべて解決する。