CSS といえば興味が湧きたてのころに、「なんで class と id って属性があんだろ? 」 なんて漠然とした疑問があった。そのときは id 属性の用途に気付いていなかった (同じだと思っていた) から、そういう可愛らしい疑問が浮んできたわけなのだけれど、意味がわかればなんてことはなく、簡単に理解ができた。
id属性値はHTML文書内でユニークな存在でなくてはなりません。つまり、同じid属性値を持った要素が、同一文書中に複数存在してはいけないのです。一見、不便なようですが、このルールのためにid属性値はリンクアンカーの役割を果たします。つまりid属性値の設定された要素には直接リンクできるわけです。…後略
んじゃなんで、a 要素が既にあるのにわざわざと id 属性なんて作られたんだろ。という疑問が浮上するわけです。装飾がヘンになるから id で a 要素の代替とさせるためとか? というか、仕様書読めばわかるのかな (読んでないんです)。
HTML4.01ではname属性とid属性が両立しています。しかしながら、汎用性の高いid属性が登場した以上、name属性にはもはや存在価値がないことが明らかです。最初からid属性を考えつけばよかったのに、と思いますが、いまさらそんなことをいっても仕方ないですね。
リンクとは情報の参照である、という思想的立場を取る限り、name属性というのはもともと中途半端な存在なんです。なぜそういえるのか? 多くの場合、参照する価値のある情報のまとまりは、段落やリストといったブロックレベル要素となります。インライン要素であるa要素のname属性では、いくらa要素がiframe要素をふくむほとんどのインライン要素を子要素とできるとはいえ、やはり文書中の意味のまとまりに名前を付けるという目的に対して非力です。ブロックレベル要素に名前を付けられるid属性が望まれる所以です。
なお、a要素は入れ子にできません。それに対してid属性として名前を付けた要素が入れ子関係を持つことは何ら問題がありません。
<div id="diary030513">
<h2>平成15年5月13日</h2>
<p id="diary030513summary">本日は晴天なり。</p>
<p>小笠原気団の勢力伸張著しく、太平洋岸を高気圧が覆い、本日は全国的に晴れ。関東地方は6月上旬並みの気温となった。</p>
</div>
リンク=ジャンプという発想が蔓延した結果、まあname属性でたいていの用は足りるじゃないか、とされてしまっていますけれども、これはおかしな話です。まあ、私もCSSによる装飾とページ内移動のためにしかid属性値を使っていません。目次に用意したリンクが見出しを参照する、というのは、一応は理屈に適っているだろうという判断です。ISO-HTMLでは見出しをdiv要素の子要素にできませんし、本質的にはXHTML2.0でsection要素が導入されるまでは見出しと段落をまとめる要素がそもそも用意されていないわけです。だからまあ、HTML4.01を使う以上は、id属性を見出しに与えるというのも致し方ないところかな、と。
見出し+それに続く本文をdiv要素でまとめてid属性値をつければ実際問題としては事足りるわけですが、私は面倒くさがりなので、基本的にそういうやり方をするつもりはありません。(同じ理由で当サイトの既にある記事を、将来XHTML2.0に移行することはないと思います。section要素があるのにそれを使わず、見出し要素にid属性値をふっているという現在のマークアップを修正する作業が煩雑だからです)
この件は、以前CSSコミュニティーで段落アンカーの望ましい記述法といった観点から話題となったことがあります。(ほとぼりが冷めた頃にまた話題になるでしょう。この手の話題は、初心者が増えるとまたくりかえされるものなのです)