use UI

Progress Bar vs Spinner

One question decides it: can you measure completion? If you can, a bar turns an open-ended wait into a bounded one and makes a stall visible — a bar that stops moving says something a spinner never can. If you cannot, a bar has nothing honest to draw, and faking the fill is worse than a spinner, because it promises an estimate that does not exist. Long operations often need both in sequence: measurable while bytes are moving, unmeasurable once the server takes over.

If you can measure how much is done, draw a bar. If you can only tell that something is running, spin.

Progress Bar

An indicator showing how much of a known-length operation is complete.

Reach for it when

  • You can measure completion — bytes uploaded, files processed, steps finished out of a known total.
  • The wait is long enough that “is this stuck?” becomes a real question, roughly past a couple of seconds.
  • The user has to decide whether to wait or leave, and the remaining time is what they are deciding on.

Avoid it when

  • You cannot measure it. An indeterminate bar and a spinner say the same thing, and the spinner is not pretending to be a measurement.
  • The wait is under a second. The bar appears and vanishes, which reads as a flash of broken layout.
  • You would have to fake it. A bar that crawls to 90% and waits there teaches people to distrust every bar you draw.

Spinner

A small looping animation shown while an operation is in flight, indicating activity but not progress.

Reach for it when

  • The wait follows a direct action — submitting a form, saving, deleting — and the spinner can sit on the control that was pressed.
  • The area is too small for a meaningful skeleton, like inside a button or next to an input.
  • You genuinely cannot predict the resulting layout, so a skeleton would guess wrong.
  • The wait is short and roughly bounded — under a couple of seconds.

Avoid it when

  • Initial page or list loads where the layout is known. A skeleton communicates more and prevents layout shift.
  • Operations that take more than a few seconds. Without progress information a spinner is indistinguishable from a hang — use a progress bar and say what is happening.
  • Several spinners on one screen. A page of rotating circles reads as chaos; prefer one region-level indicator.
  • Blocking the whole screen for something that only affects one part of it.