更新日
#11 class属性とid属性について理解しよう
ここまでCSSの講座が続きましたが、今回の講座はHTMLとCSSどちらにも関連する内容です!
初学者がつまずきやすい「class属性とid属性」について学習していきます。
属性のおさらい

開始タグの中に〇〇="内容"
で書かれたものを属性と呼ぶのでしたね。
属性はそのタグに対して情報を追加する時に使用され、img
でいえば画像のパスを書くsrc属性、a
でいえば、リンク先を書くhref属性がありましたね!
タグに対してどんな情報を追加するものなのかを学習していきましょう!
まずは結論|idとclassは特定の要素にCSSを適用させるために使う
結論から述べるとidとclassは「特定の要素にだけCSSを適用したい時」に使用します。
以下の例をもとにまずは前提を理解しましょう。
<div>
<p>黒色</p>
<p>赤色</p> <!-- これだけ赤色にしたい -->
<p>黒色</p>
</div>
左のHTMLのコードの中で2番目のp要素だけテキストを赤色にしたいとします。
その時のCSSのコードはどうなるでしょうか?
【 不正解の手法】divをセレクタにした場合は?…
div{
color : red;
}
div
をセレクタにした場合は子要素に影響してしまうので全てのp
が赤色に変わってしまいます。
黒色
赤色
黒色
【 不正解の手法】pをセレクタにした場合は?…
p{
color : red;
}
ではp
をセレクタにするのが正解でしょうか?こちらも同様に全てのp
が赤色に変わってしまうので不正解です。
黒色
赤色
黒色
p
とした場合は全てのp
に対してcolor : red
が適用されてしまうし、div
をセレクタにした場合でも、子要素のp
にもcolor : red
が適用されてしまうからという理由だったよね【正解の手法】id属性やclass属性を使うことで特定の要素をセレクタにできる
こんな時にid属性とclass属性を使用します。(※今回の例はclass属性を使用)
赤色にしたいp
に対して「class="red"
」という属性をつけています。
<div>
<p>黒色</p>
<p class="red">赤色</p>
<p>黒色</p>
</div>
/*セレクタをclass名にする*/
.red{
color : red;
}
黒色
赤色
黒色
そして.red
をセレクタに指定することで「red」というclass名のついたp要素だけテキストを赤色にできるというわけです。
このように、「特定の要素だけ(例では2番目のp要素)に対してCSSを適用させたい」場合にclassやidで名前をつけセレクタとして扱います。
つまりidとclassは
「特定の要素をセレクタとして使用するためにつける名前」
という役割になります。
本講座で学習すること
役割は理解できたと思うので、書き方・使い分け・実際の利用例を以下の流れで学習していきましょう。
- id属性の書き方とルール
- class属性の書き方とルール
- idとclassの違い
- idとclassどう使い分ける?
- id名とclass名の決め方
- divやspanにclass属性やid属性が頻繁に使われる理由
- 【小テスト】idとclassのおさらい
id属性の書き方
❶HTML側でのid属性の書き方

他の属性と同じようにid属性も
<タグ名 id="id名">
と書きます。
名前の付け方にもルールがあり、
- 半角英数字を使う(大文字OK)
- -(ハイフン)と_(アンダーバー)の記号はOK
- 先頭が数字から始まるのはNG
となっています。
<!-- 正しい例 -->
<div id="contain">〜</div>
<div id="f-50">〜</div>
<!-- 間違っている例(先頭が数字と記号になっている) -->
<div id="50-mgn">〜</div>
<div id="_box">〜</div>
左に正しい例と間違っている例を紹介しています。
id名のルールに反していると上手くCSSが機能しないので注意しましょう。
❷CSS側でのid属性の書き方

id名をつけた要素をCSSのセレクタにする時は
#(半角シャープ記号)+ id名
というようにセレクタに記述します。
プロパティや値の書き方に影響はありません。
id属性のルール|同じページに1つだけ
同じid名は同じWEBページの中で1つまでと決まっています。

