1. ホーム
  2. HTML

【HTML】progress と meter の使い方|進捗バー・割合ゲージを表示する方法

Share

ファイルのダウンロード状況を示すバーや、ディスクの空き容量を表すゲージのように、「どれくらい進んだか」「全体のうちどれくらいか」を視覚的に見せたい場面があります。HTML には、こうした表示のために用意された専用の要素 <progress><meter> があります。<div> と CSS で似たものを自作することもできますが、専用要素を使えば短いコードで意味が伝わり、スクリーンリーダーにも正しく認識されます。この記事では、2つの要素の違いと使い分け、属性の意味、JavaScript で進捗を動かす方法までを初心者向けに解説します。

progress と meter の違い

名前も見た目も似ていますが、2つの要素は表すものが異なります。ざっくり言うと、<progress> は「作業の進み具合」、<meter> は「ある範囲の中での今の値」を表します。下の表で役割の違いを整理しておきましょう。

要素表すもの使う場面の例
<progress>タスクの完了度(0% → 100% へ進んでいくもの)ダウンロード・アップロード・処理の進捗、フォーム入力の達成度
<meter>決まった範囲の中での現在値(増えたり減ったりするもの)ディスク使用量、バッテリー残量、点数、在庫の割合

判断に迷ったら「ゴールに向かって一方向に進むものか?」を考えてみてください。進んでいく作業なら <progress>、単に「今いくつか」を示すゲージなら <meter> が適しています。

progress で進捗バーを作る

<progress> は、max(全体の量)と value(現在の量)の2つの属性で進み具合を表します。たとえば全体を100として現在が30なら、30%まで満たされたバーが表示されます。

index.html
<progress max="100" value="30">30%</progress>

タグの内側に書いた 30% は、<progress> に対応していない古いブラウザで表示される代替テキストです。今のブラウザではバーが表示されるため見えませんが、書いておくと安心です。

value を書かずに <progress> だけにすると、進捗が不明な状態(インデターミネート)になり、多くのブラウザでは「処理中」を示すアニメーションが表示されます。完了までの時間が読めない処理に使えます。

index.html
<!-- value がないと「処理中」を表すアニメーションになる -->
<progress max="100"></progress>

meter で割合ゲージを作る

<meter> は、minmax の範囲の中で value がどの位置にあるかを示します。さらに lowhighoptimum を指定すると、値が「低い/普通/高い」のどのゾーンにあるかをブラウザが判断し、ゲージの色(緑・黄・赤など)を自動で変えてくれます。

index.html
<!-- 0〜100 のうち 92。high=80 を超えているので警告色になる -->
<meter min="0" max="100" low="30" high="80" optimum="20" value="92">92%</meter>

各属性の意味は次のとおりです。色分けは optimum がどのゾーンにあるかを基準に決まる仕組みで、「良い状態から離れているほど警告色になる」と覚えると分かりやすいです。

属性意味
min / max範囲の下限・上限(省略時は 0 と 1)。
value現在の値。必須。
low / high「低い」「高い」とみなす境界。この値を基準にゾーンが3つに分かれる。
optimumもっとも望ましい値。どのゾーンを「良い(緑)」とするかの判断に使われる。

上の例ではディスク使用量を表しており、optimum="20"(使用量は少ないほどよい)に対して現在値が 92 と高いため、警告を示す色で表示されます。逆にテストの点数のように「高いほどよい」場合は optimum を大きめの値にします。

実際に動かして確かめる

下のサンプルでは、<progress> の進捗バーと <meter> のゲージを並べています。「進捗を進める」ボタンを押すと、JavaScript で value を少しずつ増やしてバーが伸びていきます。<meter> のほうは使用量が高いため、警告を示す色になっているはずです。実際に操作して動きを確かめてみましょう。

<div class="demo">
  <p>ダウンロード進捗(progress)</p>
  <progress id="bar" max="100" value="0"></progress>
  <span id="pct">0%</span>

  <p>ディスク使用量(meter)</p>
  <meter min="0" max="100" low="30" high="80" optimum="20" value="92"></meter>
  <span>92 / 100 GB</span>

  <button id="run" type="button">進捗を進める</button>
