Opens in a new tab

Web design

Loading animations: spinner, skeleton screen or progress bar

When a loading animation helps, which kind to use for each wait, and how to tell screen readers that something is loading and when it ends.

CheckedNovember 4, 2026
Reading time
Part ofWeb design
Listen to this guide
0:00 /7:14

Short answer: A loading animation tells people your site is working on their request. Show nothing for waits under a second, a spinner or a skeleton screen for waits up to about 10 seconds, and a progress bar for longer waits or uploads. Tell screen readers the same in a status message, and say when the wait ends.

What a loading animation is for

NN/g, the usability research group, says progress indicators reassure people that the system is working and reduce their uncertainty. They also give people something to look at, which makes the wait easier to bear.

Its response time limits help decide when to show one. About 0.1 second feels instant, about 1 second keeps the flow of thought, and about 10 seconds is the limit for keeping attention on the task.

The moment someone clicks, the page should show it got the request, for example with a button that looks pressed.

Spinner, skeleton screen or progress bar

Indicator Best for Wait
No indicator Quick answers: show the result Under 1 second
Spinner (a looped animation) One part of the page, such as a card or a video 2 to 10 seconds
Skeleton screen A full page loading, shown as gray blocks in its layout 1 to 10 seconds
Progress bar (percent done) Uploads, downloads and other long processes 10 seconds or more
Frame-only skeleton (header and footer only) Not recommended: a mostly blank screen looks broken Any wait

From NN/g’s articles on skeleton screens, progress indicators and response times, read November 4, 2026.

When to show it, and what to say

Under a second, skip the loader. NN/g says spinners and skeleton screens aren’t necessary there, and a quick flash can make people feel they can’t keep up.

Between 2 and 10 seconds, a spinner or a skeleton screen works. A short text helps too, such as “Loading comments…”, so people know why they are waiting.

From 10 seconds on, show how much is done and roughly how long is left. For long tasks, give people a way to stop.

NN/g advises against a static “Loading…” that never moves, and against warnings not to click twice. Show that the first click was accepted instead. A skeleton screen doesn’t replace speed work, such as the image changes in our lazy loading images guide.

Make the wait clear to screen readers

WCAG counts the waiting state of a page and the progress of a process as status messages. Screen readers should get them without the focus moving. In the W3C’s example, a busy icon appears after someone starts a process, and the screen reader announces “application busy”.

MDN describes the status role as a live region for advisory information, polite by default, which is where your “Loading…” text belongs. While an area loads, set aria-busy="true" on it, then set it back to false, so screen readers wait for the finished content. Our aria-live guide shows how to announce a change without moving the focus.

When the wait ends, say so. If a busy message disappears with nothing in its place, people who can’t see the screen won’t know, and the W3C suggests a status message such as “system available”.

A progress bar needs a name too. MDN notes that a <progress> element with no value is indeterminate, and that in most cases it needs an accessible label. Our aria-label guide covers how to name it.

Motion and long waits

WCAG asks for a way to pause, stop or hide moving content that starts on its own, lasts more than five seconds and runs next to other content. A preload animation can count as essential when nothing can be done during it and hiding the progress could make people think the page froze.

NN/g also notes that animated skeletons, with a pulse or a shimmer, can distract some people or create accessibility problems. Our website animation guide covers reduced motion and pause controls.

How to add a loading state

  1. Measure the real wait, on a phone too.
  2. Under about a second, show the result and skip the loader.
  3. For 2 to 10 seconds, use a spinner on the part that loads, or a skeleton screen for a full page.
  4. For 10 seconds or more, show progress, an estimate and a way to stop.
  5. Add a short text that says what is loading.
  6. Put that text in a status message, and mark the loading area busy.
  7. Say when it finishes, and let reduced motion stop the animation.

How our contact form handles the wait

Our contact form is the main way to write to us. On November 4, 2026, we tested how it handles the wait, in English and Spanish, on a computer and on a phone. A test browser held our message and never let it leave.

