こんにちは、けいすけです。
olタグは、リストアイテムに対して順番に番号を付与する機能をもっていますよね。
しかし、olタグの機能を利用したとき、入れ子にしても1.1, 1.2, 1.3…というようにはなりません。
今回は、CSSを使って入れ子になった目次などのリストに、自動で順番に番号を付与する方法について紹介します。
目次 [表示する]
ソース上で入れ子になっている場合
番号を順番に付与するためには、擬似要素のcontent
プロパティにcounters()
という関数を使用します。
実装方法は、次のようになります。
HTML
<ol>
<li>リスト</li>
<li>リスト</li>
<li>リスト
<ol>
<li>リスト</li>
<li>リスト</li>
<li>リスト</li>
<li>リスト</li>
<li>リスト</li>
</ol>
</li>
<li>リスト</li>
<li>リスト</li>
</ol>
CSS
ol {
counter-reset: cnt;
list-style: none
;
}
ol li::before {
counter-increment: cnt;
content: counters(cnt, ".") ". ";
}
ポイントは次の通り
- counter-resetで変数を定義(0が代入されます。)
- counter-incrementをつかって、counter-resetで定義した変数に+1
- 入れ子になったolタグに再度counter-resetを用いて同じ変数名に0を代入
親要素にcounter-reset
で0を定義していないと、子要素で順番に番号を増やしていくことができません。
上記の場合は、liタグの擬似要素にcounter-increment
を記載しているので、ソース上にあるliタグの数だけcounter-reset
で定義した変数に+1されます。
入れ子になったolタグで、再度counter-reset
で同じ変数名に0を代入することで、counters()
関数は、第二引数を区切りの文字列として扱い、親要素のカウンタを保持したまま入れ子になったリストに対して順番に番号を付与することができます。
以下、表示イメージ
ソース上で入れ子になっていない場合
counter-increment
で増やしたカウンタは、counter-reset
で変数を定義した親要素の外では、リセットされてしまいます。
そのため、ソース上で入れ子になっていない要素については、counters()
関数を使って、親要素のカウンタを保持したまま入れ子になったリストに対して、順番に番号を付与することができません。
たとえば、見出しとして使われる、h3タグは、h2タグの子要素として扱われることはないでしょう。
このような場合に対して順番に番号を付与するときは、counter()
という関数を使用します。
実装方法は、次のようになります。
HTML
<main>
<section>
<h2>タイトル</h2>
<h3>小タイトル</h3>
<h3>小タイトル</h3>
</section>
<section>
<h2>タイトル</h2>
<h3>小タイトル</h3>
<h3>小タイトル</h3>
<h3>小タイトル</h3>
</section>
<section>
<h2>タイトル</h2>
<h3>小タイトル</h3>
<h3>小タイトル</h3>
</section>
</main>
CSS
main {
counter-reset: title;
}
section {
counter-reset: section;
}
h2::before {
counter-increment: title;
content:"第" counter(title) "章 ";
}
h3::before {
counter-increment: section;
content:"第" counter(title) "." counter(section) "節 ";
}
counter-increment
でカウンタを増やしたい範囲について考え、対象となる親要素にcounter-reset
で変数を定義します。上記の場合は、title
はmainタグ、section
はsectionタグです。
入れ子に対する番号の付与については、counter()
関数を2つ使用して実装しています。
以下、表示イメージ
まとめ
自動で番号を付与できるようになれば、あれ?2章から4章に飛んでる!?最初から番号を振り直しだ!みたいなことが起きなくなります。
また、擬似要素を使っているので、list-style
で表示した番号と違い、番号のみへのフォントなどの編集が可能です。