すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

CSSの基本的なセレクタと詳細度を理解しよう

この記事で出来るようになること

セレクタとは、スタイルを適用する対象をWebブラウザに伝えるためのものです。

CSSの書き方
1
2
3
セレクタ {
  プロパティ: プロパティ値;
}

これまでの学習では、以下のpのようにセレクタに要素名を記述し、スタイルの適用対象を指定していましたね。

これは「要素型セレクタ」と呼ばれる書き方です。

要素型セレクタの書式例
1
2
3
p {
  color: red;
}

上記のほかにも、セレクタの種類はたくさんあります。
今回は、必ずおさえておきたい基本セレクタとよく使うセレクタについて学びます。

基本的なセレクタをおさえよう

基本セレクタには、主に4つあります。

基本セレクタ 説明
全称セレクタ 全ての種類の要素を対象にスタイルを適用させる *
要素型セレクタ スタイルを適用する対象を「要素名」で指定する p
idセレクタ スタイルを適用する対象を「id属性の値」で指定する #sample
classセレクタ スタイルを適用する対象を「class属性の値」で指定する .sample

それでは、1つ1つのセレクタの書き方をみていきましょう。

全称セレクタ

全称セレクタは、「全ての種類の要素」を対象にスタイルを適用させるセレクタです。
セレクタにアスタリスク(*)を指定します。

全称セレクタの書き方
1
2
3
* {
  プロパティ名: プロパティ値;
}

以下のように全称セレクタでスタイルを指定すると、全ての要素が対象になるのでh1でもpでも種類関係なく適用されます。

CSS | 全ての要素を対象に文字色を赤にする
1
2
3
* {
  color: red;
}

See the Pen 全称 by miyajima yuya (@pikawaka) on CodePen.

ポイント
  1. 全称セレクタは、セレクタに*を指定する
  2. 全称セレクタを指定すると、全ての要素を対象にスタイルが適用される

要素型セレクタ

要素型セレクタは、スタイルを適用する対象を「要素名」で指定するセレクタです。

CSS | 要素型セレクタ
1
2
3
p {
  color: red;
}

上記では、HTMLファイルに含まれる全てのp要素を選択して、波括弧内のスタイルが適用されます。

要素型セレクタ

See the Pen 要素型 by miyajima yuya (@pikawaka) on CodePen.

ポイント

要素型セレクタは、セレクタに「要素名」を指定する

idセレクタ

idセレクタは、スタイルを適用する対象を「id属性の値」で指定するセレクタです。

HTMLの要素にid属性を指定し、CSSのセレクタにHTMLで指定した「id属性の値」を#の後に続けて記述します。

HTML | 要素にid属性を指定
1
<要素名 id="id属性の値"></要素名>
CSS | idセレクタの書き方
1
2
3
#id属性の値 {
  プロパティ名: プロパティ値; 
}

上記により、HTMLファイルに含まれるid属性を持つ要素を選択して、波括弧内のスタイルが適用されます。選択される要素のid属性は、CSSのセレクタに指定した「id属性の値」と完全に一致している必要があります。

そのため、以下のスタイルはid="second"を持つHTMLの要素に適用されます。

CSS
1
2
3
#second {
  color: red;
}

idセレクタ

HTMLの要素には、id属性を持つ要素が2つあります。

CSSによってスタイルが適用されるのは、secondのid属性値を持つ要素です。firstのid属性値を持つ要素には、スタイルが適用されません。

See the Pen id by miyajima yuya (@pikawaka) on CodePen.

idセレクタを使うときは、いくつかの注意点があるで確かめてみよう

ぴかわかさん

同じid属性の値を重複して指定できない

idセレクタを使用する際には、1つのHTMLファイル内に同じid属性の値を重複して指定することはできないという点に注意してください。

以下のようにid属性値firstを複数の要素に指定することはできません。

HTML | 同じid属性の値は使用できない
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
  <h1>CSS</h1>

<p id="first">Cascading</p>
<p id="first">Style</p>
<p>Sheets</p> </body> </html>
CSS
1
2
3
#first {
  color: red;
}

上記の表示結果は、以下の通りです。

See the Pen id4 by miyajima yuya (@pikawaka) on CodePen.

id属性値firstを複数の要素に指定した場合、スタイルが適用されて文字を赤くすることができていますが、文法的には誤りです。

1つの要素に複数のidを指定できない

idセレクタを使用する際には、1つの要素に複数のidを指定できないという点に注意してください。

次のHTMLのように最初のp要素に対して、firstsecondのid属性値を指定します。

HTML | p要素に複数のidを指定する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
  <h1>CSS</h1>

