本文へスキップ
  1. Web BENTO JS
  2. カテゴリ一覧
  3. カウント・タイマー
123
10 / COUNTER 12 パーツ

カウント・タイマーJS実装 12選

コピペで動く数字カウントアップ・タイマー系パーツのサンプル集です。プレビューは実際に動いています(カウント系はカードが見えた瞬間にスタート)。HTML / CSS / JS タブでコードを確認し、全部コピーを押せば1回の貼り付けで完成します。すべて依存ライブラリなしのバニラJSで、data-bnto-* 属性による自動初期化式です。

該当するパーツが見つかりませんでした。

0

累計制作実績

数値カウントアップ

<!-- data-to:目標値 / data-dur:所要ミリ秒 -->
<div class="bnto-cnt">
  <span class="num" data-bnto-count data-to="1280" data-dur="1600">0</span><span class="unit">件</span>
  <p class="lbl">累計制作実績</p>
</div>
使い方のコツ

目標値は data-to、所要時間は data-dur(ミリ秒)で個別に指定できます。「実績◯件」「満足度◯%」など、数字を並べるときは1〜2秒でサッと終わらせるのが心地よい目安です。プレビューをクリック(または ↺ ボタン)で再生し直せます。

累計会員数

0

カンマ区切りカウントアップ

<div class="bnto-cnt2">
  <p class="lbl">累計会員数</p>
  <span class="num" data-bnto-count-comma data-to="128540" data-dur="1800">0</span><span class="unit">人</span>
</div>
使い方のコツ

5桁以上の大きな数字はカンマがあるだけで段違いに読みやすくなります。金額表示にしたいときは toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' }) にすると「¥128,540」形式になります。プレビューをクリック(または ↺ ボタン)で再生し直せます。

0 00時間 00 00

カウントダウンタイマー

<!-- data-deadline:目標日時(YYYY-MM-DDTHH:MM:SS) -->
<div class="bnto-cd" data-bnto-countdown data-deadline="2026-12-31T23:59:59">
  <span class="seg"><b class="d">0</b><small>日</small></span>
  <span class="seg"><b class="h">00</b><small>時間</small></span>
  <span class="seg"><b class="m">00</b><small>分</small></span>
  <span class="seg"><b class="s">00</b><small>秒</small></span>
</div>
使い方のコツ

セール終了・イベント開始・受付締切などに使えます。期限を過ぎると 0 で停止して is-end クラスが付くので、CSSで「終了しました」の表示に切り替えられます。時刻は閲覧者の端末時計基準になる点だけ注意してください。

お手伝いできること

タイプライター

<!-- data-words:カンマ区切りで複数フレーズ -->
<p class="bnto-type" data-bnto-type data-words="Webサイト制作,バナーデザイン,ロゴ・ブランディング">
  <span class="pre">お手伝いできること</span>
  <span class="tx"></span><span class="cur" aria-hidden="true"></span>
</p>
使い方のコツ

data-words はカンマ区切りで何個でも追加OKです。タイプ速度は setTimeout の 110(表示)/ 45(削除)ミリ秒を調整します。SEO的に重要なキーワードはタイプ演出の外(見出し等)にも静的テキストで置いておくのが安心です。

0%

顧客満足度

円形プログレス

<!-- data-to:0〜100 のパーセント -->
<div class="bnto-ring" data-bnto-ring data-to="82">
  <div class="ring"><span class="val"><b class="pct">0</b><small>%</small></span></div>
  <p class="lbl">顧客満足度</p>
</div>
使い方のコツ

スキルレベル・達成率・満足度の表示に向いています。ゲージの太さは ::beforeinset で調整できます(値を大きくすると細いリングに)。3つ横に並べるだけで「数字で語るセクション」が完成します。

00:00.00

ストップウォッチ

<div class="bnto-sw" data-bnto-stopwatch>
  <div class="time">00:00.00</div>
  <div class="btns">
    <button type="button" class="bt-start">開始</button>
    <button type="button" class="bt-stop">停止</button>
    <button type="button" class="bt-reset">リセット</button>
  </div>
</div>
使い方のコツ

表示は「分:秒.1/100秒」形式です。performance.now() の差分で計算しているので、描画が多少もたついても計測値はズレません。停止→開始で続きから再開できます(ラップ計測風の使い方もOK)。

サイト開設から0

経過日数カウンター

<!-- data-from:起点の日付(YYYY-MM-DD) -->
<p class="bnto-days" data-bnto-days data-from="2020-04-01">
  サイト開設から<span class="num">0</span>日
