Skip to main content

Spinner vs Progress Bar vs Skeleton

Three ways to say "loading"

Data is loading. How should I show it?

Comparison table

Spinner vs Progress Bar vs Skeleton
PatternQuantifiablePreviews structureGood for waitsTypical use
Spinner加载转圈NoNoShort (<1s)Inside buttons, small widgets
Progress Bar进度条Yes (percentage)NoLong, with a known totalUpload, download, install
Skeleton骨架屏No (but implies structure)YesMedium to long (first load)Lists, cards, above-the-fold

← Swipe to see the full table

The demos, side by side

Spinner

加载转圈
A spinner only suits a short wait. Past 10 seconds, offer a "Retry" instead of making people sit and watch.

How to decide: The default for short waits

Progress Bar

进度条
0.0 MB / 8 MB uploaded0%
If you know the total, show a percentage. If you don't, don't fake progress — use the indeterminate state.

How to decide: When you know how much is left

Skeleton

骨架屏
Skeleton first, content second — while it's loading, users already know what the page will look like. Hit "Reload" to watch it again.

How to decide: The first load of a whole page

Decision rule

  • the wait is very short (one tap and it is back)use a Spinner, or nothing at all
  • you know the exact progress (upload at 40%)use a Progress Bar
  • you are loading a page or list with a predictable structureuse a Skeleton
  • the wait might exceed 10 secondsadd explanatory copy and a retry action

In one line

A Skeleton's advantage is that it shows the page's shape while people wait, so perceived waiting shrinks. Still hold it for 300ms minimum, or a fast response makes it flash and feel worse.

Related comparisons