HTML/CSS / LESSON 08 / HT08

HTML/CSS:セレクタの使い分け

1学習の目的

2基礎解説

セレクタ書き方強さ
要素p { }弱い(1)
クラス.box { }中(10)
ID#main { }強い(100)
インラインstyle="…"最強(1000)
✅ 覚えるべき重要ポイント
  1. クラスは .、IDは # で指定する。HTML側では class="box"、CSS側では .box と書く——記号の有無に注意。
  2. クラスは何度でも使えるが、IDはページに1つだけ。同じ見た目を複数箇所に使うならクラス、その要素だけを特定したいならID。実務ではクラスが中心になる。
  3. 強いセレクタが勝つ。同じ要素に複数の指定が当たったとき、ID(100)> クラス(10)> 要素(1)の順で優先される。後勝ちより詳細度が優先される。
  4. スペースは「子孫」、> は「直下の子」div p は div の中のすべての p、div > p は div の直接の子である p だけ。
  5. :hover などの擬似クラスで、マウスを乗せたときなどの状態を指定できる。:first-child なら最初の要素だけを狙える。

現場使用例:ボタンの色分け(クラス)、特定セクションの装飾(ID)、リンクのホバー効果、リストの最初だけ強調。実務のCSSはクラスセレクタが8割を占める

<!-- HTML側 -->
<p class="note">クラスを付ける</p>
<div id="main">IDを付ける</div>
<p class="note important">クラスは複数付けられる</p>

/* CSS側 */
.note   { color: gray; }      /* クラスは . */
#main   { color: navy; }      /* IDは # */
p       { color: black; }     /* 要素名 */

/* 強さ:#main(100) > .note(10) > p(1) */

/* 両方のクラスを持つ要素だけ(スペースを空けない) */
.note.important { color: red; }

/* カンマ区切り=どちらにも適用 */
h1, h2 { color: navy; }

/* 子孫セレクタ(div の中のすべての p) */
div p { background: yellow; }

/* 子セレクタ(div の直下の p だけ) */
div > p { background: yellow; }

/* 擬似クラス */
a:hover        { color: red; }         /* マウスを乗せたとき */
li:first-child { font-weight: bold; }  /* 最初の子だけ */
li:nth-child(2){ color: blue; }        /* 2番目だけ */

3基本ドリル(10問)

HT08-D01 クラス note を持つ段落だけ文字色を red にするHTMLを書け(クラス付きと無しの段落を1つずつ配置)。 コーディング★☆☆無料
期待される結果

クラス付きが赤、無しは黒

ヒント

CSSでは .note と書き、HTMLでは class="note" と書く。

模範解答
<style>
  .note {
    color: red;
  }
</style>

<p class="note">クラス付き</p>
<p>クラス無し</p>
解説

CSSの . は「クラス」を意味する記号。HTML側には書かないので、混同しないよう注意する。

HT08-D02 CSSでIDを指定する記号はどれか。
A. .(ドット) B. #(シャープ) C. @(アット) D. $(ドル)
選択★☆☆無料
期待される結果

解答 == B

ヒント

クラスはドット、IDは別の記号。

模範解答
B
解説

ID は #、クラスは .。ページ内リンク(HT03)でも # を使ったのと同じ記号。

HT08-D03 ID main を持つ div の文字色を navy にするHTMLを書け。 コーディング★☆☆無料
期待される結果

#main が navy

ヒント

CSSでは #main、HTMLでは id="main" と書く。

模範解答
<style>
  #main {
    color: navy;
  }
</style>

<div id="main">メイン領域</div>
解説

IDはページに1つだけ。同じIDを複数の要素に付けるのは誤りで、その場合はクラスを使う。

HT08-D04 クラスセレクタの記号を補ってコードを完成させよ。 穴埋め★☆☆無料
コード
<style>
  ____box {
    color: red;
  }
</style>

<p class="box">テキスト</p>
期待される結果

クラス付きの要素が赤

ヒント

クラスを表す記号1文字。

模範解答
.
解説

ドットを忘れると要素名として扱われるbox という名前のタグを探しに行くので、当然何も適用されない。

HT08-D05 同じ要素に p{color:green}.note{color:red} の両方が当たったら、何色になるか。
A. 緑 B. 赤 C. 混ざる D. 黒
選択★☆☆無料
期待される結果

解答 == B

ヒント

クラスと要素名では、どちらが強いか。

模範解答
B
解説