The send button turns busy the moment it’s pressed, so a second click can’t send the message twice. If no answer comes within 0.3 seconds, our loader fades in where the button’s label was, at the same width, and screen readers hear “Sending…”.

When the answer came back in 0.1 seconds, nothing appeared: no loader and no message. When it came back in 0.4 seconds, the loader stayed 0.36 seconds instead of blinking, because once it shows it waits at least 0.35 seconds.

When the message arrives, the form gives way to a confirmation that screen readers announce as a status message. With reduced motion turned on, the loader holds still: across 15 samples it showed a single drawing, against 9 or 10 different ones with motion on.

Before you publish

  • Quick answers show the result with no loader.
  • Waits of 2 to 10 seconds show a spinner or a skeleton screen.
  • Waits of 10 seconds or more show progress and a way to stop.
  • A short text says what is loading.
  • Screen readers hear when the wait starts and when it ends.
  • The animation holds still when reduced motion is on.

RememberA loader is a promise that something is happening. Show it only when the wait is real, say what is loading, and tell everyone when it’s done.

Forms and pages that respond clearly are part of our web design service.

Quick answers about loading animations

What is a loading animation?

A visual sign that your site is working on a request, such as a spinner, a skeleton screen or a progress bar. NN/g notes that progress indicators reassure people that the system is working and give them something to look at while they wait.

Should I use a spinner or a skeleton screen?

For a wait under 10 seconds, either can work. NN/g says spinners suit a single module, such as a card or a video, while skeleton screens suit a full page because they show its layout. Past 10 seconds, use a progress bar.

Do I need a loader for fast loads?

No. If a page loads in under a second, NN/g says spinners and skeleton screens aren’t necessary, and a quick flash can make people feel they can’t keep up. Delay the loader so it only appears when the wait is real.

How do screen readers know a page is loading?

Put a short text such as “Loading…” in a status message, which screen readers announce without moving the focus. Mark the area that is updating with aria-busy until it’s done, then say that it finished, as the W3C suggests.

Do loading animations need a pause button?

WCAG asks for a way to pause moving content that starts on its own, lasts more than five seconds and runs next to other content. The W3C treats a preload animation as essential when nothing else can be done meanwhile and hiding the progress could make people think the page froze.

Sources

Read on November 4, 2026. W3C Web Accessibility Initiative: Understanding SC 4.1.3 Status Messages (Level AA) and Understanding SC 2.2.2 Pause, Stop, Hide (Level A). MDN Web Docs: ARIA: aria-busy attribute, ARIA: status role and <progress> HTML progress indicator element. Nielsen Norman Group: Skeleton Screens 101, Progress Indicators Make a Slow System Less Insufferable and Response Times: The 3 Important Limits. Our case: our contact form, tested in a browser on November 4, 2026.

Pedro Galindez

Pedro Galindez

Founder of Feedback Studios, a bilingual growth studio in Miami.

Listen0:00 /7:14

More guides

Checked November 5, 2026

Focus indicator: how to make keyboard focus visible

What a focus indicator does, what WCAG asks for its size and contrast, and how to keep the outline that shows keyboard users where they are.

Checked November 4, 2026

CAPTCHA and reCAPTCHA: stop form spam without blocking people

What a CAPTCHA is, how reCAPTCHA works now that it’s part of Google Cloud Fraud Defense, what changed in 2026 and how to stop spam without blocking people.

Checked November 4, 2026

Live chat for your website: how to add a chat widget that doesn’t slow or cover your pages

How to add a chat widget to your website without slowing it down or hiding links: facades, the cookie notice, keyboard focus and what to test.

Checked November 4, 2026

Website caching: how page caching speeds up your site

What page caching does, what to cache and what to skip, how to set it up on WordPress and how our own page cache works.

Checked November 3, 2026

Redirect chains: what they are and how to fix them

How Google handles a redirect chain, why chains slow pages down, the usual chains, how to fix them and the ones we found on our site.

Next step

Tell us what you need

Write to us on WhatsApp or send us a message. We answer in English or Spanish.