Progress bars show how far a task, a goal or a quota has come. Below are the basic bars with labels, heights, colours, stripes and stacked segments, followed by practical widgets such as uploads, goals, storage meters, wizards, rating breakdowns and a circular ring.
1Basic bars
The width of <code>.progress-bar</code> shows the value; ARIA attributes describe it for screen readers.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 0" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 0%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 25" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 25%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 50" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 50%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 75" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 75%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 100" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 100%">
</div>
</div>
</div>2Labels
Put text inside the bar; <code>.overflow-visible</code> keeps a long label readable on a short bar.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Label example" aria-valuenow="32" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 32%">
32%
</div>
</div>
</div>
<div class="progress" role="progressbar" aria-label="Long label example" aria-valuenow="12" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar overflow-visible text-dark" style="width: 12%">
Only 12% of the upload is done
</div>
</div>3Height
Set the height on <code>.progress</code>; the bar follows.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Thin" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="height: 2px">
<div class="progress-bar" style="width: 40%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Medium" aria-valuenow="55" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar" style="width: 55%">
</div>
</div>
</div>
<div class="progress" role="progressbar" aria-label="Tall" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100" style="height: 24px">
<div class="progress-bar" style="width: 70%">
</div>
</div>4Backgrounds
Background utilities colour the bar.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="bg-success bar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-success" style="width: 25%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="bg-info bar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-info" style="width: 50%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="bg-warning bar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-warning" style="width: 75%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="bg-danger bar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-danger" style="width: 100%">
</div>
</div>
</div>5Striped
<code>.progress-bar-striped</code> adds a diagonal stripe pattern.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Striped 0" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped bg-success" style="width: 20%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Striped 1" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped bg-info" style="width: 40%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Striped 2" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped bg-warning" style="width: 60%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Striped 3" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped bg-danger" style="width: 80%">
</div>
</div>
</div>6Animated stripes
Add <code>.progress-bar-animated</code> so the stripes move - a clear sign that work is ongoing.
<div class="progress" role="progressbar" aria-label="Animated" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 75%">
</div>
</div>7Multiple bars
<code>.progress-stacked</code> puts several segments side by side in one track.
<div class="progress-stacked">
<div class="progress" role="progressbar" aria-label="Segment one" aria-valuenow="15" aria-valuemin="0" aria-valuemax="100" style="width: 15%">
<div class="progress-bar">
</div>
</div>
<div class="progress" role="progressbar" aria-label="Segment two" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100" style="width: 30%">
<div class="progress-bar bg-success">
</div>
</div>
<div class="progress" role="progressbar" aria-label="Segment three" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%">
<div class="progress-bar bg-info">
</div>
</div>
</div>8Contrasting labels
<code>.text-bg-*</code> sets a matching background and readable text colour in one class.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Done" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar text-bg-success" style="width: 90%">
Done 90%
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Almost" aria-valuenow="65" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar text-bg-warning" style="width: 65%">
Almost 65%
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Late" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar text-bg-danger" style="width: 40%">
Late 40%
</div>
</div>
</div>9Label row
Name on the left, percentage on the right, thin bar below.
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Certified specialists</span><span class="font-semibold">65%</span>
</div>
<div class="progress" role="progressbar" aria-label="Certified specialists" aria-valuenow="65" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar" style="width: 65%">
</div>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Insurance friendly</span><span class="font-semibold">62%</span>
</div>
<div class="progress" role="progressbar" aria-label="Insurance friendly" aria-valuenow="62" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar" style="width: 62%">
</div>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Same-day appointments</span><span class="font-semibold">24%</span>
</div>
<div class="progress" role="progressbar" aria-label="Same-day appointments" aria-valuenow="24" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar" style="width: 24%">
</div>
</div>
</div>10Skill bars
A compact grid of labelled skill or score bars.
<div class="row items-center g-2 mb-2">
<div class="col-4 col-sm-3 small">
Planning
</div>
<div class="col">
<div class="progress" role="progressbar" aria-label="Planning" aria-valuenow="46" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-primary" style="width: 46%">
</div>
</div>
</div>
<div class="col-2 col-sm-1 small text-end">
46
</div>
</div>
<div class="row items-center g-2 mb-2">
<div class="col-4 col-sm-3 small">
Design
</div>
<div class="col">
<div class="progress" role="progressbar" aria-label="Design" aria-valuenow="53" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-primary" style="width: 53%">
</div>
</div>
</div>
<div class="col-2 col-sm-1 small text-end">
53
</div>
</div>
<div class="row items-center g-2 mb-2">
<div class="col-4 col-sm-3 small">
Writing
</div>
<div class="col">
<div class="progress" role="progressbar" aria-label="Writing" aria-valuenow="94" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-primary" style="width: 94%">
</div>
</div>
</div>
<div class="col-2 col-sm-1 small text-end">
94
</div>
</div>
<div class="row items-center g-2 mb-2">
<div class="col-4 col-sm-3 small">
Support
</div>
<div class="col">
<div class="progress" role="progressbar" aria-label="Support" aria-valuenow="95" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-primary" style="width: 95%">
</div>
</div>
</div>
<div class="col-2 col-sm-1 small text-end">
95
</div>
</div>11File uploads
Per-file upload rows with type icon, status text, a thin bar and a remove button.
- report.pdfComplete
- cover.png80% - 6 MB
- assets.zip58% - 8 MB
<ul class="list-group">
<li class="list-group-item"><div class="flex items-center gap-4"><span class="text-xl text-primary-ink"><i class="bi bi-file-earmark-pdf" aria-hidden="true"></i></span><div class="grow"><div class="flex justify-between small"><span class="font-semibold">report.pdf</span><span class="text-muted">Complete</span></div><div class="progress mt-1" role="progressbar" aria-label="report.pdf upload" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="height:5px"><div class="progress-bar bg-success" style="width: 100%"></div></div></div><button type="button" class="btn btn-sm btn-link link-secondary" aria-label="Remove report.pdf"><i class="bi bi-x-lg" aria-hidden="true"></i></button></div></li>
<li class="list-group-item"><div class="flex items-center gap-4"><span class="text-xl text-primary-ink"><i class="bi bi-file-earmark-image" aria-hidden="true"></i></span><div class="grow"><div class="flex justify-between small"><span class="font-semibold">cover.png</span><span class="text-muted">80% - 6 MB</span></div><div class="progress mt-1" role="progressbar" aria-label="cover.png upload" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style="height:5px"><div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 80%"></div></div></div><button type="button" class="btn btn-sm btn-link link-secondary" aria-label="Remove cover.png"><i class="bi bi-x-lg" aria-hidden="true"></i></button></div></li>
<li class="list-group-item"><div class="flex items-center gap-4"><span class="text-xl text-primary-ink"><i class="bi bi-file-earmark-zip" aria-hidden="true"></i></span><div class="grow"><div class="flex justify-between small"><span class="font-semibold">assets.zip</span><span class="text-muted">58% - 8 MB</span></div><div class="progress mt-1" role="progressbar" aria-label="assets.zip upload" aria-valuenow="58" aria-valuemin="0" aria-valuemax="100" style="height:5px"><div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 58%"></div></div></div><button type="button" class="btn btn-sm btn-link link-secondary" aria-label="Remove assets.zip"><i class="bi bi-x-lg" aria-hidden="true"></i></button></div></li>
</ul>12Goal card
A fundraising or sales goal with the amount reached and the target.
See a specialist this week
$20,640.00
raised of $24,000.00 goal
<div class="card" style="max-width:360px">
<div class="card-body">
<h3 class="h6 card-title">See a specialist this week</h3>
<p class="text-2xl font-bold mb-0">$20,640.00</p>
<p class="small text-muted">raised of $24,000.00 goal</p>
<div class="progress" role="progressbar" aria-label="Goal" aria-valuenow="86" aria-valuemin="0" aria-valuemax="100" style="height: 10px">
<div class="progress-bar bg-success" style="width: 86%">
</div>
</div>
<div class="flex justify-between small mt-2">
<span>86% funded</span><span>26 days left</span>
</div>
</div>
</div>13Storage usage
A stacked bar with a legend shows how space is split.
<div style="max-width:460px">
<div class="flex justify-between small mb-1">
<span class="font-semibold">Storage</span><span>53 GB of 100 GB</span>
</div>
<div class="progress-stacked mb-2" style="height:12px">
<div class="progress" role="progressbar" aria-label="Documents" aria-valuenow="26" aria-valuemin="0" aria-valuemax="100" style="width: 26%; height:12px">
<div class="progress-bar">
</div>
</div>
<div class="progress" role="progressbar" aria-label="Photos" aria-valuenow="16" aria-valuemin="0" aria-valuemax="100" style="width: 16%; height:12px">
<div class="progress-bar bg-warning">
</div>
</div>
<div class="progress" role="progressbar" aria-label="Backups" aria-valuenow="11" aria-valuemin="0" aria-valuemax="100" style="width: 11%; height:12px">
<div class="progress-bar bg-info">
</div>
</div>
</div>
<div class="flex flex-wrap gap-4 small">
<span><span class="inline-block rounded-full bg-primary me-1" style="width:.6rem;height:.6rem"></span>Documents</span><span><span class="inline-block rounded-full bg-warning me-1" style="width:.6rem;height:.6rem"></span>Photos</span><span><span class="inline-block rounded-full bg-info me-1" style="width:.6rem;height:.6rem"></span>Backups</span>
</div>
</div>14Wizard steps
A progress track with step labels under it for multi-step forms.
<div>
<div class="progress" role="progressbar" aria-label="Step 2 of 4" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar" style="width: 50%">
</div>
</div>
<div class="flex justify-between small mt-2">
<span class="text-primary-ink font-semibold"><i class="bi bi-check-circle-fill" aria-hidden="true"></i> Account</span><span class="text-primary-ink font-semibold"><i class="bi bi-record-circle" aria-hidden="true"></i> Details</span><span class="text-muted"><i class="bi bi-circle" aria-hidden="true"></i> Payment</span><span class="text-muted"><i class="bi bi-circle" aria-hidden="true"></i> Done</span>
</div>
</div>15Card top bar
A borderless thin bar across the top edge of a card shows that it is refreshing.
Lab tests
We measure success by how many patients come back and tell their friends.
<div class="card overflow-hidden" style="max-width:380px">
<div class="progress" role="progressbar" aria-label="Refreshing" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="height: 3px; border-radius: 0">
<div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 60%">
</div>
</div>
<div class="card-body">
<h3 class="h6 card-title">Lab tests</h3>
<p class="card-text small mb-0">We measure success by how many patients come back and tell their friends.</p>
</div>
</div>16In a table
Project rows with a bar per row; colour reflects the state.
| Project | Progress | Done |
|---|---|---|
| What to expect at your first dental visit | 58% | |
| Our favourite tips for busy weeks | 25% | |
| Sleep tips our doctors actually use | 51% | |
| What our patients asked us most | 39% |
<div class="table-responsive">
<table class="table align-middle mb-0">
<thead>
<tr>
<th scope="col">Project</th>
<th scope="col">Progress</th>
<th scope="col" class="text-end">Done</th>
</tr>
</thead>
<tbody>
<tr>
<td class="small">What to expect at your first dental visit</td>
<td style="min-width:120px"><div class="progress" role="progressbar" aria-label="Task progress" aria-valuenow="58" aria-valuemin="0" aria-valuemax="100" style="height: 6px"><div class="progress-bar" style="width: 58%"></div></div></td>
<td class="small text-end">58%</td>
</tr>
<tr>
<td class="small">Our favourite tips for busy weeks</td>
<td style="min-width:120px"><div class="progress" role="progressbar" aria-label="Task progress" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100" style="height: 6px"><div class="progress-bar bg-danger" style="width: 25%"></div></div></td>
<td class="small text-end">25%</td>
</tr>
<tr>
<td class="small">Sleep tips our doctors actually use</td>
<td style="min-width:120px"><div class="progress" role="progressbar" aria-label="Task progress" aria-valuenow="51" aria-valuemin="0" aria-valuemax="100" style="height: 6px"><div class="progress-bar" style="width: 51%"></div></div></td>
<td class="small text-end">51%</td>
</tr>
<tr>
<td class="small">What our patients asked us most</td>
<td style="min-width:120px"><div class="progress" role="progressbar" aria-label="Task progress" aria-valuenow="39" aria-valuemin="0" aria-valuemax="100" style="height: 6px"><div class="progress-bar" style="width: 39%"></div></div></td>
<td class="small text-end">39%</td>
</tr>
</tbody>
</table>
</div>17Rating breakdown
Star rating distribution, as used on review pages.
4.3 from 375 reviews
<div style="max-width:380px">
<p class="mb-2"><span class="text-2xl font-bold">4.3</span> <span class="text-muted small">from 375 reviews</span></p>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">5 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="5 star ratings" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 60%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">60%</span>
</div>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">4 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="4 star ratings" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 20%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">20%</span>
</div>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">3 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="3 star ratings" aria-valuenow="7" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 7%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">7%</span>
</div>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">2 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="2 star ratings" aria-valuenow="2" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 2%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">2%</span>
</div>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">1 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="1 star ratings" aria-valuenow="4" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 4%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">4%</span>
</div>
</div>18Checklist progress
A card that shows how many tasks of a checklist are complete.
Launch checklist
2 / 4<div class="card" style="max-width:360px">
<div class="card-body">
<div class="flex justify-between items-center mb-2">
<h3 class="h6 mb-0">Launch checklist</h3>
<span class="badge text-bg-primary">2 / 4</span>
</div>
<div class="progress" role="progressbar" aria-label="Checklist" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar bg-success" style="width: 50%">
</div>
</div>
<div class="mt-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="pt-1117" checked>
<label class="form-check-label line-through text-muted" for="pt-1117">Write the brief</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="pt-1118" checked>
<label class="form-check-label line-through text-muted" for="pt-1118">Collect feedback</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="pt-1119">
<label class="form-check-label" for="pt-1119">Prepare the files</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="pt-1120">
<label class="form-check-label" for="pt-1120">Publish</label>
</div>
</div>
</div>
</div>19Circular progress
A ring drawn with a conic gradient; set the value with the <code>--cb-p</code> variable.
<div class="flex flex-wrap gap-6">
<div class="text-center">
<div class="cb-ring" role="progressbar" aria-label="Visits" aria-valuenow="82" aria-valuemin="0" aria-valuemax="100" style="--cb-p:82;--cb-c:var(--ui-primary)">
<span>82%</span>
</div>
<div class="small mt-2">
Visits
</div>
</div>
<div class="text-center">
<div class="cb-ring" role="progressbar" aria-label="Sales" aria-valuenow="46" aria-valuemin="0" aria-valuemax="100" style="--cb-p:46;--cb-c:var(--ui-success)">
<span>46%</span>
</div>
<div class="small mt-2">
Sales
</div>
</div>
<div class="text-center">
<div class="cb-ring" role="progressbar" aria-label="Tickets" aria-valuenow="59" aria-valuemin="0" aria-valuemax="100" style="--cb-p:59;--cb-c:var(--ui-warning)">
<span>59%</span>
</div>
<div class="small mt-2">
Tickets
</div>
</div>
</div>20Plan limits
Usage meters that turn yellow and red as a limit gets close, with an upgrade link.
<div class="border rounded-md p-4" style="max-width:400px">
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Projects</span><span>4 / 10</span>
</div>
<div class="progress" role="progressbar" aria-label="Projects used" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar" style="width: 40%">
</div>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Team seats</span><span>8 / 10</span>
</div>
<div class="progress" role="progressbar" aria-label="Team seats used" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 80%">
</div>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>API calls</span><span>98 / 100k</span>
</div>
<div class="progress" role="progressbar" aria-label="API calls used" aria-valuenow="98" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-danger" style="width: 98%">
</div>
</div>
</div>
<a href="#" class="btn btn-sm btn-outline-primary"><i class="bi bi-rocket-takeoff" aria-hidden="true"></i> Upgrade plan</a>
</div>