この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:guest
更新日時:2026-06-11 07:29:05

タイトル: progress要素
SEOタイトル: HTML progress要素 完全ガイド(進捗バー / value / max / 不確定状態 / CSS カスタマイズ / JavaScript連動)

この記事の要点
  • はタスクの進捗状況をバーで表示する HTML5 要素
  • 主要属性: value(現在値)と max(最大値)。value を省略すると不確定(インディケーター)状態
  • <meter> とは目的が異なる — progress は進行中のタスク、meter は固定範囲内の現在量(ディスク使用量等)
  • CSS では ::-webkit-progress-bar / ::-webkit-progress-value / ::-moz-progress-bar でデザイン変更可能
  • JavaScript の progress.value = n で動的に更新 — ファイルアップロードや動画読み込み等で活用

progress 要素とは

は HTML5 で導入された進捗バー用の要素です。ファイルアップロード、ダウンロード、動画読み込み、ゲームのロード進捗など、「終わりがある作業の進み具合」を視覚化するために使います。

基本構文

<!-- 60% 完了 -->
<progress value="60" max="100">60%</progress>

<!-- 不確定状態(進捗不明だが動いている) -->
<progress max="100">読込中...</progress>

タグの中身(テキスト)はprogress 非対応ブラウザ向けのフォールバック。対応ブラウザでは表示されません。

属性一覧

属性必須意味
value任意現在値(0 〜 max)。省略で不確定状態
max任意最大値(デフォルト 1.0)

値の指定パターン

<!-- 0〜1 のパーセント表記 -->
<progress value="0.6"></progress>     <!-- 60% -->

<!-- 0〜100 -->
<progress value="60" max="100"></progress>

<!-- 任意のスケール: 7/12 個 -->
<progress value="7" max="12"></progress>

<!-- 進捗不明(インディケーター) -->
<progress></progress>

JavaScript で動的に更新

<progress id="bar" value="0" max="100"></progress>
<span id="pct">0%</span>

<script>
const bar = document.getElementById('bar');
const pct = document.getElementById('pct');

let n = 0;
const timer = setInterval(() => {
    n += 5;
    bar.value = n;
    pct.textContent = n + '%';
    if (n >= 100) clearInterval(timer);
}, 200);
</script>

ファイルアップロードでの利用

const file = document.querySelector('input[type=file]').files[0];
const bar = document.querySelector('progress');

const xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', e => {
    if (e.lengthComputable) {
        bar.max = e.total;
        bar.value = e.loaded;
    }
});
xhr.open('POST', '/upload');
xhr.send(file);

Fetch API での利用(ReadableStream)

const res = await fetch('/big-file');
const total = Number(res.headers.get('Content-Length'));
const reader = res.body.getReader();

let received = 0;
while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    received += value.length;
    document.querySelector('progress').value = received / total;
}

CSS でデザインを変える

progress 要素はベンダー固有の擬似要素でスタイルを当てます。WebKit 系(Chrome / Safari / Edge)と Firefox で別の擬似要素が必要です。

/* 全体共通 */
progress {
    width: 100%;
    height: 20px;
    appearance: none;
}

/* WebKit: 背景(未完了部分) */
progress::-webkit-progress-bar {
    background: #eee;
    border-radius: 10px;
}

/* WebKit: 進捗(完了部分) */
progress::-webkit-progress-value {
    background: linear-gradient(90deg, #4caf50, #8bc34a);
    border-radius: 10px;
}

/* Firefox: 進捗 */
progress::-moz-progress-bar {
    background: linear-gradient(90deg, #4caf50, #8bc34a);
    border-radius: 10px;
}

progress と meter の違い

項目
意味進行中タスクの進捗固定範囲内の現在量
ダウンロード進捗、ファイル変換ディスク使用量、温度、スコア
主要属性value / maxvalue / min / max / low / high / optimum
不確定状態あり(value 省略)なし
区分表示なしあり(低/最適/高で色変化)

アクセシビリティ

progress 要素は自動的に role="progressbar" を持ちます。スクリーンリーダーは「進捗バー」として認識し、現在値とパーセンテージを読み上げます。

<!-- aria-label でラベルを付与すると、何の進捗か明確になる -->
<progress value="60" max="100" aria-label="ダウンロード進捗"></progress>

<!-- ラベル付きで表示する場合 -->
<label for="upload-progress">アップロード:</label>
<progress id="upload-progress" value="35" max="100"></progress>

不確定状態の見せ方

value を省略した不確定状態では、ブラウザがアニメーションで「動いていること」を示します。処理時間が読めない場面に最適です。

<!-- 不確定状態のスタイル例 -->
<style>
progress:not([value])::-webkit-progress-bar {
    background:
        repeating-linear-gradient(45deg, #cce, #cce 10px, #aae 10px, #aae 20px);
    animation: barberpole 2s linear infinite;
}
@keyframes barberpole {
    0%   { background-position: 0 0; }
    100% { background-position: 40px 0; }
}
</style>

<progress>処理中...</progress>

ブラウザサポート

Chrome / Firefox / Safari / Edge いずれも対応済み。IE9 以前は非対応のため、代替表示(テキスト「60%」など)を中身に入れておくとフォールバックされます。

FAQ

Q: 円形プログレスバーにしたい
A: HTML の <progress> はバー形状専用。円形は SVG または CSS の conic-gradient で別途実装します。

Q: パーセンテージのテキスト表示も同期したい
A: <progress> 単体ではテキストを表示しません。隣に <span> を置いて JavaScript で同期するのが定番。

Q: max を動的に変えてよい?
A: 問題なし。アップロードの全体バイト数が後から判明する場合などで progress.max = total のように更新できます。

Q: スタイルが効かない
A: ブラウザによって擬似要素が違います。WebKit と Firefox の両方を指定し、appearance: none も忘れずに。

関連

  • meter 要素 — 範囲内の現在量を表示
  • input type="range" — スライダー入力
  • output 要素 — 計算結果の表示
  • aria-valuenow — ARIA で進捗を示す属性