Empower growth and innovation with the latest UI Design insights

When a page takes two or three seconds to load, should you show a spinner or a skeleton first to keep users around?

Sep 13, 2026 Read: 5

A page that takes two or three seconds to show content: whether to use a spinner first or a skeleton first depends on two things: how long users expect to wait, and whether the layout of the incoming content is predictable. Based on practices common in 2026 projects, requests returning within 0.1 seconds get no feedback; 0.1 to 1 second uses a light spinner or inline button loading; lists and cards that take over 1 second with predictable layouts should prioritize skeleton screens; only tasks that take over 3 seconds and have estimable progress should use a progress bar. The cost of choosing the wrong pattern is not that it looks bad, but that users do not know how long they still need to wait, so they leave early or click repeatedly.

Loading feedback addresses the information gap when no response comes back, not whether the animation looks good

If users tap a button and get no response, they usually assume one of two things: the tap did not register, or the system is broken. The purpose of loading feedback is to tell users clearly that the action has been received and data is on the way. Whether it is adequate is not about whether the animation looks good, but whether it can distinguish “still processing” from “stuck.”

For this reason, more feedback is not better. Covering every request with a full-screen overlay makes an API that could return in 200 milliseconds also feel slow. A more reliable order is to first tier requests by API response time, then decide which tier needs visual feedback and which can complete silently.

  • Delays under 1 second are not perceived as lag by most people, but they can notice a flash in the interface
  • If nothing changes for more than 1 second, users begin to doubt whether their click succeeded
  • If there is no progress information for more than 3 seconds, some users will refresh, submit again, or leave
  • The core difference between a skeleton screen and a spinner: the former preserves layout expectations, while the latter only says processing is underway

How much information can a spinner, skeleton screen, or progress bar each provide?

These feedback types are not a new-versus-old replacement relationship; they correspond to different amounts of information. Treating them as styles that can be upgraded from one to another is a typical misjudgment in loading-state design.

  • Spinner: Suitable for scenarios with unpredictable duration and uncertain content structure, such as form submission or manual refresh. Low implementation cost, does not mislead about layout, but lacks a sense of progress.
  • Skeleton screen: Suitable for content areas with predictable layout, such as news lists or product cards. It uses placeholder shapes to outline the structure in advance and reduces page jumps after loading completes.
  • Progress bar: Suitable for long tasks with estimable progress, such as file uploads or batch exports. The premise is that progress advances truthfully; staying above 90% for a long time damages trust even more.
  • Inline button loading: Suitable for single-point actions, keeping the rest of the page usable and avoiding a full-screen overlay that blocks users.
  • Silent loading: Suitable for pull-to-refresh, background polling, and other scenarios where existing content is still in place; adding animation here interferes with reading.

One often overlooked boundary: a skeleton screen only works when the layout is stable. If the number of items, image ratios, or text lines differ significantly before and after loading, the skeleton screen creates a visual jump, and the experience is worse than simply using a spinner. The criterion is simple: if the height difference at the same position exceeds 10%, it is not well suited for a skeleton screen.

When choosing a pattern, you can also verify implementation and maintenance costs together. The following set reflects experience ranges common in delivery; actual figures vary with the maturity of the component library:

  • Spinner: When reusing a mature component, the typical integration time is under 0.5 person-days; maintenance cost is low; suitable for pages with unpredictable structure
  • Skeleton screen: For a single page's first implementation, the typical range is 0.5 to 2 person-days; whenever the layout changes, placeholders must change too, so long-term maintenance cost is relatively high
  • Progress bar: Requires the backend to provide an estimable progress definition; typical integration range is 1 to 3 person-days; when definitions are inconsistent, rework is more likely
  • Inline button loading and silent loading: Add almost no new structure; cost mainly lies in agreeing on state styles

Use three questions to set the order: duration first, then structure

Rather than choosing a style by feel, ask three questions in a fixed order; after that, the choice is usually clear. The order itself matters: asking about duration first filters out most unnecessary animations.

  1. How long is the wait? Tier by API response time: no feedback within 0.1 seconds; button state or light spinner from 0.1 to 1 second; skeleton screen or local spinner from 1 to 3 seconds; consider a progress bar above 3 seconds, with a cancelable entry point.
  2. Is the content structure predictable? Predictable layouts such as fixed cards or fixed tables should prioritize skeleton screens; blank pages on first entry or pages whose structure differs each time should use a spinner.
  3. Will it block other actions? If only a local area is affected, use local feedback; for actions involving global data consistency, use an overlay and disable related buttons, but avoid locking the entire page.