<p id="first second">Cascading</p>
<p>Style</p> <p>Sheets</p> </body> </html>
CSS
1
2
3
4
5
6
7
#first {
  color: red; // 文字色を赤にする
}

#second {
  background-color: yellow; // 背景色を黄色にする
}

上記の表示結果は、以下の通りです。

See the Pen id3 by miyajima yuya (@pikawaka) on CodePen.

最初のp要素の文字色と背景色に変化はありませんね。このように1つの要素に対して、複数のid属性値を指定しても、スタイルは適用されません。

ポイント
  1. idセレクタは、#の後に「id属性の値」を指定する
  2. セレクタで指定した値と完全に一致する、id属性を持つ要素が選択される
  3. HTML文書中には、同じid属性の値を重複して指定することができない
  4. 1つの要素に対して、複数のid属性値を指定することができない

classセレクタ

classセレクタは、スタイルを適用する対象を「class属性の値」で指定するセレクタです。
class属性で指定した値は、一般に「クラス名」と呼ばれます。

HTMLの要素にclass属性を指定し、CSSのセレクタにHTMLで指定したクラス名(class属性の値)を.の後に続けて記述します。

HTML | class属性を指定する
1
<要素名 class="class属性の値"></要素名>
classセレクタの書き方
1
2
3
.クラス名 {
  プロパティ名: プロパティ値;
}

同じクラス名を重複して指定できる

class属性はid属性とは異なり、1つのHTMLファイル内に同じクラス名(属性値)を重複して指定することができるという特徴があります。

例えば、以下のスタイルはclass="text-red"を持つ全ての要素に適用されます。

CSS
1
2
3
.text-red {
  color: red;
}

classセレクタ

See the Pen クラス by miyajima yuya (@pikawaka) on CodePen.

1つの要素に複数のクラスを指定できる

class属性では、複数のクラス(属性値)を指定することができます。
以下のように半角スペースで区切ります。

HTML | 最初のp要素に複数のクラス名を指定する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
  <h1>CSS</h1>

<p class="text-red bg-pink">Cascading</p>
<p>Style</p> <p class="text-red">Sheets</p> </body> </html>

See the Pen クラス2 by miyajima yuya (@pikawaka) on CodePen.

要素名に続けてクラス名を指定する

要素名に続けてクラス名を指定した場合は、その要素でのみクラスの指定が適用されます。

要素名に続けてクラス名を指定する
1
2
3
要素名.クラス名 {
  プロパティ名: プロパティ値;
}

例えば、以下のようにCSSのセレクタにh1.text-redと指定した場合は、HTMLのp要素にtext-redのクラス名を指定してもスタイルは適用されません。

クラス名でスタイルが適用されるのは、h1要素だけです。

CSS
1
2
3
h1.text-red {
  color: red;
}

See the Pen クラス3 by miyajima yuya (@pikawaka) on CodePen.

特定の要素のみクラスで指定する場合は、CSSのセレクタに「要素名に続けてクラス名」を記述します。

classセレクタの説明は、以上です。
セレクタの中でも1番使うことになるセレクタなので、しっかりと覚えておきましょう。

ポイント
  1. classセレクタは、.の後に「class属性の値」を指定する
  2. HTML文書中には、同じclass属性の値を重複して指定することができる
  3. class属性の値は、一般に「クラス名」と呼ばれる

子孫セレクタ

セレクタを半角スペースで区切って並べることで、階層構造の対象を絞り込み指定することができます。

CSS | セレクタを半角スペースで区切る
1
2
3
〇〇 〇〇 {
  プロパティ名: プロパティ値;
}

例えば、以下のように半角スペースで区切るとします。

CSS
1
2
3
.container p span {
  color: red;
}

上記のようにセレクタを区切ることで、「containerクラス内のp要素内のspan要素にだけスタイルを適用させる」ということができます。

子孫セレクタ

See the Pen 子孫セレクタ by miyajima yuya (@pikawaka) on CodePen.

このようにスタイルを適用させる対象を絞り込む指定は、「子孫セレクタ」と呼ばれます。

ポイント

半角スペースで複数のセレクタを区切ることによって、「〇〇内の〇〇に対してスタイルを適用する」というような絞り込み指定をすることができる

グループ化セレクタ

セレクタをカンマ(,)で区切ることで、グループ化することができます。
スタイルを適用する対象を複数指定する場合に使用します。

グループ化セレクタ
1
2
3
〇〇, 〇〇 {
  プロパティ名: プロパティ値;
}

全ての一致する要素を選択して、波括弧の中に書いたスタイルを適用することができます。

