Bootstrap 5 Progress Bars Tutorial
Master static and dynamic progress indicators with Bootstrap 5.
What are Progress Bars?
Progress bars are visual indicators that show the completion status of a task or operation. Common use cases include file upload/download progress, form completion status, loading states, skill indicators, survey completion, and installation progress.
1. Basic Progress Bar
<!-- Basic progress bar -->
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 25%" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<!-- With ARIA attributes for accessibility -->
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 50%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">50%</div>
</div>
| Class/Attribute | Purpose |
|---|---|
.progress | Container for progress bars |
.progress-bar | The actual bar that fills |
role="progressbar" | ARIA role for accessibility |
aria-valuenow | Current progress value |
aria-valuemin | Minimum value (usually 0) |
aria-valuemax | Maximum value (usually 100) |
style="width: X%" | Visual width of the bar |
2. Progress Bar with Labels
<!-- Label inside the bar -->
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 25%" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100">25%</div>
</div>
<div class="progress mt-3">
<div class="progress-bar" role="progressbar" style="width: 50%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">50%</div>
</div>
<!-- Label outside the bar -->
<div class="mt-3">
<div class="d-flex justify-content-between mb-1">
<span>File upload progress</span>
<span>45%</span>
</div>
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 45%" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
3. Progress Bar Colors
<div class="progress mb-3">
<div class="progress-bar bg-primary" role="progressbar" style="width: 45%">45%</div>
</div>
<div class="progress mb-3">
<div class="progress-bar bg-success" role="progressbar" style="width: 60%">60%</div>
</div>
<div class="progress mb-3">
<div class="progress-bar bg-info" role="progressbar" style="width: 75%">75%</div>
</div>
<div class="progress mb-3">
<div class="progress-bar bg-warning" role="progressbar" style="width: 30%">30%</div>
</div>
<div class="progress mb-3">
<div class="progress-bar bg-danger" role="progressbar" style="width: 85%">85%</div>
</div>
<div class="progress mb-3">
<div class="progress-bar bg-dark" role="progressbar" style="width: 50%">50%</div>
</div>
<div class="progress">
<div class="progress-bar bg-secondary" role="progressbar" style="width: 20%">20%</div>
</div>
4. Striped Progress Bars
<div class="progress mb-3">
<div class="progress-bar progress-bar-striped" role="progressbar" style="width: 45%">45%</div>
</div>
<div class="progress mb-3">
<div class="progress-bar progress-bar-striped bg-success" role="progressbar" style="width: 60%">60%</div>
</div>
<div class="progress mb-3">
<div class="progress-bar progress-bar-striped bg-info" role="progressbar" style="width: 75%">75%</div>
</div>
5. Animated Striped Progress Bars
<div class="progress mb-3">
<div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 45%">45%</div>
</div>
<div class="progress mb-3">
<div class="progress-bar progress-bar-striped progress-bar-animated bg-success" role="progressbar" style="width: 60%">60%</div>
</div>
<div class="progress mb-3">
<div class="progress-bar progress-bar-striped progress-bar-animated bg-danger" role="progressbar" style="width: 75%">75%</div>
</div>
6. Custom Height Progress Bars
<div class="progress" style="height: 4px;">
<div class="progress-bar" role="progressbar" style="width: 45%"></div>
</div>
<div class="progress mt-3" style="height: 8px;">
<div class="progress-bar bg-success" role="progressbar" style="width: 60%"></div>
</div>
<div class="progress mt-3" style="height: 30px;">
<div class="progress-bar bg-warning" role="progressbar" style="width: 50%">50%</div>
</div>
7. Multiple Bars (Stacked Progress)
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 15%">15%</div>
<div class="progress-bar bg-success" role="progressbar" style="width: 30%">30%</div>
<div class="progress-bar bg-info" role="progressbar" style="width: 20%">20%</div>
</div>
<div class="progress mt-3">
<div class="progress-bar bg-success" style="width: 45%">Completed (45%)</div>
<div class="progress-bar bg-warning" style="width: 25%">In Progress (25%)</div>
<div class="progress-bar bg-secondary" style="width: 30%">Pending (30%)</div>
</div>
8. Dynamic Progress Bar with JavaScript
Simple Dynamic Progress Bar
<div class="card">
<div class="card-header bg-primary text-white">
<h4 class="mb-0">Dynamic Progress Bar</h4>
</div>
<div class="card-body">
<label class="form-label">Progress: <span id="progressValue">0</span>%</label>
<div class="progress">
<div id="dynamicProgress" class="progress-bar progress-bar-striped progress-bar-animated"
role="progressbar" style="width: 0%" aria-valuenow="0">0%</div>
</div>
<div class="mt-3">
<button id="incrementBtn" class="btn btn-primary">Increase +10%</button>
<button id="decrementBtn" class="btn btn-warning">Decrease -10%</button>
<button id="resetBtn" class="btn btn-danger">Reset</button>
<button id="completeBtn" class="btn btn-success">Complete (100%)</button>
</div>
</div>
</div>
<script>
const progressBar = document.getElementById('dynamicProgress');
const progressValue = document.getElementById('progressValue');
function updateProgress(value) {
const newValue = Math.min(100, Math.max(0, value));
progressBar.style.width = newValue + '%';
progressBar.setAttribute('aria-valuenow', newValue);
progressBar.textContent = newValue + '%';
progressValue.textContent = newValue;
}
document.getElementById('incrementBtn').addEventListener('click', () => updateProgress((+progressBar.getAttribute('aria-valuenow') || 0) + 10));
document.getElementById('decrementBtn').addEventListener('click', () => updateProgress((+progressBar.getAttribute('aria-valuenow') || 0) - 10));
document.getElementById('resetBtn').addEventListener('click', () => updateProgress(0));
document.getElementById('completeBtn').addEventListener('click', () => updateProgress(100));
</script>
File Upload Progress Simulation
<div class="card">
<div class="card-header bg-success text-white"><h4 class="mb-0"><i class="bi bi-cloud-upload"></i> File Upload Simulator</h4></div>
<div class="card-body">
<input type="file" class="form-control mb-3" id="fileInput">
<div id="uploadArea" style="display: none;">
<div class="d-flex justify-content-between mb-2"><span id="fileName"></span><span id="fileSize"></span></div>
<div class="progress mb-2" style="height: 30px;">
<div id="uploadProgress" class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 0%">0%</div>
</div>
<button id="startUploadBtn" class="btn btn-primary btn-sm">Start Upload</button>
<button id="cancelUploadBtn" class="btn btn-danger btn-sm">Cancel</button>
<div id="uploadStatus" class="text-muted mt-2">Ready to upload</div>
</div>
</div>
</div>
<script>
let uploadInterval;
let currentProgress = 0;
document.getElementById('fileInput').addEventListener('change', function (e) {
const file = e.target.files[0];
if (!file) return;
document.getElementById('fileName').textContent = 'File: ' + file.name;
document.getElementById('fileSize').textContent = 'Size: ' + (file.size / 1024).toFixed(2) + ' KB';
document.getElementById('uploadArea').style.display = 'block';
});
</script>
9. Progress Bar with Live Timer/Countdown
<div class="card text-center">
<div class="card-header bg-info text-white"><h4 class="mb-0">Countdown Timer</h4></div>
<div class="card-body">
<input type="number" id="timerSeconds" class="form-control text-center mb-3" value="30" min="1" max="300">
<div class="progress mb-3" style="height: 30px;">
<div id="timerProgress" class="progress-bar progress-bar-striped" role="progressbar" style="width: 100%">100%</div>
</div>
<h2 id="timeDisplay" class="display-4 mb-3">00:30</h2>
<button id="startTimerBtn" class="btn btn-success">Start Timer</button>
<button id="pauseTimerBtn" class="btn btn-warning">Pause</button>
<button id="resetTimerBtn" class="btn btn-danger">Reset</button>
</div>
</div>
10. Real-World Progress Bar Examples
Survey Completion Progress
<div class="card">
<div class="card-header bg-primary text-white"><h4 class="mb-0">Customer Satisfaction Survey</h4></div>
<div class="card-body">
<div class="d-flex justify-content-between mb-2"><span>Survey Progress</span><span id="surveyPercent">0%</span></div>
<div class="progress mb-4" style="height: 25px;">
<div id="surveyProgress" class="progress-bar progress-bar-striped" style="width: 0%">0%</div>
</div>
<!-- questions and radio inputs here -->
<button id="submitSurvey" class="btn btn-primary" disabled>Submit Survey</button>
</div>
</div>
Skill Level Indicators
<div class="card">
<div class="card-header bg-dark text-white"><h5 class="mb-0">Developer Skills</h5></div>
<div class="card-body">
<div class="mb-3">
<div class="d-flex justify-content-between mb-1"><span>HTML/CSS</span><span>90%</span></div>
<div class="progress"><div class="progress-bar bg-danger" style="width: 90%">90%</div></div>
</div>
<div class="mb-3">
<div class="d-flex justify-content-between mb-1"><span>JavaScript</span><span>75%</span></div>
<div class="progress"><div class="progress-bar bg-warning" style="width: 75%">75%</div></div>
</div>
</div>
</div>
11. Progress Bar with Tooltip
<div class="progress" style="height: 30px;">
<div id="tooltipProgress" class="progress-bar bg-success"
role="progressbar" style="width: 65%"
data-bs-toggle="tooltip" data-bs-placement="top"
title="65% Complete">65%</div>
</div>
<script>
const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
</script>
12. Progress Bar with Status Messages
<div class="card">
<div class="card-header bg-primary text-white"><h4 class="mb-0"><i class="bi bi-arrow-repeat"></i> Processing Pipeline</h4></div>
<div class="card-body">
<div class="progress mb-3" style="height: 35px;">
<div id="statusProgress" class="progress-bar progress-bar-striped progress-bar-animated bg-info" role="progressbar" style="width: 0%">0%</div>
</div>
<div id="statusMessages" class="mt-3"><div class="alert alert-secondary">Waiting to start...</div></div>
<button id="startProcessBtn" class="btn btn-primary">Start Process</button>
<button id="resetProcessBtn" class="btn btn-secondary">Reset</button>
</div>
</div>
Quick Reference Table
| Class / Attribute | Purpose |
|---|---|
.progress | Container for progress bar |
.progress-bar | The actual progress bar element |
.progress-bar-striped | Adds stripes to the bar |
.progress-bar-animated | Animates the stripes |
.bg-primary, .bg-success, etc. | Contextual colors |
role="progressbar" | ARIA role for accessibility |
aria-valuenow | Current progress value |
aria-valuemin | Minimum value (0) |
aria-valuemax | Maximum value (100) |
style="width: X%" | Sets the progress width |
Complete Demo HTML Page
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bootstrap 5 Progress Bars - Complete Tutorial</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
</head>
<body class="container py-5">
<h1 class="mb-4"><i class="bi bi-bar-chart-steps"></i> Bootstrap 5 Progress Bars</h1>
<div class="progress mb-3"><div class="progress-bar" style="width: 25%">25%</div></div>
<div class="progress mb-3"><div class="progress-bar bg-success" style="width: 60%">60%</div></div>
<div class="progress mb-3"><div class="progress-bar progress-bar-striped" style="width: 45%">Striped</div></div>
<div class="progress">
<div class="progress-bar bg-success" style="width: 45%">Completed</div>
<div class="progress-bar bg-warning" style="width: 25%">In Progress</div>
<div class="progress-bar bg-secondary" style="width: 30%">Pending</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>