</p>
使い方のコツ

「創業から◯日」「無事故継続◯日」「記念日から◯日」などに使えます。手動更新が不要なのがポイントです。当日を「1日目」と数えたい場合は days+ 1 してください。

累計ダウンロード

数字ロール(オドメーター風)

<!-- data-to:目標の数字。カンマもそのまま表示される -->
<div class="bnto-roll">
  <span class="digits" data-bnto-roll data-to="2,489"></span><span class="unit">回</span>
  <p class="lbl">累計ダウンロード</p>
</div>
使い方のコツ

アニメーションはCSSの transform だけなので軽量です。ロール速度は --dur、桁ごとの時間差はJSの 120(ミリ秒)で調整します。data-to="2,489" のようにカンマ入りで書けばそのまま区切り表示されます。プレビューをクリック(または ↺ ボタン)で再生し直せます。

判定中…

営業時間 10:00〜19:00(平日)

営業中/営業時間外の自動表示

<!-- data-open / data-close:営業時間、data-days:営業曜日(0=日曜〜6=土曜) -->
<div class="bnto-open" data-bnto-open data-open="10:00" data-close="19:00" data-days="1,2,3,4,5">
  <span class="badge" aria-live="polite">判定中…</span>
  <p class="lbl">営業時間 10:00〜19:00(平日)</p>
</div>
使い方のコツ

営業日は data-days に 0=日曜〜6=土曜 の番号をカンマ区切りで指定します(表示は毎分自動更新)。判定は閲覧者の端末(クライアント)時刻基準のため、祝日・臨時休業には対応せず、厳密な営業制御には向きません。店舗サイトの「いま営業中?」の目安表示として使ってください。

----年--月--日(-)

--:--:--

リアルタイム時計

<div class="bnto-clock" data-bnto-clock>
  <p class="date">----年--月--日(-)</p>
  <div class="time">--:--:--</div>
</div>
使い方のコツ

次の更新を 1000 - Date.now() % 1000 ミリ秒後に予約しているので、秒の切り替わりにピタッと同期します。時刻だけにしたい場合は .date の行を削除してOKです。受付ページやデジタルサイネージ風の画面のほか、営業中バッジと並べると「いま何時で、いま営業中か」が一目で伝わります。表示は閲覧者の端末時計基準です。

この記事は約1分で読めます

ここが本文エリアです。data-target で指定した要素の文字数を数え、1分あたりの文字数(data-cpm)で割って読了時間を計算します。空白や改行は文字数に含めません。実際の記事ページでは、本文を囲む要素の id を指定してください。

読了時間の自動計算

<!-- data-target:本文のセレクタ / data-cpm:1分あたりの文字数 -->
<div class="bnto-rt">
  <p class="badge" data-bnto-readtime data-target="#post-body" data-cpm="500">この記事は約<b class="min">1</b>分で読めます</p>
  <div class="art" id="post-body">ここに記事の本文が入ります。</div>
</div>
使い方のコツ

日本語の読了速度は1分あたり400〜600文字が目安で、data-cpm で調整できます(じっくり読ませる技術記事なら小さめに)。文字数は textContent ベースの概算なので、見出しやキャプションも含まれます。バッジを複数設置して data-target をそれぞれ変えれば、記事一覧の各カードにも使えます。

1回目のご訪問です

はじめまして!

訪問回数カウンター

<!-- data-key:localStorage の保存キー(サイト内で固有に) -->
<div class="bnto-visit" data-bnto-visitcount data-key="bnto-visit-demo">
  <p class="msg" aria-live="polite"><b class="num">1</b>回目のご訪問です</p>
  <p class="lbl">はじめまして!</p>
  <button type="button" class="bt-reset">リセット(デモ用)</button>
</div>
使い方のコツ

回数は localStorage に保存されるため、ブラウザ・端末ごとのカウントです。アクセス解析ではなく「おかえりなさい」演出として使ってください。保存キーは data-key で変更でき、ページごとに別のキーにすれば個別カウントも可能です。リセットボタンはデモ用なので、本番では .bt-reset の行ごと削除してOKです。

カウントアップ・タイマーJSの基礎知識

数字のカウントアップやカウントダウンは、実績や緊急性を「動き」で伝える定番の演出です。止まった「導入実績1,280件」より、0からスルスルと増えて1,280で止まる数字のほうが視線を集め、記憶に残ります。このページのサンプルはすべて依存ライブラリなしのバニラJavaScriptで、jQueryもカウントアップ専用プラグインも不要です。