「1つのページに」とは「同じHTMLファイルに」という意味です。たとえばトップページを表示しているindex.html
にid="red"
というidが複数存在しているのはNGです。
しかし、トップページのindex.html
にid="red"
が1つ、サービス紹介のページを表示するservice.html
にid="red"
が1つと同じサイトでも違うページならOKです。
class属性の書き方
❶HTMLでのclass属性の書き方

id属性と同じ形式です。
<タグ名 class="class名">
というように書きます。
名前の付け方のルールもid属性と同じで
- 半角英数字
- -(ハイフン)と_(アンダーバー)の記号はOK
- 先頭が数字から始まるのはNG
となっています。
❷CSSでのclass属性の書き方

CSSでclass名をセレクタに指定する場合は
.(ドット記号)+ class名
というように書きます。
こちらもプロパティや値の書き方に変化はありません。
class属性のルール
❸同じclass名を複数書いてもOK

class属性とid属性の大きな違いの1つがこれです。
idは同じページに同じid名の要素が複数存在するのはNGでしたよね。
class属性はその制限がありません。
かと言って複数ないとダメということはなく、class属性は1つでも複数でもどちらでもOKです。
❹class属性の中に複数の名前を書ける

1つの属性の中で半角スペースで区切ることで、複数のid名やclass名を付与することができます。
画像の例での<p>
は
.big
というclass名の要素であり、さらに.large
というclass名の要素でもあるということになります。
<p class="big large">これは大文字</p>
/* どちらも同じセレクタ */
.big{
font-size: 80px;
}
.large{
font-size: 80px;
}
つまり、次のように書いた場合どちらも同じ要素を指すことになります。
同じ要素にセレクタを複数つけられるメリットをつづけて解説します。
複数の名前を書くことによるメリット
<p class="red">これは赤色</p>
<p class="red border">これは赤色かつ線</p>
例えばどちらのp
もほぼ同じ見た目にしたいけど、2つ目のp
だけ変化を加えたいというケースがあります。
そんな場合は左のコードのように2つ目のp
にのみ、追加でclass名を付与します。
/*共通のスタイル*/
.red{
color : red;
font-weight:bold;
font-size: 20px;
padding: 10px;
}
/*線をつける*/
.border{
border : solid 1px;
}

.red
は共通のclass名なのでp
はどちらも同じ見た目になっていますが、追加で.border
がついた2つ目のp
のみ線がついていますよね。
id名やclass名という呼び方について
ちなみにid属性やclass属性によって指定した名前のことを「class名」や「id名」というような呼び方をします。
<p class="sentence">これは文章です</p>
例えば上記のようなコードがあった場合「pタグのclass名は”sentence”だね」のような使い方をします。
idとclassの共通の書き方のルール
コードの3番目のp
に注目してください。
<div>
<p class="txt">idは1つ</p>
<p class="txt">classは複数</p>
<p id="both" class="txt">両方つけてもOK</p>
</div>
<p id="both" class="txt">
と同じ要素にidとclass両方の属性が付いていますよね。
このように1つのタグに対してclass属性とid属性を両方付与するのはOKです。
<img src="~~" alt=""~~">
のようにimg
の場合もsrc属性とalt属性の2つの属性がついていますが、それと同じで複数の属性がついているだけなので問題ありません。
idとclassの違い
先ほど説明した「idは1つまで、classは複数OK」という点が最も大きな違いではありますが、実はもう2つ覚えておいて欲しい違いがあります。
違い01|CSSの詳細度の違い
CSSには詳細度という概念があります。
これは「同じ要素に対して別々のCSSが適用された時どちらを優先して反映させるか?」という順位づけの概念です。実際の例を見てみます。
<div>
<p class="red">これは赤色</p>
<p id="blue" class="red">これは青色</p>
</div>
左のコードのp
にはそれぞれclass="red
がついていますが、2つ目のp
にはid="blue"
もついています。
.red{
color : red;
}
#blue{
color : blue;
}
そしてCSSには.red
は赤文字、#blue
が青文字になるコードが書かれていますね。
それでは.red
と#blue
どちらもついている2つ目のp
は「赤」と「青」どちらの文字色になるでしょうか?