クラス(10)> 要素(1)なので赤が勝つ。後に書いたかどうかではなく、強さで決まる——これが詳細度の考え方。

HT08-D06 詳細度を確かめる:p を green.cred#iblue と指定し、3つすべてが当たる段落を1つ作れ。何色になるか確認すること。 コーディング★★☆広告解放
期待される結果

p の色が青(IDが最強)

ヒント

class と id の両方を持つ p を作る。

模範解答
<style>
  p  { color: green; }
  .c { color: red; }
  #i { color: blue; }
</style>

<p class="c" id="i">何色になるか</p>
解説

IDが勝って青になる。CSSの記述順に関係なく、詳細度が高いものが優先される。

HT08-D07 マウスを乗せたときのスタイルを指定するコードを完成させよ。 穴埋め★★☆広告解放
コード
<style>
  a____hover {
    color: red;
  }
</style>

<a href="#">リンク</a>
期待される結果

a:hover のルールが存在する

ヒント

擬似クラスを表す記号1文字。

模範解答
:
解説

コロンで擬似クラスを指定する:hover のほか :first-child:focus などがある。

HT08-D08 div p(スペース区切り)はどの要素を指すか。
A. div の直下の p だけ B. div の中のすべての p(孫も含む) C. div と p の両方 D. div の隣の p
選択★★☆広告解放
期待される結果

解答 == B

ヒント

スペースは「子孫」を意味する。

模範解答
B
解説

スペースは階層を問わずすべての子孫。直下だけに限定したいなら > を使う。

HT08-D09 子孫セレクタを使い、div の中の段落だけ背景を yellow にするHTMLを書け(div 内と div 外に段落を1つずつ配置)。 コーディング★★☆広告解放
期待される結果

div内のpだけ背景が黄色

ヒント

div p { … } と書く(スペースで区切る)。

模範解答
<style>
  div p {
    background-color: yellow;
  }
</style>

<div>
  <p>div の中</p>
</div>

<p>div の外</p>
解説

div の外の段落は変わらない。範囲を限定できるので、ページの一部だけに適用したいときに使う。

HT08-D10 :first-child を使い、リストの最初の項目だけ文字色を red にするHTMLを書け(li は3つ)。 コーディング★★☆広告解放
期待される結果

1番目のliだけ赤

ヒント

li:first-child { … } と書く。

模範解答
<style>
  li:first-child {
    color: red;
  }
</style>

<ul>
  <li>1番目</li>
  <li>2番目</li>
  <li>3番目</li>
</ul>
解説

擬似クラスで「何番目か」を狙える。HTMLにクラスを追加しなくても、位置だけで指定できる。

4実践シナリオ(5問)

HT08-S01 【ボタンの色分け】クラス btn に共通の文字色 white を、primary に背景 navydanger に背景 red を指定し、2つのボタンを作れ(それぞれ2つのクラスを持つこと)。 コーディング★★☆広告解放
期待される結果

2つのボタンの色が正しい

ヒント

class="btn primary" のように、クラスは複数付けられる(スペース区切り)。

模範解答
<style>
  .btn {
    color: white;
  }

  .primary {
    background-color: navy;
  }

  .danger {
    background-color: red;
  }
</style>

<button class="btn primary">保存する</button>
<button class="btn danger">削除する</button>
解説

共通部分と個別部分をクラスで分けるのが実務の定石。btn に共通スタイル、primary や danger で色だけ変える——新しい色を足すのも簡単になる。

HT08-S02 【子孫と子の違い】div > p(子セレクタ)で背景を yellow にし、div の直下の p と、section を挟んだ p の両方を配置して違いを確認せよ。 コーディング★★☆広告解放
期待される結果

直下のpだけ黄色、孫は透明

ヒント

div > p は直下だけ。section の中の p には適用されない。

模範解答
<style>
  div > p {
    background-color: yellow;
  }
</style>

<div>
  <p>直下の段落</p>

  <section>
    <p>孫の段落</p>
  </section>
</div>
解説

孫の段落には背景が付かない> は「直接の子」だけを狙う。スペースなら孫にも適用される。

HT08-S03 【ナビゲーションの装飾】nav の中のリンクだけ文字色を navy にし、それ以外のリンクには適用しないHTMLを書け(nav 内に2つ、外に1つのリンクを配置)。 コーディング★★☆広告解放
期待される結果

nav内のaがnavy、外は既定色

ヒント

nav a { … } と子孫セレクタで書く。