</div>
.demo {
  font-family: sans-serif;
  max-width: 340px;
  margin: 24px auto;
  line-height: 1.6;
}
.demo p {
  margin: 12px 0 4px;
  font-weight: bold;
}
progress, meter {
  width: 220px;
  height: 16px;
  vertical-align: middle;
}
button {
  margin-top: 16px;
  padding: 8px 16px;
  border: none;
  border-radius: 6px;
  background: #007bff;
  color: #fff;
  cursor: pointer;
}
const bar = document.getElementById('bar');
const pct = document.getElementById('pct');

document.getElementById('run').addEventListener('click', () => {
  bar.value = 0;
  // 0.2 秒ごとに value を増やして進捗バーを動かす
  const timer = setInterval(() => {
    bar.value += 10;
    pct.textContent = bar.value + '%';
    if (bar.value >= 100) clearInterval(timer); // 100 になったら止める
  }, 200);
});
Preview

JavaScript で進捗を更新する

実際のダウンロードや処理に合わせてバーを動かすには、JavaScript で value プロパティを書き換えます。HTML の属性と同じ名前のプロパティに数値を代入するだけで、表示がすぐに更新されます。次の例は、一定時間ごとに少しずつ進めて100%で止める基本パターンです。

main.js
const bar = document.querySelector('progress');

const timer = setInterval(() => {
  bar.value += 10;                 // 現在値を10ずつ増やす
  if (bar.value >= bar.max) {      // max に達したら
    clearInterval(timer);          // 繰り返しを止める
  }
}, 200);

現在の進捗を割合(パーセント)で取り出したいときは、valuemax で割って100を掛けます。たとえば「bar.value / bar.max * 100」で 0〜100 の数値が得られるので、別の場所に「45%」のように表示する用途に使えます。

label と紐づけて分かりやすくする

バーやゲージが何を表しているかは、<label> を添えると伝わりやすくなります。<label>for 属性と要素の id を同じにして結び付けると、スクリーンリーダーが「ダウンロードの進捗、45パーセント」のように読み上げてくれます。視覚だけに頼らない、アクセシブルな表示になります。

index.html
<label for="dl">ダウンロードの進捗</label>
<progress id="dl" max="100" value="45">45%</progress>

意図したバーにならないとき

progress と meter を取り違えている

「色が変わらない」「アニメーションしない」といった戸惑いの多くは、要素の取り違えが原因です。lowhighoptimum による色分けは <meter> だけの機能で、<progress> にはありません。逆に、value を省いたときの「処理中」アニメーションは <progress> の挙動で、<meter> にはありません。表したいものが「進む作業」か「現在値のゲージ」かをもう一度確認してください。

value が範囲を超えている

valuemax より大きい、あるいは min より小さいと、ブラウザは範囲内に丸めて表示します(max を超えれば満タン表示)。思ったゲージにならないときは、minmaxvalue の数値の関係を見直してください。<meter> では value が必須で、省略すると正しく表示されません。

バーの色を変えたい

バーの色や高さは CSS で調整できますが、<progress><meter> はブラウザごとに内部構造が異なり、::-webkit-progress-bar::-webkit-progress-value といったベンダー固有の擬似要素を使う必要があります。細かなデザインを統一したい場合は、見た目を <div> と CSS で自作し、要素の意味(アクセシビリティ)のために role="progressbar"aria-valuenow などを付ける方法もあります。

まとめ

<progress> は「進んでいく作業の完了度」、<meter> は「決まった範囲の中での現在値」を表す専用要素です。<progress>maxvalue で進捗を示し、value を省くと「処理中」表示になります。<meter>minmax の中の value を示し、lowhighoptimum でゾーンに応じた色分けができます。どちらも <label> を添えるとアクセシビリティが向上します。表したいものに合わせて使い分けてみてください。

各要素の詳しい仕様は、MDN の公式ドキュメントも参考にしてください。