正解は青色です。
idがセレクタの場合、classよも優先度が高く「id > class」となるため、color : blue;
が優先して適用されています。
このようにidとclassではCSSのidの方が優先度が高いということを覚えておきましょう。
違い❷idはページ内リンクを作成するときに使用する
百聞は一見にしかずということで「ここをクリックして見てください」
「class属性のルール」という見出しまで移動しましたよね?
このようにリンクをクリックした際に同じページ内の別の場所に移動することを「ページ内リンク」と呼びます。
これは<a>
とid属性を組み合わせることにより再現しています。
<div id="top">...<div>
<a href="#top">トップへ戻る</a>
たとえば左のようにa
のhref属性にhref="#top"
と記載することでa要素をページ上でクリックした場合、id="top"
と付いているdivの位置まで移動させることができます。
idとclass結局どう使い分ける?
「基本はclass属性を使い、id属性はページ内リンクの時に使う」
と考えておきましょう!classを使う理由は主に2つあります。
理由❶| idは優先度の高さが邪魔をする
さきほどidはclassよりCSSの優先度が高いことを説明しましたよね。
そのため、idばかり使用してしまうとidをつけた要素に対してCSSを適用する時に反映しにくくなってしまいます。
理由❷|共通のCSSを適用する時にclassの方が便利
<p id="text01">迷ったらclassを使う</p>
<p id="text02">迷ったらclassを使う</p>
例えば複数の要素に対して、同じCSSを適用したい時にidで名前とつけていると不便になります。
id名は同じ名前を使えないので、別のid名をつけた上でCSSの同じコードを書かないといけません。
/*
id名を別にしないといけないので
全く同じCSSのコードを書く必要があり非効率
*/
#text01{
background-color:#5fa3d6;
color:white;
padding: 20px;
}
#text02{
background-color:#5fa3d6;
color:white;
padding: 20px;
}

class名を使えば…
<p class="text">迷ったらclassを使う</p>
<p class="text">迷ったらclassを使う</p>
classなら同じclass名を使ってもOKでしたね。
なので、共通のCSSをつけたい要素に対して共通のclass名をつければ同じコードを書く必要はありません。
/*共通のclass名ならCSSの記述が1度で済む*/
.text{
background-color:#5fa3d6;
color:white;
padding: 20px;
}

左のコードのように共通のclassセレクタを指定し、1度のコード記述で共通の見た目にすることができました。
id名とclass名どうやって決めたらいい?
class名とid名は「半角と記号で自由につけられる」と言っても実際の現場ではどのようにclass名を決めているか気になりますよね。
例えば、以下のようなデザインがあった場合、HTMLでは次のようなclass名をつけることが多いです。

<div class="firstview">
<img src="bg.jpg">
<h1>絶景冒険プラン</h1>
</div>
<div class="content">
<h2 class="headline">
<span>point</span>このプランのポイント
</h2>
<ul class="list">
<li>雨天の場合、100%返金</li>
<li>20年のベテランガイドが着くから安心</li>
<li>野生動物と触れ合える!</li>
</ul>
<a class="button" href="./reserved">予約する</a>
</div>
<div>
に対してfirstview
やcontent
といったclass名がついていたり、ul
やa
にlist
やbutton
というclass名がついていますよね。
では、どのようにHTMLのclass名を決めたかと言うと、
デザインデータを見て、それにふさわしい英語を自分で考えてclass名を付けただけです。

上記の例にある通り、命名(class名をつけること)は必ず守らなければならないというルールは存在せず、「デザインデータに沿って自分がふさわしいと思った名前をつける」というイメージを持っておいてもらえればOKです。
よくあるclass名の例を紹介しておくと、
- ボックスであれば
.box
- 写真であれば
.photo
- 線であれば
.line
や.border
- メニューであれば
.nav
や.menu
などなど、単語でシンプルに表現することが業界では一般的です。
divにclass名がよく使用されている理由
div
がレイアウトの変更によく利用されることは前回の講座で学習しましたよね。
div
にclass名が付くことが多いのは、それぞれのdiv
のグループを識別することでCSSを適切に書き分けたいからです。
ちょっと難しいと思うので以下の例で確認していきましょう。
説明01
例えば以下のようなコードがあった場合、画像と文章は当然縦に並びます。
<img src="img/photo.jpg">
<p>イヌはヒトと同じく社会性を持つ生き物です。意思疎通をするための感情や表情も豊かです</p>
<p>褒める、認める、命令するなどの概念を持っています。ヒトに飼われているイヌは、
<br>人間の家族と自身を1つの群れの構成員と見なしていると考えられています。</p>