例えば、以下のセレクタのようにh1, pと指定した場合は、HTMLファイルに含まれる全てのh1要素とp要素を選択して、要素の境界に実線を引きます。

CSS | h1要素とp要素に同じスタイルを適用させる
1
2
3
h1, p {
  border: solid;
}

See the Pen グループ化1 by miyajima yuya (@pikawaka) on CodePen.

カンマ(,)で区切るセレクタには、h1pのような要素型セレクタだけではなく、idセレクタ、classセレクタを指定することができます。

CSS | 要素型とclassセレクタをカンマで区切りグループ化する
1
2
3
h1, .last {
  border: solid;
}

See the Pen グループ化2 by miyajima yuya (@pikawaka) on CodePen.

ポイント
  1. セレクタをカンマで区切ることで、グループ化することができる
  2. グループ化することで、同じスタイルを複数の要素に適用できる

セレクタの詳細度

セレクタには詳細度という概念があり、簡潔に説明すると「セレクタの強さ」を表します。

同じ要素に対して複数のスタイルが競合する場合、どのスタイルを要素に適用するかを詳細度で決定します。より強いセレクタのスタイルが優先されます。

優先されるものを「詳細度が高い」と表現します。詳細度は、以下のように3列(ID列・CLASS列・TYPE列)の値で構成されます。左の列ほど詳細度が高くなります。

詳細度の重み

やや難しい内容ですが、詳細度を理解しておくと、CSSが意図した通りに反映されないという多くの問題解決に役立ちます。

ぴかわかさん

基本セレクタの詳細度

これまでに学習した基本セレクタの詳細度は、以下の通りです。

基本セレクタの詳細度

詳細度は3列の値で構成されますが、各セレクタの数を数えることによって作成されます。例えば、ID列は各セレクタのidセレクタの数を表しています。

次のセレクタには、#sampleというidセレクタが1つだけ指定されているので、ID列に1を追加した1-0-0が値となります。該当しない列に数は追加されません。

CSS | idセレクタを指定する場合
1
2
3
#sample {
  color: red; /* 1-0-0 */
}

次の例では、セレクタに.text-redという「classセレクタ」が1つ指定されているので、真ん中のCLASS列に1を追加した0-1-0の値になります。

CSS | classセレクタを指定する場合
1
2
3
.text-red {
  color: red; /* 0-1-0 */
}

それでは同じ要素に対して複数のスタイルが競合する場合、この詳細度によって、どのような流れで要素に適用させるスタイルを決定しているのかを確かめてみましょう。

詳細度の計算(3つの列の比較)

詳細度は、それぞれの列の数値を左のID列から比較します。

競合するセレクタのID列が比較されて、ID列の値が大きいセレクタが勝ちます。ID列を比較しているとき、他の列の値は関係ありません。

詳細度の計算

ID列の値が同じであれば、次のCLASS列の値を比較します。CLASS列の値が同じであれば、次のTYPE列の値を比較します。

ぴっかちゃん

3つの列の比較は、実際にサンプルコードを使って詳しく解説するよ!

競合するセレクタのID列の値を比較する

以下のHTMLを例に詳細度の計算をみていきましょう。

HTML
1
<p id="sample" class="text-red">sample text</p>

上記のp要素に対して、以下のCSSで#sampleというidセレクタと.text-redというclassセレクタで文字色を指定します。

CSS
1
2
3
4
5
6
7
#sample {
  color: green;
}

.text-red {
  color: red;
}

このときp要素のスタイルは競合状態です。p要素には#sample.text-red、どちらのスタイルが適用されるでしょうか。

答えは#sampleのスタイルが適用されて、文字色は緑となります。

classセレクタとidセレクタの詳細度

なぜ#sampleのスタイルが適用されるのかは、詳細度の計算で理解することができます。詳細度の観点からスタイル適用までを確認していきましょう。

各セレクタの詳細度は、以下の通りです。

CSS | idセレクタとclassセレクタの場合
1
2
3
4
5
6
7
#sample {
  color: green; /* 1-0-0 */
}

.text-red {
  color: red; /* 0-1-0 */
}

まず、競合するセレクタのID列の値が比較されます。

idとclassの詳細度

ID列の値は各セレクタにあるidの数で、#sample1.text-red0です。

ID列の値が大きいセレクタが勝ちます。
そのため、ID列の値が大きい#sampleのスタイルがp要素に適用されます。

See the Pen 詳細度1 by miyajima yuya (@pikawaka) on CodePen.

ID列の値を比較するときに、他の列は関係ありません。

次のCLASS列の値が#sampleよりも.text-redの方が大きかったとしても、関係ありません。重要なのは最初のID列の値だけです。

