Files

245 lines
11 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Progress bar
summary: A progress bar is used to provide feedback on an action status and inform users about current progress. Although it is a small interface element, it is extremely helpful in managing user expectations and preventing abandonment of an initiated process.
description: Show task progress with progress bars. Set the value, color, and size, or use indeterminate bars for unknown durations.
related: [/ui/components/progress-step, /ui/components/spinner]
source: core/scss/ui/_progress.scss
classnames:
component:
- class: progress
desc: Track element
part:
- class: progress-bar
desc: The filled part; set its width and the ARIA value on it
style:
- class: progress-bar-striped
desc: Diagonal stripes over the fill
modifier:
- class: progress-stacked
desc: Wrapper for several tracks shown as one bar
- class: progress-separated
desc: Adds a gap between stacked segments
behavior:
- class: progress-bar-animated
desc: Animates the stripes
- class: progress-bar-indeterminate
desc: Looping animation for an unknown amount of progress
color:
- class: bg-{color}
desc: Any base color on the bar, for example bg-success
size:
- class: progress-sm
desc: Thin track
- class: progress-lg
desc: Thick track
- class: progress-xl
desc: Extra thick track
---
import Example from '@components/Example.astro';
import ProgressBg from '@ui/ProgressBg.astro';
import CodeDocs from '@components/CodeDocs.astro';
## Default markup
To create a default progress bar, add a `.progress` class to a `<div>` element. Thanks to that, you will be able to notify users how long they have to wait for a process to complete.
<Example>
<div class="progress"><div class="progress-bar" style="width: 38%" role="progressbar" aria-valuenow="38" aria-valuemin="0" aria-valuemax="100" aria-label="38% Complete"><span class="visually-hidden">38% Complete</span></div></div>
</Example>
## Progress size
Using Bootstrap’s typical naming structure, you can create a standard progress bar or scale it up or down to different sizes based on what’s needed.
```html
<div class="progress progress-sm">...</div>
```
Look at the example below to see how it works:
<Example columnFullWidth>
<div class="progress progress-sm">
<div class="progress-bar" style="width: 57%" role="progressbar" aria-valuenow="57" aria-valuemin="0" aria-valuemax="100" aria-label="57% Complete">
<span class="visually-hidden">57% Complete</span>
</div>
</div>
<div class="progress">
<div class="progress-bar" style="width: 45%" role="progressbar" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" aria-label="45% Complete">
<span class="visually-hidden">45% Complete</span>
</div>
</div>
<div class="progress progress-lg">
<div class="progress-bar" style="width: 63%" role="progressbar" aria-valuenow="63" aria-valuemin="0" aria-valuemax="100" aria-label="63% Complete">
<span class="visually-hidden">63% Complete</span>
</div>
</div>
<div class="progress progress-xl">
<div class="progress-bar" style="width: 82%" role="progressbar" aria-valuenow="82" aria-valuemin="0" aria-valuemax="100" aria-label="82% Complete">
<span class="visually-hidden">82% Complete</span>
</div>
</div>
</Example>
## Progress with value
If you want to display the numeric value inside the bar, place the percentage text directly in the `.progress-bar`.
<Example columnFullWidth>
<div class="progress progress-lg">
<div class="progress-bar" style="width: 10%" role="progressbar" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100" aria-label="10% Complete"> 10% </div>
</div>
<div class="progress progress-lg">
<div class="progress-bar" style="width: 35%" role="progressbar" aria-valuenow="35" aria-valuemin="0" aria-valuemax="100" aria-label="35% Complete"> 35% </div>
</div>
<div class="progress progress-lg">
<div class="progress-bar" style="width: 90%" role="progressbar" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100" aria-label="90% Complete"> 90% </div>
</div>
</Example>
## Indeterminate progress
You can create a progress bar which shows indeterminate progress by adding `.progress-bar-indeterminate` to the `.progress-bar` element. Leave `aria-valuenow` off - a `progressbar` with no value is what tells a screen reader the amount is unknown, rather than zero.
<Example>
<div class="progress progress-sm" role="progressbar" aria-label="Loading"><div class="progress-bar progress-bar-indeterminate"></div></div>
</Example>
## Native progress element
You can also use the native HTML5 `<progress>` element. It is a great way to create a progress bar without the need for additional HTML elements. This is what it looks like:
<Example>
<progress class="progress progress-sm" value="15" max="100" />
</Example>
## Progress color
You can change the color of the progress bar by adding a color class to the `.progress-bar` element. You can use the color classes like `.bg-primary`, `.bg-success`, etc. to change the color of the progress bar.
See the [full list of available colors](/ui/base/colors) for more details.
<Example columnFullWidth>
<div class="progress">
<div class="progress-bar bg-red" style="width: 24%" role="progressbar" aria-valuenow="24" aria-valuemin="0" aria-valuemax="100" aria-label="24% Complete">
<span class="visually-hidden">24% Complete</span>
</div>
</div>
<div class="progress">
<div class="progress-bar bg-green" style="width: 45%" role="progressbar" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" aria-label="45% Complete">
<span class="visually-hidden">45% Complete</span>
</div>
</div>
<div class="progress">
<div class="progress-bar bg-purple" style="width: 64%" role="progressbar" aria-valuenow="64" aria-valuemin="0" aria-valuemax="100" aria-label="64% Complete">
<span class="visually-hidden">64% Complete</span>
</div>
</div>
<div class="progress">
<div class="progress-bar bg-blue" style="width: 38%" role="progressbar" aria-valuenow="38" aria-valuemin="0" aria-valuemax="100" aria-label="38% Complete">
<span class="visually-hidden">38% Complete</span>
</div>
</div>
</Example>
## Multiple progress bars
You can stack multiple progress bars on top of each other to create a visually appealing design. This can be done by adding multiple `.progress` elements inside a `.progress-stacked` container.
```html
<div class="progress-stacked">
<div class="progress">...</div>
</div>
```
This is how it looks:
<Example vertical column>
<div class="progress-stacked">
<div class="progress" style="width: 15%" role="progressbar" aria-valuenow="15" aria-valuemin="0" aria-valuemax="100" aria-label="15% of total">
<div class="progress-bar"></div>
</div>
<div class="progress" style="width: 30%" role="progressbar" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100" aria-label="30% of total">
<div class="progress-bar bg-success"></div>
</div>
<div class="progress" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" aria-label="20% of total">
<div class="progress-bar bg-info"></div>
</div>
</div>
</Example>
## Striped progress
You can create a striped progress bar by adding the `.progress-bar-striped` class to the `.progress-bar` element.
<Example>
<div class="progress"><div class="progress-bar progress-bar-striped" style="width: 60%" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" aria-label="60% Complete"><span class="visually-hidden">60% Complete</span></div></div>
</Example>
## Animated progress
To animate stripes, add the `.progress-bar-animated` class to a striped progress bar.
<Example columnFullWidth>
<div class="progress">
<div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 40%" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" aria-label="40% Complete"><span class="visually-hidden">40% Complete</span></div>
</div>
</Example>
## Separated progress
Use `.progress-separated` to make stacked segments easier to read when values are close to each other.
<Example vertical column>
<div class="progress-stacked">
<div class="progress progress-separated" style="width: 10%" role="progressbar" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100" aria-label="10% of total">
<div class="progress-bar bg-blue"></div>
</div>
<div class="progress progress-separated" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" aria-label="20% of total">
<div class="progress-bar bg-red"></div>
</div>
<div class="progress progress-separated" style="width: 30%" role="progressbar" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100" aria-label="30% of total">
<div class="progress-bar bg-green"></div>
</div>
<div class="progress progress-separated" style="width: 40%" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" aria-label="40% of total">
<div class="progress-bar bg-yellow"></div>
</div>
</div>
</Example>
## Progress background
By using a progress bar component as a background element, designers can create a dynamic and engaging visual experience for users. For example, the progress bar could be used to represent the completion of a long-term goal or project, such as a fundraising campaign or construction project. As users interact with the
page, the progress bar could gradually fill up, creating a sense of momentum and progress.
Thanks to this you can create a nice looking statistics section:
<Example columnFullWidth>
<ProgressBg value={65} text="Poland" showValue />
<ProgressBg value={35} text="Germany" showValue />
<ProgressBg value={28} text="United States" showValue />
<ProgressBg value={20} text="United Kingdom" showValue />
<ProgressBg value={15} text="France" showValue />
</Example>
## Progress background colors
You can combine progress background with contextual light colors to better separate categories.
<Example columnFullWidth>
<ProgressBg value={75} text="Success" color="success" showValue /> <ProgressBg value={60} text="Warning" color="warning" showValue /> <ProgressBg value={40} text="Danger" color="danger" showValue /> <ProgressBg value={90} text="Info" color="info" showValue />
</Example>
## Accessibility
- Put `role="progressbar"` with `aria-valuenow`, `aria-valuemin` and `aria-valuemax` on the element that carries the value, and give it an `aria-label`. Without them a bar is a coloured box with no meaning.
- On a stacked bar the width sits on each `.progress` segment, so the role and the value belong there, not on the inner `.progress-bar`.
- An indeterminate bar keeps the role but has no `aria-valuenow`. A missing value is what says "unknown", while `aria-valuenow="0"` says "nothing done yet".
- Repeat the number in text next to the bar, or in a `visually-hidden` span inside it. Not every screen reader announces a progress value on its own.
- Do not update the value on every frame. Screen readers announce each change, so round to whole percentages and update only when the number really moves.
## SCSS variables
Use these SCSS variables to customize progress bars. The default values are:
<CodeDocs name="progress-variables" file="core/scss/_variables.scss" />