説明02
右の例のように横並びにした上で、文章の方に装飾を加えたいとします。
【Before】縦並びから→

【After】横並び+装飾を加えたい

説明03
<div>
<div>
<img src="img/photo.jpg">
</div>
<div>
<p>イヌはヒトと同じく社会性を持つ生き物です。意思疎通をするための感情や表情も豊かです</p>
<p>褒める、認める、命令するなどの概念を持っています。ヒトに飼われているイヌは、
<br>人間の家族と自身を1つの群れの構成員と見なしていると考えられています。</p>
</div>
</div>
その場合、div
でそれぞれの要素をグルーピングするところまでは良いですが、
このままでは<div>
が複数あるため、セレクタをdivとしてdiv{ ~~ }
というCSSを書いては全てのdiv
に対して同じCSSが適用されてしまいますよね。
説明04
<div class="box">
<div class="photo">
<img src="img/photo.jpg">
</div>
<div class="description">
<p>イヌはヒトと同じく社会性を持つ生き物です。意思疎通をするための感情や表情も豊かです</p>
<p>褒める、認める、命令するなどの概念を持っています。ヒトに飼われているイヌは、
<br>人間の家族と自身を1つの群れの構成員と見なしていると考えられています。</p>
</div>
</div>
そこで、それぞれの<div>に対して
<div class="box">
<div class="photo">
<div class="description">
という名前をつけてあげることで、CSSを適切に振り分けることができるようになります。
説明05
.box{
display: flex;
}
.photo{
flex-basis: 40%;
}
.description{
border: solid 1px;
box-shadow: 6px 6px 0px;
flex-basis: 60%;
padding: 15px;
margin-left: 15px;
}

最終的なCSSはこのようになります。
div
をセレクタにするのではなく、class名をセレクタにすることで適切にCSSを適用させることができていますね。
display: flex
はレイアウトをコントロールするプロパティです。
【小テスト】idとclassのおさらい
【告知】次回の講座でclassの理解度の課題にチャンレジします
以下のおさらいできた人は「#13_divとclass属性を使った課題に挑戦しよう」へ進んで今回の講座の理解度をチェックしてみてください。
【Before】このHTMLを→

【After】classを使ってこのように装飾

id属性とclass属性についての小テストをしよう!
- Q.idとclassの主な役割は?
- 要素ごとに識別できる名前をつけて、特定の要素にのみCSSを適用するため
- Q.idとclassのセレクタの書き方は?書いていい文字のルールは?
- idは
#id名
、classは.class名
ルールは半角英数字と「_」と「-」の記号が使用可能。
記号や数字から始まるのはNG(NG例:_text
や01title
など)
- Q.idとclassのうち同じ名前を複数つけることができるのはどっち?
- class、idは同じページに1つまで
- Q.同じ要素に対して
<p id="text" class="title">
とidとclassの両方が指定されており、#text{ color : black }
と.title{ color : white }
とCSSが重複していた場合、優先されるのはどちら? #text{ color : black }
、同じ要素のidとclassでプロパティが重複している時はidが優先される
- Q.ページ内リンクを作成する時に使用するのはどっち?またhrefには何と書く?
- id、href属性には
<a href="#id名">
と書くことでid名が書かれた要素まで移動する
- Q.idとclass頻繁に使用されるのはどっち?その理由は?
- class、共通の要素に同じCSSを割り当てたい時にidは同じ名前をつけることができない。
classであれば複数同じ名前を使えるので共通のCSSを適用したい時に利便性が高い
- Q.class名はどのように決める?
- デザインデータから適切な英単語を自由に決めることができる