counter-increment vs JavaScript:連番・カウントアップの最適解は?

2024-04-02

CSS Miscellaneous: counter-increment を使って連番やカウントアップを実現

仕組み

  • カウンターは名前付きの変数のようなもので、各要素に個別に値を割り当てることができます。
  • counter-increment を使って、要素ごとにカウンターの値を増加させます。
  • カウンターの値は、content プロパティを使ってコンテンツとして表示することができます。

基本的な使い方

  1. カウンターの名前を定義します。
  2. カウンターの初期値を設定します。
  3. 要素に counter-increment プロパティを適用し、増加する値を指定します。
  4. カウンターの値を表示したい要素に、content プロパティを使ってカウンターの名前を指定します。

<ol>
  <li>項目1</li>
  <li>項目2</li>
  <li>項目3</li>
</ol>
ol {
  counter-reset: item 1; /* カウンターの名前と初期値を定義 */
}

li {
  counter-increment: item; /* カウンターを1ずつ増加 */
}

li::before {
  content: "項目" counter(item) " "; /* カウンターの値を表示 */
}

結果

項目1
項目2
項目3

応用例

  • 見出しに連番をつける
  • リスト項目に連番をつける
  • ページビューのカウント
  • 投票数の表示

補足

  • counter-increment は、要素ごとに個別にカウンターを管理します。
  • カウンターの値は、セッション中に保持されます。
  • カウンターの値をリセットするには、counter-reset プロパティを使用します。
  • counter-increment は、複雑なカウントアップ処理にも使用できます。
  • 詳細については、上記の参考資料を参照してください。


いろいろなサンプルコード

<h1>見出し1</h1>
<h2>見出し2</h2>
<h3>見出し3</h3>
h1, h2, h3 {
  counter-reset: section; /* 各見出しレベルでカウンターをリセット */
}

h1::before {
  content: "第" counter(section) "章 ";
}

h2::before {
  content: counter(section, upper-roman) ". ";
}

h3::before {
  content: counter(section, lower-alpha) ". ";
}

結果

第1章 見出し1
第1章.1 見出し2
第1章.1.1 見出し3

リスト項目に連番をつける

<ul>
  <li>項目1</li>
  <li>項目2</li>
  <li>項目3</li>
</ul>
ul {
  list-style: none;
  counter-reset: item; /* カウンターの名前と初期値を定義 */
}

li {
  counter-increment: item; /* カウンターを1ずつ増加 */
}

li::before {
  content: counter(item, disc) " "; /* カウンターの値を表示 */
}

結果

● 項目1 ● 項目2 ● 項目3

ページビューのカウント

<p id="page-view">ページビュー: 0</p>
#page-view {
  counter-reset: page-view 0; /* カウンターの名前と初期値を定義 */
}

#page-view::after {
  content: " (" counter(page-view) ") "; /* カウンターの値を表示 */
}

/* JavaScript */
function incrementPageView() {
  const pageViewElement = document.getElementById("page-view");
  const counter = parseInt(pageViewElement.textContent.match(/\d+/)[0]);
  pageViewElement.textContent = `ページビュー: ${counter + 1}`;
}

// ページ読み込み時にカウンターを1増加
incrementPageView();

// ページ閲覧のたびにカウンターを1増加
window.addEventListener("scroll", incrementPageView);

結果

ページビュー: 1 (2)

投票数の表示

<button id="vote-button">投票する</button>
<p id="vote-count">投票数: 0</p>
#vote-count {
  counter-reset: vote-count 0; /* カウンターの名前と初期値を定義 */
}

#vote-count::after {
  content: " (" counter(vote-count) ") "; /* カウンターの値を表示 */
}

/* JavaScript */
const voteButton = document.getElementById("vote-button");
const voteCountElement = document.getElementById("vote-count");

voteButton.addEventListener("click", () => {
  const counter = parseInt(voteCountElement.textContent.match(/\d+/)[0]);
  voteCountElement.textContent = `投票数: ${counter + 1}`;
});

結果

投票数: 0 (1)



counter-increment 以外の方法

JavaScript を使って、要素ごとに連番やカウントアップを制御することができます。

<ul>
  <li>項目1</li>
  <li>項目2</li>
  <li>項目3</li>
</ul>
const listItems = document.querySelectorAll("ul li");

for (let i = 0; i < listItems.length; i++) {
  listItems[i].textContent = `${i + 1}. ${listItems[i].textContent}`;
}

結果

  1. 項目1
  2. 項目2
  3. 項目3

サーバサイドで連番やカウントアップ処理を行い、HTML に反映する方法もあります。

<?php
$items = ["項目1", "項目2", "項目3"];

for ($i = 0; $i < count($items); $i++) {
  echo "<li>" . ($i + 1) . ". " . $items[$i] . "</li>";
}
?>

結果

画像を使う