ID列の値が重要

競合するセレクタのID列の値が同じ場合のみ、次のCLASS列の比較に移ります。

ぴかわかさん

ID列の値が同じであれば、次のCLASS列の値を比較する

競合するセレクタのID列の値が同じ場合は、次のCLASS列の値を比較します。

次の例では、CSSのセレクタに「idセレクタ」はないので、.text-redpのどちらのセレクタもID列は0です。この場合、次のCLASS列の値を比較します。

HTML
1
<p class="text-red">sample text</p>
CSS | classセレクタと要素型セレクタ
1
2
3
4
5
6
7
.text-red {
  color: red; /* 0-1-0 */
}

p {
  color: yellow; /* 0-0-1 */
}

ID列の値が同じ場合は、TYPE列の値に関係なく、CLASS列の値が大きいセレクタが勝ちます。CLASS列の値は各セレクタにあるclassセレクタの数です。

CLASS列の値はpよりも.text-redの方が大きいので、.text-redが勝ちます。

classセレクタと要素型セレクタ

HTMLのp要素には.text-redのスタイルが適用されるので、以下のように文字は黄色ではなく、赤色となります。

See the Pen 詳細度2 by miyajima yuya (@pikawaka) on CodePen.

競合するセレクタのID列とCLASS列の値が同じ場合のみ、次のTYPE列の比較に移ります。

ぴかわかさん

ID列とCLASS列の値が同じであれば、次のTYPE列の値を比較する

競合するセレクタのID列とCLASS列の値が同じ場合は、次のTYPE列の値を比較します。

次の例では、CSSのセレクタにidとclassのセレクタがないため、p*のどちらのセレクタもID列とCLASS列は0です。この場合、次のTYPE列の値を比較します。

HTML
1
<p>sample text</p>
CSS | 要素型セレクタと全称セレクタの場合
1
2
3
4
5
6
7
p {
  color: yellow; /* 0-0-1 */
}

* {
  color: blue; /* 0-0-0 */
}

TYPE列の値は、各セレクタにある要素型セレクタの数です。

TYPE列の値は*よりもpの方が大きいので、pが勝ちます。

要素型セレクタと全称セレクタの場合

HTMLのp要素には要素型セレクタであるpのスタイルが適用されるので、以下のように文字は青色ではなく、黄色となります。

See the Pen 詳細度3 by miyajima yuya (@pikawaka) on CodePen.

詳細度が同じ場合(3つの列の値が同じ)

同じ要素に対して複数のスタイルが競合する場合、詳細度は左のID列から比較し、どのスタイルを適用するかを決めていましたね。

基本セレクタの詳細度の比較

ID列の値が同じであれば、次のCLASS列を比較し、ID列とCLASS列が同じ値であれば、次のTYPE列の値を比較します。

それでは、以下のように競合するセレクタの値が3列とも同じ場合、どのようにしてスタイルが決まるのでしょうか。

3つの列の値が同じ場合

HTML
1
<p class="text-red text-blue">sample text</p>

3つの列の値が同じ場合は「詳細度」ではなく、「出現順序」の判定基準によって、後に登場したスタイルが優先されます。

以下のCSSでp要素に適用されるスタイルは、後に登場する.text-blueです。

CSS | 3つの列の値が同じ場合
1
2
3
4
5
6
7
.text-red {
  color: red; /* 0-1-0 */
}

.text-blue {
  color: blue; /* 0-1-0 後にあるので勝ち*/
}

See the Pen 詳細度、3つの列の値が同じ場合 by miyajima yuya (@pikawaka) on CodePen.

ポイント

競合するセレクタの値が3列とも同じ場合は、後に登場したスタイルが優先される

次は複数のセレクタを指定した場合の詳細度を学びます。

ぴかわかさん

複数のセレクタで構成されるルールセットの詳細度

これまでは、主に「単一のセレクタで構成されたルールセット」の詳細度について学習してきました。

単一セレクタ

それでは「複数のセレクタで構成されるルールセット」の詳細度は、どのように決まるのでしょうか。

複数のセレクタで構成されるルールセット

複数のセレクタで構成される場合でも、詳細度の値は各セレクタの数を数えることによって作成されます。

子孫セレクタの具体例を挙げて解説します。

子孫セレクタの詳細度

子孫セレクタは、半角スペースで区切ることによって「スタイルの適用対象を絞り込む」ことができるセレクタでしたね。

子孫セレクタの例

まずは、詳細度の値をみてみましょう。

子孫セレクタのように複数のセレクタで構成されるルールセットでも、詳細度は「ID列・CLASS列・TYPE列」に当てはまるセレクタがいくつあるかを数えるだけです。

