プログレスバー(容量・残量表示)

表示・インジケーター 初級

このコンポーネントについて

容量・残量を表示するプログレスバーは、通常の「処理中の進捗バー」とは用途が異なります。ファイル保存容量・APIコール数・プランのシート数など「上限の決まっているリソース」の現在値を把握させることが目的で、使用量・残量・上限・割合をまとめて表示するのが特徴です(usage meter / capacity bar とも呼ばれます)。

SaaSのプラン確認画面・管理パネル・ダッシュボードでよく見かけるパターンです。単にバーを表示するだけでなく、閾値を超えると色で警告する仕組みを加えることで、ユーザーが「残りどれくらい使えるか」を直感的に判断できます。

  • 使用量・残量・上限・割合の同時表示 — 「3.2 GB 使用中 / 残り 1.8 GB / 5.0 GB / 64%」のように、判断に必要な情報をすべて並べる。片方だけ見せるより親切
  • 閾値による3段階の色変化 — 74%以下は青(通常)、75〜89%は黄(警告)、90%以上は赤(危険)でリソース逼迫を視覚的に伝える
  • スライダーでリアルタイム確認 — デモ用スライダーで使用量を動かすと、バー・数値・色が即時反映される。閾値の色変化を実際に試して確認できる

実装のポイント・注意点

色変化は .usage-meter ルート要素に .is-warning / .is-danger クラスを付け外しし、子孫セレクタ(.is-warning .usage-meter-bar)でCSS制御します。JS側で複数要素を個別に操作せず、1箇所のクラス変更だけでバーとパーセント表示の色が連動します。

バーのラッパーに role="meter"aria-valuenowaria-valueminaria-valuemax を設定することで、スクリーンリーダーがリソース使用量を正しく読み上げます。値が変わるたびに aria-valuenow を更新してください。

スライダーはデモ確認用です。実際に使う場合はスライダー部分(.usage-slider-wrap)を削除し、バックエンドから取得した実際の使用量を updateMeter(使用量) に渡すだけで動作します。

HTML・CSS・バニラJavaScriptのみで実装しており、フレームワーク不要でコピペすぐに動きます。

デモ

ストレージ 64%
3.2 GB 使用中 残り 1.8 GB / 5.0 GB

サンプルソース

3つのファイルを同じフォルダに保存し、index.html をブラウザで開くとすぐに動作確認できます。
ファイル名:index.html / style.css / script.js — 保存時の文字コードは UTF-8 を指定してください(Shift-JISだと日本語が文字化けします)。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>使用量メーター サンプル</title>
  <link rel="stylesheet" href="./style.css">
</head>
<body>

<div class="usage-meter">
  <div class="usage-meter-header">
    <span class="usage-meter-label">
      <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24"
           fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
           stroke-linejoin="round" aria-hidden="true">
        <ellipse cx="12" cy="5" rx="9" ry="3"/>
        <path d="M3 5v14c0 1.66 4.03 3 9 3s9-1.34 9-3V5"/>
        <path d="M3 12c0 1.66 4.03 3 9 3s9-1.34 9-3"/>
      </svg>
      ストレージ
    </span>
    <span class="usage-meter-percent" id="usagePercent">64%</span>
  </div>
  <div class="usage-meter-bar-wrap" role="meter" aria-valuenow="64" aria-valuemin="0"
       aria-valuemax="100" aria-label="ストレージ使用量 64%">
    <div class="usage-meter-bar" id="usageBar" style="width: 64%"></div>
  </div>
  <div class="usage-meter-detail">
    <span class="usage-meter-used" id="usageUsed">3.2 GB 使用中</span>
    <span class="usage-meter-remain" id="usageRemain">残り 1.8 GB / 5.0 GB</span>
  </div>
</div>

<!-- デモ用スライダー(不要な場合は削除してください)-->
<div class="usage-slider-wrap">
  <label class="usage-slider-label" for="usageSlider">
    使用量を変えてみる:<span id="sliderVal">3.2</span> GB
  </label>
  <input type="range" id="usageSlider" class="usage-slider"
         min="0" max="5" step="0.1" value="3.2">
</div>

<script src="./script.js"></script>
</body>
</html>
/* ===== CSS変数(色の調整はここで)===== */
:root {
  --um-color-normal:  #2B7FE8;  /* 青:0〜74% */
  --um-color-warning: #F59E0B;  /* 黄:75〜89% */
  --um-color-danger:  #EF4444;  /* 赤:90%以上 */
  --um-track-bg:      #E8EDF2;
  --um-text:          #1A2332;
  --um-text-muted:    #5A6A7A;
}

*, *::before, *::after { box-sizing: border-box; }
body { font-family: sans-serif; padding: 32px 24px; background: #F4F6F9; }

/* ===== 使用量メーター ===== */
.usage-meter {
  background: #fff;
  border-radius: 10px;
  padding: 20px 24px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
  border: 1px solid #E8EDF2;
  max-width: 440px;
}

.usage-meter-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 12px;
}

.usage-meter-label {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 14px;
  font-weight: 600;
  color: var(--um-text);
}

.usage-meter-percent {
  font-size: 15px;
  font-weight: 700;
  color: var(--um-color-normal);
  transition: color 0.2s ease;
}

.usage-meter-bar-wrap {
  height: 8px;
  background: var(--um-track-bg);
  border-radius: 99px;
  overflow: hidden;
  margin-bottom: 10px;
}

