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.