ウェブエンジニア問題集

CSSセレクタの種類と使い分け — 要素を正確に指定する

セレクタは「どのHTML要素にスタイルを当てるか」を指定する記法です。セレクタを正確に書けると、特定の要素だけをピンポイントでスタイリングできます。

学習者学習者

狙った要素にだけスタイルを当てたいのに、関係ない所まで変わっちゃう…。どう書き分けるの?

どのセレクタを使えばいいか考えているイメージ

タイプセレクタ

HTMLタグ名を直接指定します。

/* すべての h2 に適用 */
h2 {
  font-size: 1.5rem;
}
 
/* すべての p に適用 */
p {
  line-height: 1.8;
}

シンプルですが、ページ内の同じタグがすべて影響を受けます。


クラスセレクタ

最もよく使うセレクタです。HTMLの class 属性に対して .クラス名 で指定します。

<p class="lead">リード文です。</p>
<p>通常の段落です。</p>
.lead {
  font-size: 1.25rem;
  color: #555;
}

同じクラスを複数の要素に付けられるので、再利用性が高いです。実務ではほとんどのスタイリングをクラスで行います。

複数クラスの組み合わせ

<button class="btn btn-primary">送信</button>
<button class="btn btn-secondary">キャンセル</button>
.btn {
  padding: 0.5rem 1rem;
  border-radius: 4px;
  border: none;
  cursor: pointer;
}
 
.btn-primary {
  background-color: #2563eb;
  color: white;
}
 
.btn-secondary {
  background-color: #e5e7eb;
  color: #111;
}

共通スタイルは .btn、差分だけ .btn-primary に分けるパターンが実務の基本です。


IDセレクタ

HTMLの id 属性に対して #ID名 で指定します。

<header id="site-header">...</header>
#site-header {
  height: 60px;
  background: #fff;
}

IDはページ内で一意(1つしか使えない)という制約があります。詳細度も高いため、スタイリングではクラスを優先し、IDはJavaScriptや href="#id" などに使うことが多いです。


属性セレクタ

HTML属性の値に基づいてスタイルを当てられます。

/* type="text" の input に適用 */
input[type="text"] {
  border: 1px solid #ccc;
}
 
/* href が https で始まるリンク */
a[href^="https"] {
  color: #16a34a;
}
 
/* .pdf で終わるリンク */
a[href$=".pdf"]::after {
  content: " (PDF)";
}

フォーム要素のスタイリングでよく使います。


擬似クラス

要素の状態に応じてスタイルを当てます。

/* マウスオーバー時 */
a:hover {
  text-decoration: underline;
}
 
/* フォーカス時(キーボード操作・クリック) */
input:focus {
  outline: 2px solid #2563eb;
}
 
/* リンク:未訪問・訪問済み */
a:link    { color: #2563eb; }
a:visited { color: #7c3aed; }
 
/* 最初の子要素 */
li:first-child { font-weight: bold; }
 
/* 奇数番目の行 */
tr:nth-child(odd) { background: #f9fafb; }

:hover:focus はインタラクションのスタイリングに必須です。


擬似要素

要素の一部に対してスタイルを当てます。

/* 最初の1文字 */
p::first-letter {
  font-size: 2em;
  float: left;
}
 
/* 要素の前後にコンテンツを挿入 */
.required::after {
  content: " *";
  color: red;
}

::before::after はデコレーション目的でよく使われます。


結合子(コンビネータ)

セレクタを組み合わせて関係性で指定します。

/* 子孫セレクタ:nav の中のすべての a */
nav a {
  text-decoration: none;
}
 
/* 子セレクタ:直接の子要素のみ */
ul > li {
  list-style: none;
}
 
/* 隣接セレクタ:直後の兄弟要素 */
h2 + p {
  margin-top: 0;
}
 
/* 一般兄弟セレクタ:後続のすべての兄弟 */
h2 ~ p {
  color: #555;
}

子孫セレクタ(スペース)は柔軟ですが、深くネストすると詳細度が上がりすぎるので注意が必要です。


よくあるハマりどころ

クラス名のタイポ

<div class="contaner">...</div> <!-- typo: contaner -->
.container { ... } /* 当たらない */

スタイルが当たらないときは、まずクラス名の綴りを確認します。

詳細度の競合

.card p { color: red; }   /* 詳細度: (0,1,1) */
p { color: blue; }         /* 詳細度: (0,0,1) */

後に書いても詳細度が低いと負けます。詳細度の仕組みは後の章で解説します。


ちゃんと使うためのポイント

  • スタイリングはクラスセレクタを中心に組み立てる
  • IDセレクタは詳細度が高く後から上書きしにくいので、スタイルには使わない方が安全
  • 子孫セレクタは便利だが、深いネストは詳細度問題を起こしやすい
  • :hover / :focus などの擬似クラスはUXに直結するので積極的に使う

次の章では、CSS最重要概念の一つ「ボックスモデル」を学びます。margin・padding・borderの関係を正しく理解することで、レイアウトへの理解が一段と深まります。