.usage-meter-bar {
  height: 100%;
  background: var(--um-color-normal);
  border-radius: 99px;
  transition: width 0.2s ease, background 0.2s ease;
}

.usage-meter-detail {
  display: flex;
  justify-content: space-between;
  font-size: 13px;
  color: var(--um-text-muted);
}

/* 警告状態(75〜89%) */
.usage-meter.is-warning .usage-meter-bar     { background: var(--um-color-warning); }
.usage-meter.is-warning .usage-meter-percent { color: var(--um-color-warning); }

/* 危険状態(90%以上) */
.usage-meter.is-danger .usage-meter-bar     { background: var(--um-color-danger); }
.usage-meter.is-danger .usage-meter-percent { color: var(--um-color-danger); }

/* ===== デモ用スライダー ===== */
.usage-slider-wrap {
  margin-top: 20px;
  max-width: 440px;
}

.usage-slider-label {
  display: block;
  font-size: 13px;
  color: var(--um-text-muted);
  margin-bottom: 8px;
}

.usage-slider {
  width: 100%;
  cursor: pointer;
}
var TOTAL_GB          = 5.0;  // 上限容量(GB)
var INIT_GB           = 3.2;  // 初期使用量(GB)
var THRESHOLD_WARNING = 75;   // 警告閾値(%)
var THRESHOLD_DANGER  = 90;   // 危険閾値(%)

var meterEl     = document.querySelector('.usage-meter');
var barEl       = document.getElementById('usageBar');
var percentEl   = document.getElementById('usagePercent');
var usedEl      = document.getElementById('usageUsed');
var remainEl    = document.getElementById('usageRemain');
var sliderEl    = document.getElementById('usageSlider');
var sliderValEl = document.getElementById('sliderVal');

// メーターの表示をまとめて更新する
function updateMeter(usedGb) {
  var percent  = Math.round(usedGb / TOTAL_GB * 100);
  var remainGb = (TOTAL_GB - usedGb).toFixed(1);

  // バー幅とパーセント表示を更新
  barEl.style.width     = percent + '%';
  percentEl.textContent = percent + '%';

  // 使用量・残量テキストを更新(textContent で安全に代入)
  usedEl.textContent   = usedGb.toFixed(1) + ' GB 使用中';
  remainEl.textContent = '残り ' + remainGb + ' GB / ' + TOTAL_GB.toFixed(1) + ' GB';

  // アクセシビリティ属性を更新
  var barWrap = barEl.parentElement;
  barWrap.setAttribute('aria-valuenow', percent);
  barWrap.setAttribute('aria-label', 'ストレージ使用量 ' + percent + '%');

  // 閾値に応じて色クラスを付け替える
  meterEl.classList.remove('is-warning', 'is-danger');
  if (percent >= THRESHOLD_DANGER) {
    meterEl.classList.add('is-danger');
  } else if (percent >= THRESHOLD_WARNING) {
    meterEl.classList.add('is-warning');
  }
}

// スライダー操作でリアルタイム更新
sliderEl.addEventListener('input', function() {
  var usedGb = parseFloat(this.value);
  sliderValEl.textContent = usedGb.toFixed(1);
  updateMeter(usedGb);
});

// 初期状態に戻す(リセットボタンからも呼ばれる)
function resetDemo() {
  sliderEl.value          = INIT_GB;
  sliderValEl.textContent = INIT_GB.toFixed(1);
  updateMeter(INIT_GB);
}

// 初期化
resetDemo();

AI用プロンプト

以下のプロンプトをコピーしてAIに渡すと、同様のコンポーネントを生成できます。

ChatGPTやClaudeにこのプロンプトを渡すと、同様のコンポーネントをゼロから生成・カスタマイズできます。ライブラリ指定や列数変更など、要件を追記して使うのがおすすめです。

※ このプロンプトを使ってもデモとまったく同じ動作にならない場合があります。AIの解釈や生成タイミングによって差が出ることをご了承ください。

💡 jQuery・Vue・React など特定のライブラリで実装したい場合は、プロンプトの末尾に「〇〇を使って実装してください」と追記してください。

# 使用量メーター 作成依頼

## 概要
クラウドストレージ容量の使用状況を表示する使用量メーターを作成してください。
スライダーで使用量を変更でき、バー・数値・色がリアルタイムで更新されます。

## 要件
- プログレスバー形式のメーター(アニメーション付き)
- 使用量・残量・上限・割合をすべて表示する(例:3.2 GB 使用中 / 残り 1.8 GB / 5.0 GB / 64%)
- 閾値による3段階の色変化(74%以下:青 / 75〜89%:黄 / 90%以上:赤)
- デモ用スライダーで使用量をリアルタイム変更できる

## 技術仕様
- HTML / CSS / バニラJavaScript で実装
- 外部ライブラリ:なし
- レスポンシブ対応:必要(最小幅 320px)

## 動作詳細
- 上限容量は 5.0 GB、初期使用量は 3.2 GB(64%)
- スライダー(min:0 / max:5 / step:0.1)を動かすとバー幅・数値・色が即時更新される
- バーの色変化は CSS クラスの付け外しで制御する(.is-warning / .is-danger)
- アクセシビリティ対応:バーのラッパーに role="meter"・aria-valuenow・aria-valuemin・aria-valuemax を設定する
- テキストの動的更新は textContent のみ使用すること(innerHTML に変数を結合しない)

## 出力形式
HTML・CSS・JavaScriptを分けて出力してください。
各ファイルは単独でコピー&ペーストして使えるよう記述してください。