UIXHERO

Progress Bar(プログレスバー)

処理の進捗率を横棒グラフで視覚的に伝えるUIコンポーネント。Spinnerとの使い分け・不定時間進捗(Indeterminate)の設計・role=progressbarとaria-valuenowの実装を解説する。

2026年3月3日
更新: 2026年9月3日
19
by Dengen Yosho(DGYS)

処理の進捗率を横棒グラフで視覚的に伝えるコンポーネント。ファイルアップロード・インストール・データ処理など進捗が計測できる処理に使われる。進捗が計測できない処理には「Indeterminate(不定)」バリアントを使う。Spinnerよりも「どれくらい時間がかかるか」をユーザーが予測できるため、長い処理での待機体験を改善する。

この記事を読むと、Spinnerとの使い分け・Determinateと Indeterminateの使い分け・フェイクプログレスを避けるべき理由・role="progressbar"aria-valuenow の実装が自分でできるようになります。


1. UI例(Preview / Live)

実装で見る(GunjoUI)

この部品を、デザインシステム GUNJO の実装で確かめられます。

2. 定義(Definition)

処理の進捗率を横棒グラフで視覚的に伝えるUIコンポーネント。2つのバリアントがある:

  • Determinate(確定):進捗率(0〜100%)が計測できる場合。aria-valuenow を動的に更新する
  • Indeterminate(不定):進捗率が計測できない場合。バー全体がして「処理が動いている」ことだけを伝える

Spinner vs Progress Bar の選択基準:進捗が数値で計測できるかどうかが唯一の判断基準。計測できない = Spinner / Indeterminate 、計測できる = Determinate Progress Bar。


3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • ファイルアップロード / ダウンロード(進捗率が計測できる)
  • インストール / パッケージ処理
  • 複数ステップの処理(ステップ付きProgress Bar)
  • フォームの記入完了度(任意だが進捗の可視化として)

3.2 When NOT to use

  • 進捗が計測できない処理(API呼び出し・AI処理など)→ Indeterminate または Spinner を使う
  • 数秒以内の短い処理 → Spinner で十分
  • 偽の進捗(フェイクプログレス)を見せたい場合 → 使わない(Indeterminateを使う)

4. 設計判断の核(Decision Principles)

Progress Barの核は「正直な進捗表示」——フェイクプログレスは短期的にユーザーの不安を和らげるが、長期的に信頼を損なう。進捗が計測できないならIndeterminateを使う。

  • フェイクプログレスを実装しない0% → 30%(実際の進捗なし)→ 100% のような偽の進捗は、ユーザーが気づいた時の信頼損失が大きい。進捗が計測できないならIndeterminateバリアントを使う
  • aria-valuenow をリアルタイムで更新するaria-valuenow={progress} は React の state 更新と連動して自動的に更新される。静的な aria-valuenow="0" のままではスクリーンリーダーが常に0%と読み上げる
  • 完了後は必ずフィードバックを提供する:Progress Barが100%になった後、Toastや完了メッセージで「処理が完了した」ことを明示的に伝える

5. 状態設計(States)

状態aria-valuenow視覚的な表示
Idle非表示
Running(Determinate)0〜99バーが伸びる
Running(Indeterminate)設定なしバーが往復アニメーション
Complete100100%表示 → Toast/Alert
ErrorProgress Barを赤色に変えるか非表示

6. バリエーション設計(Variants)

バリアント進捗計測使用例
Determinateファイルアップロード・ダウンロード
IndeterminateAPI処理・AI生成・進捗不明の処理
ステップ付き複数フェーズの処理・ウィザード
カラー付き使用量(警告/危険閾値で色変化)

7. パターン集(Good / Bad / How to fix)

7.1 Bad(典型3つ)

  • 進捗が計測できないAPI呼び出しに 0→30→止まる→突然100 のフェイクプログレスを実装する
  • <div class="progress-bar" style="width: 45%" />rolearia もなく、スクリーンリーダーが進捗を把握できない
  • Progress Barが100%になっても何の通知もなく、ユーザーが処理完了に気づかない

7.2 Good(対になる3つ)

  • 進捗が計測できない処理にはIndeterminateバリアントを使い、完了はToastで通知する
  • role="progressbar" aria-valuenow={progress} aria-valuemin={0} aria-valuemax={100} を付与してリアルタイムで更新する
  • 100%到達後 setTimeout(500ms) でProgress Barを非表示にして、Toast/Alertで「アップロード完了」を通知する

7.3 How to fix(手順)

  1. 進捗が計測できるか確認する → できない場合はIndeterminate CSSアニメーションに変更する
  2. role="progressbar" + aria-valuenow + aria-valuemin + aria-valuemax + aria-label を付与する
  3. 完了処理(100%到達後)に Toast / Alert で完了通知を実装する

8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


9. アクセシビリティ要件(必須)

Screen Reader

<!-- Determinate -->
<div
  role="progressbar"
  aria-valuenow="67"
  aria-valuemin="0"
  aria-valuemax="100"
  aria-label="ファイルアップロード進捗"
>
  <!-- 視覚的なバー -->
</div>

<!-- Indeterminate(aria-valuenowなし) -->
<div
  role="progressbar"
  aria-label="処理中"
  aria-busy="true"
>
</div>

10. 実装メモ(Implementation Notes)

  • shadcn/ui の Progress コンポーネントは @radix-ui/react-progress ベースで role="progressbar"aria-valuenow の更新が自動処理される
  • Indeterminate の CSS アニメーションは @keyframestranslateX(-100%) → translateX(350%) のように実装する。Tailwind にはIndeterminate用プリセットがないためカスタム @keyframes が必要
  • ファイルアップロードの進捗は XMLHttpRequest.upload.onprogress または fetch + ReadableStream で取得できる。axios では onUploadProgress コールバックが利用できる

11. 関連リンク


12. まとめ

Progress Barの設計で最重要なのは「正直な進捗表示」と「aria-valuenow のリアルタイム更新」です。進捗が計測できない処理にはIndeterminateバリアントを使い、フェイクプログレスは避けてください。完了後は必ずToast/Alertで通知することで、ユーザーが処理完了を確実に認識できます。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年9月3日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Bar Chart(棒グラフ)

カテゴリごとの量を棒の長さで比べるチャート。ゼロ基線の扱い、並び順、縦横の選び方、しきい値の見せ方という設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
18

Donut Chart(ドーナツチャート)

中央をくり抜いた円で構成比を示すチャート。中央に置く値の選び方、円グラフとの使い分け、リングの太さ、凡例の作りという設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
17

Gauge Chart(ゲージチャート)

1つの値を範囲の中に置いて示す半円のチャート。範囲の両端に意味があるかという条件、しきい値の帯の設計、色だけで良否を伝えない書き方という設計判断とアクセシビリティ要件を解説する。

2026年8月27日
16

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る