使い方は、HTML / CSS / JSの3タブをそれぞれ貼り付けるか、「全部コピー」ボタンでひとまとめになったコードを1回貼り付けるだけです。目標値や日時は data-to / data-deadline / data-from などの属性で指定します。初期化は data-bnto-* 属性の自動検出式なので、同じページに何個置いても、うっかりコードを2回貼っても壊れません。

実績数字は「動く」と説得力が増す

採用サイトの「社員数」、コーポレートサイトの「取引社数」、LPの「導入実績」。数字はそのままでも強いコンテンツですが、カウントアップさせるとアイキャッチ効果が加わり、スクロールの手が止まります。コツは1〜2秒でサッと終わらせることと、easeOut(終盤で減速)を使うことです。最後にゆっくり目標値へ吸い付く動きが「確定した実績」の印象を作ります。ダラダラ長いカウントは逆効果です。

requestAnimationFrame と setInterval の使い分け

毎フレーム数字を描き換えるカウントアップには requestAnimationFrame が最適です。画面の描画タイミングと同期して呼ばれるためカクつきが少なく、非表示タブでは自動停止するのでバッテリーにも優しい仕組みです。一方、1秒に1回の更新で十分なカウントダウン時計や時刻表示に毎フレーム処理は過剰なので、setTimeout / setInterval で足ります。またアニメーションの進捗は「経過時間 ÷ 所要時間」で計算するのが鉄則です。フレームごとの加算では、端末の性能によって速さが変わってしまいます。

IntersectionObserver で「見えてから」動かす

カウントアップをページ読み込みと同時に始めると、ユーザーがスクロールして到達したときにはすでに動き終わっているという残念な事故が起きます。IntersectionObserver で要素が画面に入った瞬間を検知してから開始すれば、必ず「動いているところ」を見てもらえます。スクロール量を毎回計算する古い方法と違い、監視はブラウザ任せなので負荷もほぼゼロです。一度動かしたら disconnect() して再発火を防ぐのがお約束です。

「全部コピー」と「分けて貼る」の使い分け

「全部コピー」を使うと、HTML・CSS・JavaScriptがひとつの自己完結ブロックとしてコピーされるので、1回の貼り付けだけですぐ動きを確認できます。動作のお試しや、1ページ完結のLPに組み込むときはこの方法が手軽です。

一方、本番サイトへ本格的に組み込む場合は、CSSはスタイルシート(.cssファイル)へ、JavaScriptは</body>直前や共通の.jsファイルへ、HTMLは使いたい場所へと分けて貼るのが一般的です。スタイルとスクリプトを1か所に集約できるため、複数ページ・複数パーツで使い回すときの管理がしやすく、ブラウザのキャッシュも効きやすくなります。なお、同じパーツをページ内で何度も使う場合でも、CSSとJSを貼るのは1回だけで大丈夫です(初期化スクリプトが該当要素すべてに自動で効きます)。

よくある質問

カウントアップはいつ始まりますか?
IntersectionObserver でパーツが画面に入ったタイミングで一度だけ始まります。ページ読み込み直後に画面外でこっそり終わってしまう心配がありません。開始位置は threshold(しきい値)で調整できます。
setInterval ではなく requestAnimationFrame を使う理由は?
requestAnimationFrame は画面の描画タイミングと同期して呼ばれるため、カクつきの少ないなめらかなアニメーションになります。非表示タブでは自動的に止まるので無駄な処理も発生しません。1秒刻みで十分なカウントダウン時計には setTimeout を使っています。
カウントダウンの目標日時はどう指定しますか?
data-deadline 属性に「2026-12-31T23:59:59」のような形式で指定します。期限を過ぎると 0 で停止し、is-end クラスが付与されるので「終了しました」表示への切り替えも簡単です。
同じページに複数設置しても大丈夫ですか?
大丈夫です。初期化スクリプトは data 属性で対象を自動検出し、初期化済みの要素はスキップするため、複数設置してもコードを2回貼っても壊れません。
このページのパーツはAIコーディングツールでも使えますか?
はい。Claude CodeやCursorのようにWebページを読めるAIには、このページのURLとパーツ名(例:「カンマ区切りカウントアップ」)を伝えるだけで実装を指示できます。AIがWebを読めない場合は、「全部コピー」で取得した自己完結ブロックをチャットに貼り付けて調整を頼むのが確実です。改変後のコードは、公開前に動作確認することをおすすめします。

関連カテゴリ

カウント・タイマーと組み合わせて使いやすいパーツはこちらです。