--- title: Progress bar summary: A progress bar shows how much of a task is done. It comes in sizes and colors, and in stacked, striped, animated and indeterminate variants. 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 css-vars: progress 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'; ## Default markup Add the `.progress` class to a `
` and put a `.progress-bar` inside it. The width of the inner bar is the value.
38% Complete
## Progress size Add a size class such as `.progress-sm` to make the bar thinner or thicker. The names follow the usual Bootstrap pattern. ```html
...
```
57% Complete
45% Complete
63% Complete
82% Complete
## Progress with value If you want to display the numeric value inside the bar, place the percentage text directly in the `.progress-bar`.
10%
35%
90%
## 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.
## Native progress element The native `` element is styled too, so you can use it without any extra markup: ## Progress color Add a `bg-*` class such as `.bg-success` to the `.progress-bar` to change its color. See the [full list of available colors](/ui/base/colors) for more details.
24% Complete
45% Complete
64% Complete
38% Complete
## Multiple progress bars Put several `.progress` elements inside a `.progress-stacked` container to show the parts of a whole in one bar, for example the share of each file type in the used storage. ```html
...
```
## Striped progress You can create a striped progress bar by adding the `.progress-bar-striped` class to the `.progress-bar` element.
60% Complete
## Animated progress To animate stripes, add the `.progress-bar-animated` class to a striped progress bar.
40% Complete
## Separated progress Use `.progress-separated` to make stacked segments easier to read when values are close to each other.
## Progress background A progress bar can also be the background of a row or a tile, so the row itself fills up as the value grows. It suits a ranking or a long-running goal, such as a fundraising target. This example uses it for a ranking of countries: ## Progress background colors You can combine progress background with contextual light colors to better separate categories. ## 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 colored 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.