まず、HTMLはその文書を構成する要素をマークアップするメタ言語と呼ばれるものです。
すなわち、ここが見出し、ここが段落と言う風に、タグ(荷札)で囲んで印をつけ(マークアップ)ます。
ところが、限られたタグしかありませんから、文書を構成する要素といっても限界があります。そこで、要素にclass名やid属性(attribute)をつけて区別できるようにします。
★7.5.2 要素識別子: id属性とclass属性 ( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/global.html#h-7.5.2 )
(注)解らないときは、仕様書を確認する癖をつけましょう。伝聞よりは正確で確実な情報を得られます。それを調べて解らないときに聞くとよいです。
______________ここから
id = name [CS]
この属性は、要素に名前を割り当てる。この名前は文書中で一意でなければならない。
class = cdata-list [CS]
この属性は、ある要素に1つのクラス名を割り当てるか、または複数のクラス名を設定する。 幾つの要素に対してでも、同じクラス名あるいはクラス名群が割り当てできる。複数のクラス名については、空白文字によって区切らねばならない。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで
また、用意された要素(タグ)が無い場合、DIV,SPANを使ってマークアップしますが、そのDIV,SPANの項目には
【引用】____________ここから
DIV要素とSPAN要素は、id属性及び class属性と併用することで、文書に構造を付加するための一般機構を提供する。 各々、内容が行内であるか(SPAN)ブロックレベルであるか(DIV)は定めるが、他のプレゼンテーション的語彙を示すことはない。 従って著者は、この両要素をスタイルシートやlang属性等と併用することで、HTMLを自身の必要や好みに応じられるようにできる。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで[7.5.4要素のグループ化: DIV要素とSPAN要素( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/struct/global.html#h-7.5.4 )]より
と書かれています。
具体的に説明すると次のようなHTMLにおいて、
<body>
<!-- ここからヘッダ要素 -->
見出しやナビゲーション
<!-- ヘッダこまで -->
<!-- ここから本文の章(section) -->
章見出し
<!-- 本文終わり -->
<!-- ここから本文の章(section) -->
章見出し
<!-- 本文終わり -->
<!-- ここからフッタ -->
フッター記事
<!-- フッタ終わり -->
で構成されている場合、
{HTML5]では、
<body>
<header>
<h1>見出し</h1>
</header>
<section>
<h2>章見出し</h2>
<p>記事</p>
</section>
<section>
<h2>章見出し</h2>
<p>記事</p>
</section>
<footer>
<h2>フッタ見出し</h2>
</footer>
</body>
となります。HTML4.01には、この様な(文書)構造を示す要素(タグ)がありませんでしたから、 「DIV要素とSPAN要素は、id属性及び class属性と併用することで、文書に構造を付加するための一般機構を提供する」ために
<body>
<div class="header">
<h1>見出し</h1>
</div>
<div class="section">
<h2>章見出し</h2>
<p>記事</p>
</div>
<div class="section">
<h2>章見出し</h2>
<p>記事</p>
</div>
<div class="footer">
<h2>フッタ見出し</h2>
</div>
</body>
というマークアップが推奨されていました。検索エンジンはこのようなclass名やidは理解しています。また、著者自身も後でHTMLやCSSを見直すときに理解しやすいです。
【現実には】、この様なマークアップをするためには著者自身が内容を理解して適切なclass名をつけなけれはなりませんが、オーサリングツールに読解力はありませんから、class名にwrapper,container,left,rightなど、検索エンジンにも意味不明なものが付けられ続けていました。その反省からHTMLでは、文書の構造を示す要素(タグ)がいくつか決められました。
ここから解るように、IDやclassは本来は「文書に構造を付加するため」のものなのですが、スタイルシートのためと誤解されている向きも多々あります。
{あの具体的な使い分けってあるんですか。}
IDは単純に「その文書にひとつしかない」要素を示すものがIDです。主にリンクの終端に使われます。class名は、文字通りグループ(クラス)を示すものです。特にclass名はスタイルシートにとって便利が良い機能です。
{時々、IDとclassが一緒になっていることがありますよね?}
もちろん一緒だろうと別だろうと構いません。
<div class="header">
<div class="nav" id="nav">
<ol>
<li><a href=""></a></li>
リンク先<a href="nav">として、スタイルシートで、div.navあるいはdiv#navでも可能です。スタイルシートで、一意属セレクタ(IDのこと)はb=1,クラスセレクタはC=1ですから、詳細度が異なります。
いずれにしても、スタイルシートのためにIDやclass名を乱雑につけるべきではありません。詳細度などカスケーディング機能で要素を特定できないときにのみつける意識が必要です。
【例】
<div class="header">
<div class="nav" id="nav">
<ol>
<li><a href=""></a></li>
に対して、div.nav ol li a{color:red;}[詳細度 0 0 1 4]で済むものを
<div id="header">
<div class="nav">
<ol>
<li><a href="" id="red"></a></li>
に対して、#red{color:red;}詳細度[0 1 0 0]なんてしないことです。
お礼
classとidが同時に出てくるとはそういう意味です。 一行で出てくることがあったので何かなと。 こちらの説明は分かり易くて助かりました。 どうもご回答有り難うございます。