CSS3 が登場して擬似クラス nth-child が使えるようになって、要素の何番目のみにスタイルを適用するような事が非常に簡単になりました。従来ではクラスなどを駆使して無理やり指定していました。これではソースも CSS も冗長になって美しくありません。nth-child が全てを解決してくれます。例として以下を御覧ください。
- りんご
- みかん
- ぶどう
この2行目のみかんのみ文字色を変えたいという場合は css で nth-child を指定します。
ul li:nth-child(2){ color:#f00; }
nth-child(2) でリストの2番目を指定するという意味になります。
前置きはこのくらいにして、ここからが本題です。このような便利な nth-child ですが、div 要素に nth-child を指定した時に詰まりました。
クラス名の違うdivが連なる場合
このような html ソースがあるとしましょう。
<div class="top"> トップ1 </div> <div class="top"> トップ2 </div> <div class="bottom"> ボトム1 </div> <div class="bottom"> ボトム2 </div>
ボトム1を指定したいので以下のような css にしました。
div.bottom:nth-child(1){ color:#f00; }
しかし、文字色は変わりませんでした。
div.top:nth-child(1){ color:#f00; }
上の方にあるクラス名 top を指定するとちゃんと文字色が変わります。ここで原因がわからず詰まっていたのです。
対処法
以下のようにすることでちゃんと目的の要素を指定できました。
<section> <div class="top"> トップ1 </div> <div class="top"> トップ2 </div> </section> <section> <div class="bottom"> ボトム1 </div> <div class="bottom"> ボトム2 </div> </section>
CSS は次のように。
section div.bottom:nth-child(1){ color:#f00; }
div 要素をもう一つ大きな要素に内包させる事で nth-child で目的の要素を指定できました。
ここで前の記述を思い出してみると…。
<div class="top"> トップ1 </div> <div class="top"> トップ2 </div> <div class="bottom"> ボトム1 </div> <div class="bottom"> ボトム2 </div>
div.bottom:nth-child(1){ color:#f00; }
これではどれも文字に色が付く事はありませんでした。調べてみると nth-child は class は関係なく div の要素を数えるようです。ようするに、bottom クラスが付いた div 要素の1番目という物は存在しないという事になります。何故なら div 要素の1番目は「トップ1」が書かれた部分だからです。
「div.top:nth-child(1)」で「トップ1」の色が変わった理由は、「.top」を無くしても結局 div の1番目の要素が指定される為です。
外側に section 要素で囲った事で「div.bottom:nth-child(1)」は section 要素の div 要素の1番目という指定になるため色が変わるのです。ただ、「.bottom」のクラス名を無くすと「トップ1」と「ボトム1」の色が変わってしまうのでクラス名も一応意味はあるようです。