CSSで2階層にカウンター設置

概要:箇条書き等の2階層リスト表(Pタグ)に各階層の行頭に自動的に連番を設定するCSSカウンタの事例です。

事例紹介

第1階層 1行目

第2階層 1行目

第2階層 2行目

第1階層 2行目

第2階層 1行目

第2階層 2行目

第2階層 3行目

第1階層 3行目

第2階層 1行目

第2階層 2行目

第2階層 3行目

第2階層 4行目

<div class="kn_two_layers">
  <p>第1階層 1行目</p>
  <div>
    <p>第2階層 1行目</p>
    <p>第2階層 2行目</p>
  </div>
  <p>第1階層 2行目</p>
  <div>
    <p>第2階層 1行目</p>
    <p>第2階層 2行目</p>
    <p>第2階層 3行目</p>
  </div>
  <p>第1階層 3行目</p>
  <div>
    <p>第2階層 1行目</p>
    <p>第2階層 2行目</p>
    <p>第2階層 3行目</p>
    <p>第2階層 4行目</p>
  </div>
</div>
 

事例のCSS

    /* 2階層表示 */
.kn_two_layers div{margin-left:30px;}
.kn_two_layers p{padding-left:2em; text-indent:-2em;}

/* ===== Pタグ カウンタ 第一階層 ===== */
.kn_two_layers{                       /* カウンタ設置 */
  counter-reset:ctr 0;                   /* 名前付、初期値 */
}
.kn_two_layers p:nth-of-type(n+1){    /* pの最初から最後迄 */
  counter-increment:ctr;                 /* カウンタに+1 */
}
.kn_two_layers p:nth-of-type(n+1)::before{   /* カウンタ値の表示 */
  content:counter(ctr)" .";
}

/* ===== Pタグ カウンタ 第二階層 ===== */
.kn_two_layers > div{
  counter-reset:ctr_2 0;
}
.kn_two_layers > div > p:nth-of-type(n+1){
  counter-increment:ctr_2;
}
.kn_two_layers > div > p:nth-of-type(n+1)::before{
  content:counter(ctr_2)" )";
}

 

CSS説明・第2階層カウンタの設置。

2階層目の表示位置の設定

.kn_two_layers > div{margin-left:30px;}
第二階層の表示位置を第一階層より、右に30px空けて表示。

.kn_two_layers p{padding-left:2em; text-indent:-2em;}
テキストの折り返し(自動改行)の行頭を2emづらし見やすく。

カウンタ:設置・加算・表示

.kn_two_layers > div{counter-reset:ctr_2 0;}
ボックス直下の「div」にカウンタ設置とその名前付け「ctr_2」(任意)と初期値設定。初期値はデフォルト「0」で、この場合は記述しなくても可。「div」の前の「 >」は重要。

kn_two_layers > div > p:nth-of-type(n+1){counter-increment:ctr_2;}
ボックス直下の「div」の直下の「p」に最初から最後まで+1。加算値はデフォルト「1」で、変えたい場合はカウンタ名の後に半角スペースを入れて数値を記述。

.kn_two_layers > div > p:nth-of-type(n+1)::before{content:counter(ctr_2)" )";}
ボックス直下の「div」の直下の「p」の「先頭」に最初から最後までカウンタ値表示。

補助説明

疑似クラス「p:」は、リンクの「a:」やマウスホバー「a:hover」と同類で「p:」で連続する「p」にCSSを適用出来て、以下の様な使い方があります。
・「fist-child」、nth-child(2)、nth-child(n+1)1,last-child など
・「fist-of-type、nth-of-type(2)、nth-of-type(n+1)、last-of-type
pセレクタの他によく使う「div」・「ul」&「li」・「ol」&「li」、「dl」&「dt」&「dd」など。

疑似要素「::before」は、他に「::after」、「::first-letter」、「first-line」等があります。
「::before」は、指定されたセレクタ内容の前にcss要素を適用します。

セレクタの直下「>」とは、この事例のHTMLで見ると「pセレクタ」は第一階層と第二階層にもあります。直下の「>」がないと、全ての「p」に適用されてしまいます。