Bootstrapでファイルアップロード進捗を見せる!プログレスバーとスピナー活用法
生徒
「先生、ファイルをアップロードするときに、どれくらい進んでいるか見せる方法ってありますか?」
先生
「もちろんです。ウェブページ上で進捗バーやスピナーを表示して、ユーザーにアップロード状況を見せることができます。」
生徒
「進捗バーってBootstrapでも使えるんですか?」
先生
「はい。Bootstrapのプログレスバーやスピナーを使うと、簡単に見た目もきれいに進捗を表示できます。XHRやFetchと組み合わせてリアルタイムで更新もできます。」
1. ファイルアップロードの進捗とは?
ファイルアップロードの進捗とは、ユーザーがアップロードしているファイルがサーバーにどれくらい送信されたかを示すものです。初心者の方には、これは動画の再生バーのようなものと考えるとわかりやすいです。バーが右に進むほど、アップロードが進んでいるということです。
2. Bootstrapのプログレスバーとスピナーの基本
Bootstrapでは、プログレスバーを作るために
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 0%"></div>
</div>
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
ブラウザ表示
3. XHRでファイルのアップロード進捗を取得する方法
XHR(XMLHttpRequest)を使うと、ファイルのアップロード中にどれくらい送信されたかを取得できます。これは通信の進捗イベント「progress」を監視することで可能です。進捗バーの幅をこの値に応じて変更することで、リアルタイムで進捗を表示できます。
<input type="file" id="fileInput">
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 0%"></div>
</div>
<script>
const fileInput = document.getElementById('fileInput');
const progressBar = document.querySelector('.progress-bar');
fileInput.addEventListener('change', () => {
const file = fileInput.files[0];
const xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', (e) => {
if (e.lengthComputable) {
const percent = (e.loaded / e.total) * 100;
progressBar.style.width = percent + '%';
}
});
xhr.open('POST', '/upload');
const formData = new FormData();
formData.append('file', file);
xhr.send(formData);
});
</script>
ブラウザ表示
4. Fetch APIとプログレスバーの連携
Fetch APIはXHRよりも新しい方法ですが、直接進捗イベントを取得できません。しかしReadableStreamを使うことで、送信中の進捗を取得できます。Fetchを使ったモダンな方法で、進捗バーを動かす例を紹介します。
<input type="file" id="fileInput2">
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 0%"></div>
</div>
<script>
const input2 = document.getElementById('fileInput2');
const progressBar2 = document.querySelector('.progress-bar');
input2.addEventListener('change', async () => {
const file = input2.files[0];
const chunkSize = 1024 * 100;
let uploaded = 0;
while(uploaded < file.size) {
const chunk = file.slice(uploaded, uploaded + chunkSize);
const formData = new FormData();
formData.append('file', chunk);
await fetch('/upload-chunk', { method: 'POST', body: formData });
uploaded += chunk.size;
const percent = (uploaded / file.size) * 100;
progressBar2.style.width = percent + '%';
}
});
</script>
ブラウザ表示
5. アップロード中のスピナー表示でユーザーに安心感を
ファイルサイズが大きい場合、アップロードには時間がかかります。その間、ユーザーが何も表示されないと不安になります。スピナーを表示することで「処理中です」という視覚的な安心感を与えられます。
<div id="spinner" class="spinner-border text-success" role="status" style="display:none;">
<span class="visually-hidden">Loading...</span>
</div>
<script>
const spinner = document.getElementById('spinner');
fileInput.addEventListener('change', () => {
spinner.style.display = 'inline-block';
// アップロード処理が終わったら
// spinner.style.display = 'none';
});
</script>
ブラウザ表示
6. プレースホルダーでアップロード前のレイアウトを維持
Bootstrapのプレースホルダーは、コンテンツがまだ読み込まれていないときの見た目を整えるための機能です。ファイルアップロード中も、進捗バーやスピナーが出る領域をプレースホルダーで確保すると、ページのレイアウトが変わらずに見やすくなります。
<div class="placeholder-glow">
<span class="placeholder col-12"></span>
</div>
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 0%"></div>
</div>
ブラウザ表示
7. 進捗バーとスピナーを組み合わせた実用例
実際のアップロード画面では、プログレスバーとスピナーを一緒に使うとユーザーがより理解しやすくなります。バーは進行状況を示し、スピナーは処理中であることを強調します。Bootstrapではこれらを簡単に組み合わせられます。
<input type="file" id="fileInput3">
<div id="spinner3" class="spinner-border text-primary" role="status" style="display:none;">
<span class="visually-hidden">Loading...</span>
</div>
<div class="progress">
<div class="progress-bar" role="progressbar" style="width:0%"></div>
</div>
<script>
const input3 = document.getElementById('fileInput3');
const spinner3 = document.getElementById('spinner3');
const progressBar3 = document.querySelector('.progress-bar');
input3.addEventListener('change', () => {
spinner3.style.display = 'inline-block';
const file = input3.files[0];
const xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', e => {
if (e.lengthComputable) {
progressBar3.style.width = (e.loaded / e.total * 100) + '%';
}
});
xhr.onload = () => { spinner3.style.display = 'none'; };
const formData = new FormData();
formData.append('file', file);
xhr.open('POST', '/upload');
xhr.send(formData);
});
</script>
ブラウザ表示
8. 初心者でもわかる進捗表示のポイントまとめ
初心者がファイルアップロード進捗を作る場合は、まずはBootstrapのプログレスバーとスピナーを理解しましょう。次にXHRで進捗を取得し、進捗バーの幅を変える練習をします。Fetch APIはもう少し進んだステップですが、同じ考え方で進捗を表示できます。プレースホルダーでページレイアウトを整えることも大切です。
このように、進捗バー、スピナー、プレースホルダーを組み合わせることで、ユーザーにわかりやすく、安全にアップロード中であることを伝えることができます。これにより、初心者でも簡単に見た目の良いアップロード画面を作成できます。
まとめ
今回はBootstrapを使ったファイルアップロード進捗表示について、初心者の方でも理解しやすいように解説しました。まず、ファイルアップロードの進捗とはユーザーが送信しているデータがどれだけサーバーに届いたかを示す指標であり、動画再生のバーと同じように考えるとわかりやすいことがわかりました。次に、Bootstrapのプログレスバーやスピナーを使うことで、アップロード中に視覚的な進捗表示や処理中の安心感をユーザーに提供できることを学びました。具体的には
また、XHR(XMLHttpRequest)を利用すると、upload.progressイベントを活用してリアルタイムに進捗バーを動かすことができることも理解しました。さらにFetch APIを用いるモダンな方法では、ReadableStreamを活用してファイルを分割して送信しながら進捗を管理する手法も紹介しました。大きなファイルをアップロードする場合でも、スピナーで処理中の状態を示すことでユーザーの不安を軽減できることも重要なポイントです。
さらに、Bootstrapのプレースホルダー機能を活用することで、アップロード前やアップロード中のレイアウトを崩さず、ページ全体の見た目を整えることができることもわかりました。最後に、プログレスバーとスピナーを組み合わせた実用例を示し、ユーザーが直感的に理解できるアップロード画面を作る方法を紹介しました。初心者でも手順を踏めば、見やすくわかりやすいアップロード進捗表示を簡単に作成できることが理解できました。
総じて、進捗バー、スピナー、プレースホルダーの三つの要素を適切に組み合わせることが、ユーザー体験を向上させるポイントです。これにより、ウェブサイトやアプリのファイルアップロード機能をより親切で直感的に設計できます。さらに、XHRやFetch APIの基礎を理解することで、将来的により複雑なファイル管理やリアルタイム通信機能にも応用できます。
生徒
「先生、今回はBootstrapのプログレスバーとスピナーを使って、ファイルアップロードの進捗を見せる方法を学びました。XHRやFetch APIも使えるんですね。」
先生
「そうです。基本はプログレスバーで進捗を示すことですが、XHRのprogressイベントでリアルタイム更新、Fetch APIでモダンな分割送信も可能です。さらにスピナーやプレースホルダーを使うと、ユーザーが安心して待てるようになります。」
生徒
「なるほど。アップロード中の見た目を整えるのが意外と大事なんですね。」
先生
「その通りです。進捗バー、スピナー、プレースホルダーの組み合わせで、ユーザーはアップロードが進んでいることを直感的に理解できます。これを覚えておくと、他のウェブアプリでも応用できます。」
生徒
「今日の学習で、初心者でも簡単にアップロード画面を作れるイメージがつかめました。ありがとうございます。」
先生
「よく理解できましたね。まずは基本を押さえて、少しずつXHRやFetchの応用も試してみてください。」
【60分集中】CSSを1行も書かない!?Bootstrap 5ユーティリティクラス活用で開発工数を50%削減
「スピード」が武器になる。Bootstrap 5で商用クオリティのWebサイトを高速構築。
本講座では、世界シェアNo.1のフレームワークBootstrap 5を使いこなし、ゼロからレスポンシブサイトを組み上げる「現場最速のワークフロー」を学びます。単なる導入に留まらず、ユーティリティクラスを活用した効率化と、実務で必須となるカスタマイズ技法を60分で完全習得します。
具体的なワークショップ内容と環境
【つくるもの】
モダンなランディングページ(LP)やダッシュボードのプロトタイプを作成します。ナビゲーション、ヒーローセクション、カードレイアウト、フッターなど、Bootstrapのコンポーネントを組み合わせて「一瞬で形にする」感動を体験してください。
【開発環境】
VS CodeにBootstrap 5専用のSnippet(補完機能)を導入し、手入力を最小限にする環境を構築。最新のCDN利用法や、表示速度(Core Web Vitals)を意識した最適な読み込み設定など、プロの初期設定を伝授します。
この60分で得られる3つの革新スキル
スマホ・タブレット・PCでレイアウトを自由自在に切り替える「ブレイクポイント」の極意を学びます。
CSSを1行も書かずに、マージン・パディング・カラーを制御。開発工数を半分以下にする実戦術を習得します。
「Bootstrap感」を消し、独自のブランドイメージに合わせるための、上書きの作法とデザインの整え方を伝授します。
※本講座は、HTML/CSSの基本を理解した方向けの「実践加速講座」です。制作会社のコーダーや副業フリーランスとして「案件の回転率」を上げ、市場価値を最大化させたい方をモクモクがバックアップします。
Bootstrap 5を楽しみながら、一緒に学びましょう!
各回少人数・マンツーマン形式で徹底サポート
このセミナーの詳細・お申し込みはこちら