HTML/CSS / LESSON 12 / HT12

HTML/CSS:表示形式(display)

1学習の目的

2基礎解説

HT05で「div は縦に積まれ、span は横に流れる」と触れました。この違いを決めているのが display です。すべての要素は、既定の display を持っています。

並び方幅・高さ
block縦に積まれる指定できる
inline横に流れる指定できない
inline-block横に流れる指定できる
none消える場所も取らない
✅ 覚えるべき重要ポイント
  1. block は横幅いっぱいに広がり、縦に積まれる。div・p・h1・section などが該当する。幅・高さ・上下の余白をすべて指定できる。
  2. ⚠ inline は width と height が効かない。span・a・strong などが該当し、中身の文字の分だけの大きさになる。「幅を指定したのに変わらない」原因の多くはこれ。
  3. inline にも上下の margin は効かない(左右は効く)。上下に余白を付けたいなら、inline-blockblock に変える必要がある。
  4. inline-block は両方の性質を持つ。横に並びつつ、幅と高さを指定できる。リンクをボタンのように見せたいときによく使う。
  5. 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問)

HT12-D01 span を block に変え、幅 200px・高さ 50px・背景 #ddd を指定するHTMLを書け。 コーディング★☆☆無料
期待される結果

実際の幅が200px、高さが50px

ヒント

display: block; を指定しないと width と height が効かない。

模範解答
<style>
  span {
    display: block;
    width: 200px;
    height: 50px;
    background-color: #ddd;
  }
</style>

<span>ブロック化した span</span>
解説

display を変えるだけで幅と高さが効くようになる。span そのものの性質を変えている。

HT12-D02 spanwidth: 200px を指定するとどうなるか(display 未変更)。
A. 200pxになる B. 無視される C. エラーになる D. 半分になる
選択★☆☆無料
期待される結果

解答 == B

ヒント

inline 要素は幅を指定できるか。

模範解答
B
解説

inline 要素には width が効かない。中身の文字の分だけの幅になる——「指定したのに変わらない」原因の代表例。

HT12-D03 リンクを inline-block にし、幅 150px・padding 12px・背景 #0066cc・文字色白・中央揃えのボタン風にせよ。 コーディング★☆☆無料
期待される結果

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 にする必要がある。

HT12-D04 要素を完全に非表示にするコードを完成させよ。 穴埋め★☆☆無料
コード
<style>
  .hidden {
    display: ____;
  }
</style>

<div class="hidden">隠れる</div>
<div>見える</div>
期待される結果

要素の高さが0

ヒント

「何もない」を意味する4文字の値。

模範解答
none
解説

display: none は場所も取らずに消える。周りの要素が詰めて表示されるので、レイアウトが変わる点に注意。

HT12-D05 display: nonevisibility: hidden の違いはどれか。
A. 同じ B. none は場所も消える、hidden は場所が残る C. none のほうが速い D. hidden は完全に消える
選択★☆☆無料
期待される結果

解答 == B

ヒント

レイアウトへの影響が違う。

模範解答
B
解説

none は詰めて表示され、hidden は空白として残る。「一時的に見せたくないが位置は保ちたい」なら hidden を使う。

HT12-D06 リストの項目を inline-block にして横並びにせよ(li は3つ、右に 20px の余白)。 コーディング★★☆広告解放
期待される結果

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)を使うことが多いが、仕組みを知っておく価値はある。

HT12-D07 横に並びつつ幅を指定できる値を補ってコードを完成させよ。 穴埋め★★☆広告解放
コード
<style>
  .btn {
    display: ____;
    width: 120px;
  }
</style>

<a href="#" class="btn">ボタン</a>
期待される結果

実際の幅が120px

ヒント

inline と block の両方の性質を持つ値(ハイフン含む12文字)。

模範解答
inline-block
解説

inline-block は「横に並ぶブロック」。ボタンやカードを横に並べるときの基本になる。

HT12-D08 spanmargin-top: 20px を指定するとどうなるか。
A. 上に20px空く B. 効かない C. 下に空く D. エラーになる
選択★★☆広告解放
期待される結果

解答 == B

ヒント

inline 要素には上下のマージンが効かない。

模範解答
B
解説

inline は左右の margin しか効かない。上下に余白が欲しいなら inline-block か block に変える必要がある。

HT12-D09 visibility: hidden を使い、1つ目の div を「見えないが場所は残る」状態にせよ(div は2つ、高さ 50px)。 コーディング★★☆広告解放
期待される結果

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 なら詰めて上に来る。

HT12-D10 3つの div を inline-block にして横に並べよ(幅 100px、高さ 80px、背景 #0066cc)。 コーディング★★☆広告解放
期待される結果

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問)

HT12-S01 【ナビゲーションの横並び】nav の中の li を横並びにし、リンクを inline-block で padding 12px 20px・下線なしにせよ(3項目)。 コーディング★★☆広告解放
期待される結果

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 が上下にも効き、クリックできる範囲が広がって押しやすくなる。

HT12-S02 【block と inline の比較】同じ内容の span を2つ作り、片方だけ display: block にして、幅 200px が効くかどうかを比較せよ。 コーディング★★☆広告解放
期待される結果

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 のほうは中身の文字の幅のままで、指定が完全に無視されている。

HT12-S03 【カードの横並び】3つの .card を inline-block で横に並べよ(幅 180px、padding 16px、枠線 1px solid #ddd、box-sizing 指定、上端揃え)。 コーディング★★☆広告解放
期待される結果

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 は既定でベースライン揃えになるため、高さが違うと下がずれて見える。

HT12-S04 【非表示の使い分け】3つの div を作り、2つ目を display: none、3つ目を visibility: hidden にして、レイアウトへの影響の違いを確認せよ(各高さ 40px)。 コーディング★★★広告解放
期待される結果

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——用途で選ぶ。

HT12-S05 【タグ風のラベル】span を inline-block にし、padding 4px 12px・背景 #0066cc・文字色白・角丸 12px のラベルを3つ横に並べよ。 コーディング★★★広告解放
期待される結果

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仕上げ課題

HT12-FINAL 【ヘッダー付きページ】display を使い分けて、ナビゲーションとカードを持つページを作れ。

CSSの指定
*box-sizing: border-box
nav ullist-style: none、padding 0、margin 0
nav lidisplay: inline-block
nav adisplay: inline-block、padding 12px 20px、下線なし、文字色 #0066cc
.carddisplay: inline-block、幅 200px、padding 16px、枠線 1px solid #dddvertical-align: top
.tagdisplay: inline-block、padding 4px 10px、背景 #0066cc、文字色白、角丸 10px
.sp-onlydisplay: 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 は、これらをすべて解決する。