CSSカウンターとは
CSSカウンターは、Webページ内の要素に自動で連番を付けたり、階層的な番号付け(例: 1.、1.1.、1.1.1.)を行ったりするために使われる、CSSの機能です。 プログラミングでいう変数に似たもので、特定の要素が出現するたびにその値を増やしたり(インクリメント)、リセット(初期化)したりすることができます。 CSSカウンターは、HTMLに直接番号を書き込む手間を省き、文書構造と見た目の番号付けを分離できるため、特に長文のドキュメントやレポートなどで非常に便利です。
CSSカウンターを使うには、主に3つのステップと、それに対応するプロパティが必要です。
CSSカウンターの主要な構成要素
- リセット(初期化)
CSSプロパティ:counter-reset
カウンターをゼロに設定し、番号付けの開始点を定義します。通常、親要素やセクションの開始点に適用します。 - インクリメント(加算)
CSSプロパティ:counter-increment
特定の要素が出現するたびにカウンターの値を増やします。通常、番号を付けたい要素自体に適用します。 - 表示
CSSプロパティ:content と counter()/counters()
擬似要素 (::before または ::after) の中で counter() 関数や counters() 関数を使い、現在のカウンターの値を画面に表示します。
具体的な動作の例
例えば、「セクション内の見出しに自動で番号を付ける」場合、ロジックは以下のようになります。。
- 1. リセット(初期化):
- 親要素(例: <div class="section">)に counter-reset: my-item; を設定し、カウンターを 0 にリセット。
- 2. インクリメント(加算):
- 各見出し(例: <h2>)に counter-increment: my-item; を設定。
- 3. 表示:
- 見出しの擬似要素(例: h2::before)に content: counter(my-item) ". "; を設定し、「1. 」「2. 」「3. 」のように表示させる。
階層的なカウンター (counters() 関数):
章・節のような入れ子の番号付け(例: 1.2.3)をしたい場合は、counter() ではなく counters() 関数を使います。
これは、複数のカウンターの値を自動的に連結して表示してくれます。
CSSカウンターで番号付き3種
普通に番号を振るだけなら「ol」で十分ですが、 デザイン上自由に番号を制御したい場合や、見出し・段落に番号を付けたい場合に「カウンター + 擬似要素」を使います。 以下のセクションでは、この手法を使った「ぶら下げインデント」の番号付きや、階層番号など、3つの具体的な例を紹介していきます。
ぶら下げインデント
「ぶら下げインデント:番号付き」は、シンプルな番号付き見出し、手順解説(手順1、手順2…)、ブログや記事の小見出し番号などに向いています。
デモ
はじめに
準備
手順
まとめ
CSS
.section {
counter-reset: chapter; /* "chapter" カウンターを0に */
}
h2.hanging-indent {
counter-increment: chapter; /* カウンターを1増やす */
position: relative; /* 擬似要素の基準 */
padding-left: 3em; /* 本文の開始位置を右にずらす */
text-indent: 0; /* 1行目のインデントなし */
line-height: 1.4; /* 読みやすく */
}
h2.hanging-indent::before {
content: counter(chapter) "."; /* カウンター番号+ピリオド */
position: absolute;
left: 0; /* 左端に固定 */
top: 5px;
width: 2.5em; /* 番号スペース */
text-align: right; /* 数字の右端を本文の開始位置に揃える */
}
HTML
<div class="section">
<h2 class="hanging-indent">はじめに</h2>
<h2 class="hanging-indent">準備</h2>
<h2 class="hanging-indent">手順</h2>
<h2 class="hanging-indent">まとめ</h2>
</div>
解説
仕組み
- .section のたびに counter-reset: chapter; でカウンターをリセット
- h2.hanging-indent が呼ばれるたびに counter-increment: chapter
- ::before で「1.」「2.」のように 単一番号 を表示
特徴
- 単純な連番をつけるための最小構成
- 段落・見出しに番号を振る用途に適している
- ぶら下げインデント(ハンギングインデント)により、番号と本文の開始位置をきれいに揃えられる
短所
- 章番号・階層構造には対応できない
- 見出しが複数種類(h2, h3など)に増えると、拡張しづらい
- 同じページ内で複数の異なるカウンター管理をしたい場合には不向き
階層番号付き見出し
「ぶら下げインデント:章番号付き」は、書籍風のドキュメント(1-1、1-2、1-3…)、マニュアル、 長文の学習資料など、章と節の階層を明確に示したい場合や、「第1章」「第2章」などの章タイトルとセットで使うUIに向いています。
デモ
第1章
はじめに
準備
手順
第2章
まとめ
次のステップ
CSS
.section {
counter-reset: section; /* この章内の h2 番号をリセット */
counter-increment: chapter; /* 章番号を1増やす */
margin-bottom: 2em;
}
h2.hanging-indent {
counter-increment: section; /* h2番号を1増やす */
position: relative;
padding-left: 3em; /* 本文開始位置 */
text-indent: 0;
line-height: 1.4;
}
h2.hanging-indent::before {
content: counter(chapter) "-" counter(section) ". ";
position: absolute;
left: 0;
top: 0;
width: 2.5em;
text-align: right;
}
HTML
<div class="section">
<h1>第1章</h1>
<h2 class="hanging-indent">はじめに</h2>
<h2 class="hanging-indent">準備</h2>
<h2 class="hanging-indent">手順</h2>
</div>
<div class="section">
<h1>第2章</h1>
<h2 class="hanging-indent">まとめ</h2>
<h2 class="hanging-indent">次のステップ</h2>
</div>
解説
仕組み
.section が呼ばれるたびに- counter-reset: section; で 小番号(節番号)をリセット
- counter-increment: chapter; で 大番号(章番号)を増加
- h2.hanging-indent で小番号を増やす
- chapter-section → 1-1, 1-2, 1-3 …
特徴
- 階層構造(章 → 節)に強い
- 書籍のような番号付け
- セクションごとに小番号がリセットされる構造が自然
- h1(章)と h2(節)を組み合わせた階層的な情報設計に適している
短所
- カウンターが2段階になるため、単一の連番に比べ仕組みがやや複雑になる
- h3 を追加したい、もっと階層を深くしたいなどの場合コード量が増える
- セクションの構造が崩れると番号も狂いやすい
画像連番表示
「画像連番表示」は、 画像ギャラリー(PNG一覧、写真一覧)、おすすめ商品リスト、 カードUI(漫画のリスト、動画サムネイルなど)、Flexbox や Grid と組み合わせた番号付きレイアウトに向いています。
デモ
CSS
/* 1. Flexboxコンテナの設定 */
.png-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
justify-content: center; /* メイン軸(横方向)でアイテムを中央に集める */
align-items: flex-end; /* クロス軸(縦方向)。アイテムを下端に揃える */
}
/* 2. 各アイテム(PNG)のサイズ設定を修正 */
.png-item {
width: 250px;
text-align: center;
counter-increment: png-num;
position: relative;
margin-bottom: 2em;
}
/* 3. カウンターの表示 */
.png-item::after {
content: "動物 " counter(png-num);
display: block;
text-align: center;
margin-top: 0.5em;
color: #555;
}
HTML
<div class="png-container">
<div class="png-item">
<img src="animal-png-01.png" alt="1番目の動物のPNGアニメ">
</div>
<div class="png-item">
<img src="animal-png-02.png" alt="2番目の動物のPNGアニメ">
</div>
<div class="png-item">
<img src="animal-png-03.png" alt="3番目の動物のPNGアニメ">
</div>
<div class="png-item">
<img src="animal-png-04.png" alt="4番目の動物のPNGアニメ">
</div>
<div class="png-item">
<img src="animal-png-05.png" alt="5番目の動物のPNGアニメ">
</div>
</div>
解説
仕組み
- .png-container は flexbox レイアウト
- .png-item に counter-increment: png-num;
- 各画像の下に「動物 1」「動物 2」「動物 3」のように並ぶ
- Flexbox とカウンターを組み合わせて、カード状のリストに番号を付けるイメージ
特徴
- 表・ギャラリー・カードレイアウトなどの 並列レイアウトとの相性がよい
- 折り返しても番号は自然に進む
- 見出しではなく「要素そのもの(カード)」に番号を付けられる
- カウンターが要素に紐づくため、画像・商品カードなどでも利用可能
短所
- 要素が「途中で表示順が変わるCSS(Orderなど)」を使うと番号がズレたり混乱する
- 途中で要素構造を変更すると番号の連続性が乱れる
- 画面幅により折り返しが変わるため、「番号の見た目上の上下左右関係」が変わることもある