例えば、以下のルールセットの場合は、3つの要素型に基づいて 0-0-3となります。

CSS | 複数の要素型を指定
1
2
3
main p span {
  color: green; /* 0-0-3 */
}

上記のセレクタの箇所にmainpspanの3つの要素型セレクタが指定されます。

要素型のセレクタは、1番右の列であるTYPE列に当てはまるので、詳細度は1番右の列に3を追加した0-0-3となります。

基本セレクタの詳細度

次の例では、セレクタの箇所に.parent.childの2つのクラスセレクタがあるので、詳細度はCLASS列に2を追加した0-2-0となります。

CSS | 複数のクラスセレクタを指定
1
2
3
.parent .child {
  color: green; /* 0-2-0 */
}

次のように要素名に続けてクラス名を指定する場合は、1つのクラスセレクタ、1つの要素型に基づいて、0-1-1となります。

CSS | 要素名に続けてクラス名を指定
1
2
3
li.text-red {
  color: red; /* 0-1-1 */
}

「子孫セレクタ」で「要素名に続けてクラス名」を指定する場合でも、各セレクタの数を数えるだけになるので、1つのクラスセレクタ、2つの要素型に基づいて、0-1-2となります。

CSS | 絞り込み指定で要素名に続けてクラス名を指定
1
2
3
ul li.text-red {
  color: red; /* 0-1-2 */
}
ぴっかちゃん

各セレクタの数を数えて、3列に当てはめるだけだね!

同じ要素に複数のスタイルが競合する場合

同じ要素に対して複数のスタイルが競合する場合、詳細度は左のID列から比較し、どのスタイルを適用するかを決めていましたね。

複数のセレクタを指定する場合でも、この計算方法は変わりません。

基本セレクタの詳細度の比較

次の例の#samplemain p spanのように、どんなに複数のセレクタを指定しても、ID列が0であれば負けてしまいます。

HTML
1
2
3
4
5
6
7
<main>
  <p>
    <span id="sample">
      sample text
    </span>   
  </p>
</main>
CSS
1
2
3
4
5
6
7
#sample {
  color: red; /* 1-0-0  勝ち! */
}

main p span {
  color: green; /* 0-0-3 */
}

スタイルが競合する場合は、ID列の値から比較されることを覚えておきましょう。ID列を比較する際に、他の列の値は関係ありません。

インラインスタイルの場合

CSSをHTML文書に適用させる際には、style属性で単一の要素のみ適用することができましたね。以下のようにHTMLの要素にstyle属性でスタイルを指定します。

HTML | style属性の書き方
1
<要素名 style="プロパティ: プロパティ値;"></要素名>
HTML | サンプルコード
1
<p style="color: red;">CSSとは「Cascading Style Sheets」の略です。</p>

このようなインラインスタイルは、最も高い詳細度を持つので注意が必要です。

詳細度は、ID列-CLASS列-TYPE列(0-0-0)の値で構成されますが、インラインスタイルは、1-0-0-0という詳細度を持ちます。

以下のようにID列の値が大きくても、インラインスタイルには勝てません。

HTML | idを追加する
1
<p id="sample" style="color: red;">CSSとは「Cascading Style Sheets」の略です。</p>
CSS
1
2
3
#sample {
  color: green; /* 0-1-0-0 */
}

See the Pen インラインスタイルの詳細度 by miyajima yuya (@pikawaka) on CodePen.

最も高い詳細度を持つインラインスタイルを上書きする場合は、!importantを使うしかありません。

!important

!importantは、これまでの詳細度の計算を無効にする特別なCSSです。

特定のプロパティと値を「最も重要であると指定する」もので、CSSの同じ要素に対してスタイルが競合した場合の優先順位(カスケード)のルールを上書きします。

次のように!importantは、プロパティ値のすぐ後に書きます。

CSS
1
2
3
#sample {
color: green!important;
}

See the Pen !importantを使う場合 by miyajima yuya (@pikawaka) on CodePen.

!importantは最も高い詳細度を持つインラインスタイルを無効にしてしまうものなので、安易に使わないようにしよう。

コーディングする上での注意点
  1. 要素名にスタイルを指定しない
  2. idではなくclassセレクタを使う
  3. !importantを安易に使用しない

この章のまとめ

重要なポイントをおさえよう!

  • セレクタとは、スタイルを適用する対象をWebブラウザに伝えるためのもの
  • セレクタには、セレクタの強さを表す「詳細度」という概念がある
  • 同じ要素に対して複数のスタイルが競合する場合、より強いセレクタのスタイルが優先される