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になると完全にセピア色になります。


まとめ:text-overflow プロパティを使いこなして、見やすく機能的なWebサイトを作ろう!

text-overflow プロパティは、要素内に収まりきらなかったテキストをどのように表示するかを制御します。これは、長いタイトルや文章を扱う際に、見やすくするために役立ちます。値:ellipsis: 省略記号(…)を表示します。これがデフォルト値です。


疑似要素 before と afterを使いこなせ! CSS Miscellaneous 入門

::before と ::afterこれらの疑似要素は、要素の 前 と 後 にコンテンツを挿入するために使用されます。例:ボタンの後にチェックマークを追加する見出しの前に装飾的な罫線を挿入する::markerこの疑似要素は、リスト項目のマーカーのスタイルを変更するために使用されます。


CSSコンポジティングとブレンド:画像を重ねて表現を豊かに

コンポジティング:レイヤーの重ね合わせコンポジティングは、複数のレイヤーを重ねることで、奥行きや陰影などの効果を生み出す技術です。Photoshopなどの画像編集ソフトでいう「レイヤー」と似ていますが、CSSでは要素をレイヤーとして扱い、それぞれに位置や透明度などの設定を施せます。



アニメーションも自由自在!CSS transform rotate3d() で表現の幅を広げる

rotate3d() 関数は、要素を 3D 空間で回転させるための CSS transform プロパティの一部です。この関数は、X 軸、Y 軸、および Z 軸のいずれかを中心に要素を回転させることができます。構文:引数:x: X 軸を中心に回転させる角度を度数で指定します。正の値は時計回りの回転、負の値は反時計回りの回転を表します。


Webkit Extensionsで文字に縁取りを設定する:-webkit-text-stroke-color

-webkit-text-stroke-color プロパティには、以下の値を設定できます。カラー名: red、blue、green などRGB 値: rgb(255, 0, 0)RGBA 値: rgba(255, 0, 0, 0.5)HEX 値: #ff0000


CSS Selectors の :valid 疑似クラス:フォーム入力欄の検証を簡単に行う

主な用途:入力値が正しくフォーマットされているかどうかを確認する必須項目に入力がないかどうかをチェックする入力値に基づいて、エラーメッセージやヒントを表示する使い方::valid 疑似クラスは、フォーム要素のセレクターと組み合わせて使用します。例えば、以下のように記述します。


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

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


ユーザーの閲覧履歴に基づいてリンクにスタイルを適用する

上記の例では、すべての訪問済みリンクの色が赤色になります。:visited セレクターには、いくつかの注意点があります。プライバシーの制限ユーザーの閲覧履歴を保護するため、:visited セレクターは一部のスタイルプロパティに制限があります。具体的には、以下のプロパティは使用できません。