Skip to content
+

Progress

Progress indicators commonly known as spinners, express an unspecified wait time or display the length of a process.

Progress indicators inform users about the status of ongoing processes, such as loading an app, submitting a form, or saving updates.

  • Determinate indicators display how long an operation will take.
  • Indeterminate indicators visualize an unspecified wait time.

The animations of the components rely on CSS as much as possible to work even before the JavaScript is loaded.

Circular

Circular indeterminate

The default version of CircularProgress renders an indeterminate spinner.

Press Enter to start editing
Press Enter to start editing
Press Enter to start editing

Circular determinate

To specify the loading progress of an operation, use the determinate value for the variant prop. To show the actual progress, use the value prop.

Press Enter to start editing

Circular custom scale

By default, progress values are expected in the 0–100 range. You can customize this range by using the min and max props.

Press Enter to start editing

Circular track

To have the circular track always visible, pass the enableTrackSlot prop.

Press Enter to start editing

Interactive integration

The following examples show how to integrate the CircularProgress with the Button and FAB components, creating loading states that can be triggered by user actions.

Circular with label

The example shows how to integrate the visual progress value with the CircularProgress component.

10%
Press Enter to start editing

Linear

Linear indeterminate

LinearProgress shows an indeterminate progress bar by default.

Press Enter to start editing

Linear query

To reverse the direction of the indeterminate animation, use the query value for the variant prop.

Press Enter to start editing
Press Enter to start editing

Linear determinate

To show the progress on the loading bar, use the determinate value for the variant prop, along with the value prop.

Press Enter to start editing

Linear buffer

Use the buffer value for the variant prop to show a buffer progress alongside the actual progress value. The valueBuffer prop should be greater than the value prop.

Press Enter to start editing

Linear with label

The progress value can also be displayed alongside the progress bar.

Uploading photos…

10%

Press Enter to start editing

Linear with custom value text

By default, the progress value is read by assistive technology as percentages. Use aria-valuetext when the progress value does not involve percentages.

Elevator status

Elevator at floor 1 out of 10.

Press Enter to start editing

Customization

Here are some examples of customizing the component. You can learn more about this in the overrides documentation page.


Delaying appearance

There are 3 important limits to know around response time. The ripple effect of the ButtonBase component ensures that the user feels that the UI is reacting instantaneously. Normally, no special feedback is necessary during delays of more than 0.1 but less than 1.0 second. After 1.0 second, you can display a loader to keep user's flow of thought uninterrupted.

Accessibility

Progress bars must be given an accessible name by either setting aria-labelledby that points to the id of a visible text label, or using the aria-label attribute.

Limitations

High CPU load

Under heavy load, you might lose the stroke dash animation or see random CircularProgress ring widths. You should run processor intensive operations in a web worker or by batch in order not to block the main rendering thread.

When it's not possible, you can leverage the disableShrink prop to mitigate the issue. See this issue.

Press Enter to start editing

High frequency updates

The LinearProgress uses a transition on the CSS transform property to provide a smooth update between different values. The default transition duration is 200ms. In the event a parent component updates the value prop too quickly, you will at least experience a 200ms delay between the re-render and the progress bar fully updated.

If you need to perform 30 re-renders per second or more, we recommend disabling the transition:

.MuiLinearProgress-bar {
  transition: none;
}

API

See the documentation below for a complete reference to all of the props and classes available to the components mentioned here.