模範解答
<style>
  nav a {
    color: navy;
  }
</style>

<nav>
  <a href="#">ホーム</a>
  <a href="#">会社概要</a>
</nav>

<p><a href="#">本文中のリンク</a></p>
解説

場所によってスタイルを変えられる。メニューのリンクと本文中のリンクは役割が違うので、見た目も分けるのが自然。

HT08-S04 【複数クラスの組み合わせ】.tag に文字色 gray.tag.new(両方持つ場合のみ)に文字色 red を指定し、tag だけの要素と両方持つ要素を作れ。 コーディング★★★広告解放
期待される結果

tagのみがgray、両方持つのがred

ヒント

.tag.new はスペースを空けずに続けて書く(両方のクラスを持つ要素)。

模範解答
<style>
  .tag {
    color: gray;
  }

  .tag.new {
    color: red;
  }
</style>

<span class="tag new">新着</span>
<span class="tag">通常</span>
解説

スペースを空けると「子孫」の意味になる.tag .new(スペースあり)と .tag.new(スペースなし)はまったく違う指定になるので注意。

HT08-S05 【縞模様】:nth-child(2) を使い、リストの2番目だけ背景を #eeeeee にするHTMLを書け(li は3つ)。 コーディング★★★広告解放
期待される結果

2番目のliだけ背景が灰色

ヒント

li:nth-child(2) { … } と書く。

模範解答
<style>
  li:nth-child(2) {
    background-color: #eeeeee;
  }
</style>

<ul>
  <li>1番目</li>
  <li>2番目</li>
  <li>3番目</li>
</ul>
解説

nth-child は「何番目か」を数値で指定できるnth-child(even) と書けば偶数行すべてになり、表の縞模様が作れる。

5仕上げ課題

HT08-FINAL 【商品カード一覧】セレクタを使い分けて、商品カードのスタイルを作れ。

HTML構造
div#products の中に div.card を3つ
・各カードの中に h3(商品名)と p.price(価格)
・3つ目のカードは class="card sale" とする
・商品は「ノートPC / 128,000円」「マウス / 3,200円」「キーボード / 8,500円」

CSSの指定
#products:背景 #f5f5f5
.card:背景 white
.card h3(子孫セレクタ):文字色 navy
.price:文字色 #333333
.card.sale(両方のクラス):背景 #fff5f5
.card:first-child h3:文字色 red

確認したいこと
・1枚目の h3 は(first-child が勝つ)
・2枚目の h3 はnavy
・3枚目のカードは背景が薄い赤(.card.sale が .card より強い)
総合★★★広告解放
期待される結果

すべてのセレクタが正しく適用される

ヒント

.card.sale はスペースを空けずに書く。.card:first-child h3 は「最初のカードの中の h3」という意味。詳細度は .card.sale(20)が .card(10)より強い。

模範解答
<style>
  #products {
    background-color: #f5f5f5;
  }

  .card {
    background-color: white;
  }

  .card h3 {
    color: navy;
  }

  .price {
    color: #333333;
  }

  .card.sale {
    background-color: #fff5f5;
  }

  .card:first-child h3 {
    color: red;
  }
</style>

<div id="products">
  <div class="card">
    <h3>ノートPC</h3>
    <p class="price">128,000円</p>
  </div>

  <div class="card">
    <h3>マウス</h3>
    <p class="price">3,200円</p>
  </div>

  <div class="card sale">
    <h3>キーボード</h3>
    <p class="price">8,500円</p>
  </div>
</div>
解説

3枚目のカードが薄い赤になるのは、詳細度の勝負に勝ったからだ。.card はクラス1つで10点、.card.sale はクラス2つで20点——後に書いたから勝ったのではなく、強いから勝った。CSSの順序を入れ替えても結果は同じになる。

.card:first-child h3 も同様だ。.card h3(クラス1+要素1=11点)に対し、こちらは擬似クラスが加わって21点。だから1枚目だけ赤が勝つ。「なぜかCSSが効かない」という悩みの大半は、この詳細度の計算で説明がつく。

実務ではIDセレクタを多用しないのが定石になっている。ID は100点と強すぎるため、後から上書きしようとしてもクラスでは勝てず、!important に頼るしかなくなるからだ。基本はクラス、レイアウトの大枠だけID——このくらいの使い分けが扱いやすい。

次章では文字とフォントを扱う。行間や字間を調整し、読みやすい文章にするための技術を学んでいく。