連番やカウントアップを表す画像を用意し、HTML に表示する方法もあります。

<ul>
  <li><img src="images/1.png" alt="1"></li>
  <li><img src="images/2.png" alt="2"></li>
  <li><img src="images/3.png" alt="3"></li>
</ul>

CSS counters の代替ライブラリ

count-up.js などの CSS counters の代替ライブラリを使用する方法もあります。

それぞれの方法のメリットとデメリット

方法メリットデメリット
counter-incrementシンプルで使いやすいJavaScript の知識が必要
JavaScript柔軟に制御できる複雑な処理になるとコード量が増える
サーバサイド処理ページ読み込み時に処理が完了するため、パフォーマンスが良いサーバ側の設定が必要
画像見た目が分かりやすい画像ファイルの管理が必要
CSS counters の代替ライブラリ簡単に使えるライブラリの導入が必要



ゲーム理論:ビジネス、政治、日常生活に潜む戦略的思考

ゲーム理論の基本的な要素は以下の3つです。プレイヤー: 意思決定を行う主体戦略: プレイヤーが選択できる行動の選択肢利得: プレイヤーが各戦略を選択したときの得られる利益ゲーム理論は、これらの要素を数学的なモデルを用いて分析することで、プレイヤーがどのような戦略を選択するのか、どのような結果になるのかを予測することができます。



CSSでセピア色の世界へようこそ!画像や要素をレトロに変身させる魔法の方法

CSSの「Filter Effects」機能の一つである「sepia()」は、画像や要素をモノクロ化し、茶褐色(セピア色)のトーンを適用する関数です。古い写真のようなレトロな雰囲気を演出したい場合などに効果的に使用できます。構文n は、セピア色の強さを表す数値です。0.0の場合は元の画像の色合いが維持され、1.0になると完全にセピア色になります。


CSS Grid Layoutにおける grid-column プロパティ:詳細ガイド

grid-columnプロパティは、CSS Grid Layoutにおいて、グリッド内の要素の列位置を指定するために使用されます。このプロパティは、単一の要素の配置だけでなく、複雑なレイアウトを構築するための強力なツールとなります。基本的な使い方


CSSレイアウトの達人になる:z-indexとスタックコンテキストを使いこなすためのチュートリアル

この例では、z-indexとスタックコンテキストの概念を理解するために、複数の要素を重ねて配置する方法について説明します。z-indexは、要素の重なり順を制御するプロパティです。スタックコンテキストは、z-indexが適用される範囲を決定します。


CSS Miscellaneous と mod プログラミング:Web デザインの可能性を広げる

mod プログラミングは、既存のコードを修正・拡張することで、新しい機能や動作を追加するプログラミング手法です。CSS にも適用できます。既存の CSS フレームワークやライブラリに依存せずに、自由度の高いカスタマイズが可能コード量を削減し、軽量で効率的な CSS を構築できる



padding-bottom プロパティを使いこなして、Webデザインをレベルアップ

このプロパティを使用する利点:要素の内容と境界線を明確に区別できます。要素内のテキストや画像を整列できます。要素間の余白を調整して、読みやすいレイアウトを作成できます。padding-bottom プロパティの構文は以下の通りです。<length> は、ピクセル (px) やセンチメートル (cm) などの単位で指定できます。<percentage> は、要素の幅に対する割合で指定できます。inherit は、親要素の padding-bottom プロパティの値を継承します。


すべてのユーザーに優しいWebサイト:グリッドレイアウトとアクセシビリティ

CSSグリッドレイアウトは、Webページのレイアウトを構築する強力なツールですが、アクセシビリティを考慮せずに使用すると、一部のユーザーにとって問題が発生する可能性があります。このガイドでは、CSSグリッドレイアウトとアクセシビリティの関係について解説し、アクセシビリティを向上させるためのベストプラクティスを紹介します。


CSS Miscellaneous image.paint で画像をペイントツールのように操る

主な機能:画像の描画方法を指定: fill, stroke, marker など画像のサイズと位置を調整: scale, translate, rotate など画像の一部を切り取る: clip画像をぼかしたり、影をつけたりする: filter


【上級者向け】CSS overflow-x プロパティを使いこなして、高度なレイアウトを実現しよう

テキストボックス画像flexbox レイアウトgrid レイアウトoverflow-x の値は以下のとおりです。visible (デフォルト): コンテンツがボックスの幅を超えてもスクロールバーを表示せず、コンテンツを隠します。hidden : コンテンツがボックスの幅を超えてもスクロールバーを表示せず、コンテンツを切り取ります。


CSSボックス配置:使いこなして見やすく整ったレイアウトを作成しよう

1 align-content プロパティalign-content プロパティは、テーブル内の列の垂直方向の配置を制御します。以下の値を設定できます。flex-start:列をテーブルの上部に配置します。flex-end:列をテーブルの下部に配置します。