Do not swap the order of these three steps. First set duration; most pages do not need a skeleton screen at all. Then set structure to decide between skeleton and spinner. Finally set blocking scope to decide how much area the feedback covers. Once these three steps are done, the solution is usually unique, and review discussions become less repetitive.

Delivery reality: one loading-state rework under weak network conditions

A common situation in projects: the design mockup only shows one spinner state, and developers reuse a single global loading component for convenience, so short requests flash and long requests leave the screen empty. In 2026 delivery habits, loading-state agreements are usually completed before QA submission.

  • Constraints: Tight schedule, APIs not yet integrated, only design mockups and no real data, and some mobile users are on weak networks
  • Approach: First annotate expected duration ranges based on the API list; use skeleton screens only for the main list and the detail first screen; use local spinners elsewhere; and write loading, empty, and error states into the same interaction specification to reduce room for developers to decide on their own
  • Result: After QA submission, loading-related review issues concentrated in those two places, and other pages mostly passed in one round
  • Cost: Skipping this step usually leads to rework replacing loading components after QA submission; one to two rounds of revision are common, and weak-network issues often only surface during the gray release stage

At acceptance, check four verifiable criteria

There is no universal standard for loading feedback, but several verifiable criteria can be used at acceptance; this is far more effective than arguing about whether it looks good.

  • Flicker or not: If an API returning within 200 milliseconds causes noticeable flicker, the feedback threshold is set too conservatively
  • Jump or not: For the height difference between the skeleton screen and real content, the recommended experience range is within 10%
  • Interruptible or not: For tasks over 3 seconds, is there a cancel or back option, and can users escape if it gets stuck?
  • Consistent or not: Do similar scenarios across the product use the same feedback pattern?

The consistency criterion is especially easy to overlook. In the same product, if one list uses a spinner and another uses a skeleton screen, users will not see richness; they will think it is unfinished. This kind of inconsistency often comes from multi-person collaboration and a lack of component agreements; a short loading-feedback checklist can solve most of it.

Applicable scenarios and boundaries where it does not apply

Scenarios worth investing effort in loading feedback share several traits: API responses generally take over 1 second, content layout is stable, and users return to the same page repeatedly, such as admin lists, news feeds, and order records. In these scenarios, feedback quality directly affects users' willingness to repeat actions.

Conversely, be clear about cases where it is unnecessary. For one-off pages, content structures that differ every time, or products whose pages generally open within 300 milliseconds, the maintenance cost of skeleton screens often outweighs the benefit. Another boundary is scope: skeleton screens should cover only the first screen users actually see; content below the fold can be handled with normal loading, and covering everything slows down first render instead.

FAQ

Are more detailed skeleton screens always better?

No. A skeleton screen only needs to preserve the layout outline; aligning the positions of color blocks and the number of rows is enough. The more detail it has, the more likely it is to mismatch real content, and the higher the maintenance cost.

How long should you wait before showing a spinner?

The typical range is that it must appear after 1 second; as it approaches 3 seconds, add a line of text to prevent users from thinking the page has frozen.

Is it a big problem if a progress bar stays at 90% and does not move?

It has a significant impact. Progress should be tied to real milestones; a common approach is to give ranged feedback by stage rather than pretending to be precise to the exact percent.

What should I do if a skeleton screen keeps flashing on a weak network?

Set a minimum display time and a timeout fallback; for example, after 8 seconds switch to a retry prompt to avoid the skeleton screen flashing repeatedly for a long time.

Are admin tables better with a skeleton screen or a spinner?

Tables with a fixed layout are suitable for skeleton screens; usually they only placeholder the header and first few rows, and the row count does not need to match the real data exactly.


If your product has pages that take over 1 second to load, start with one thing: divide APIs into three tiers by response time, corresponding to no feedback, local spinner, and skeleton screen, and write this into the delivery documentation. Use skeleton screens first for main lists with stable layouts, and use progress bars only when real progress is available. If pages generally return within 300 milliseconds, keep them silent; there is no need to increase the sense of waiting just for consistency.

Are you ready?
Then reach out to us!
+86-13370032918
Discover more services, feel free to contact us anytime.
Please fill in your requirements
What services would you like us to provide for you?
Your Budget
ct.
Our WeChat
Professional technical solutions
Phone
+86-13370032918 (Manager Jin)
The phone is busy or unavailable; feel free to add me on WeChat.
E-mail
349077570@qq.com
Submitted successfully
Thank you for your trust. We will contact you soon!
Recommended projects for you