Skip to main content
LanguageEnglish
Basics5 min readOctober 2026

How should a loading state work?

Short answer

A good loading state tells people that something is happening, roughly how long it will take and what will appear. For very short waits, show nothing or a subtle change. For a few seconds, use a skeleton or a spinner near where the content will appear. For long tasks, show progress and let people keep working or cancel.

Core Takeaway

  • Match the indicator to the wait: none, subtle, spinner or skeleton, then progress
  • Skeletons work best when the layout of the coming content is known
  • Show the loading state where the content will appear, not only in a corner
  • Keep the button that started the action in a loading state to prevent double submits
  • Respect reduced-motion settings and keep loading animation calm

Loading states exist to answer one question for the user: is anything happening? Without an answer, people tap again, reload the page or leave. The right answer depends on how long they wait.

For very short waits, under about a tenth of a second, most people do not notice a delay, so an indicator only adds flicker. A common technique is to wait briefly before showing a spinner, so fast responses never show one at all.

For waits of a second or a few seconds, show feedback where the result will appear. A skeleton screen, a grey outline of the coming layout, works well for lists, cards and profiles because it shows what is coming and reduces layout shift. A spinner works for small areas or when the result has no predictable shape.

For long tasks such as uploads, exports or AI generation, show real progress if you can measure it, explain what is happening and let people cancel or continue with other work. A spinner that turns for a minute with no other information feels like a failure.

The control that started the action needs a state too. A submit button that switches to a loading state, and cannot be pressed twice, prevents duplicate orders and messages. When loading ends, move clearly to success or error rather than silently returning to default.

Animation helps here, but keep it calm and short in a loop, and respect the reduced-motion setting. ExodeUI, which we make, lets you design a loader or a button with loading, success and error states in one file that your code switches between.

Frequently asked questions

Spinner or skeleton screen: which is better?

Skeletons are better when you know the shape of the coming content, such as a list or a card. Spinners are better for small areas or unknown content.

How long before showing a loading indicator?

Many teams wait a few hundred milliseconds so that fast responses never flash a spinner. Test with your real response times.

Should a loading animation loop forever?

Only while the task is genuinely running. If it takes much longer than expected, show a message, progress or a way to cancel.

How do I show loading in a button?

Replace or accompany the label with a small indicator, keep the button size the same so the layout does not jump, and block repeat presses until the request ends.

Related Guides & Examples

Try a button with real loading states

Open interactive examples with loading, success and error states, built as real ExodeUI files you can edit.

Open the examples
ExodeUI

EXODEUI DESKTOP

A little space for good ideas.

Choose your platform to get the official ExodeUI installer.

Looking for Intel Mac or other builds? Explore the web studio or check all download options.

Prefer the browser? Try for free in your browser →