How do you hold a user through a long loading state?
On this page
You hold a user through a long wait by communicating and chunking it, because what makes waiting bearable is not raw speed but the sense that something real is happening and that it will end. A bare spinner gives neither. It spins at the same rate whether the work is half done or barely started, it carries no estimate, and it asks the user to stare at a frozen screen and trust that the system has not died. Perceived progress beats actual progress here: a wait that shows movement toward a known finish feels shorter than a faster wait that shows nothing at all.
The levers are concrete. The first is real progress: a determinate bar, a step counter, or a status line that names what is currently underway tells the user where they are in the wait and that it is shrinking. The second is expectation-setting: even a rough sense of how long this takes converts open-ended dread into a manageable countdown, because anxiety in a wait comes mostly from not knowing whether it lasts two seconds or two minutes. The third is progressive reveal: when content can arrive in pieces, showing the parts that are ready while the rest loads keeps the user oriented and often lets them start reading or acting before everything has finished. The fourth is orientation: a skeleton screen that lays out the shape of what is coming reassures the user that the page is building rather than broken.
A designer recognizes the difference the moment a dashboard loads. The weak version shows a centered spinner over a blank canvas for eight seconds, and every one of those seconds the user wonders whether to refresh. The strong version paints the layout immediately as gray skeleton blocks, fills the header and navigation first because they load fast, streams the chart in as its data arrives, and shows a quiet “loading recent activity” line where the slow widget will land. Nothing is actually faster, but the user has been reading the page the whole time and never once doubted it was working.
Note one exception: these techniques are for genuinely long or unpredictable waits, and they have to be honest. A fake progress bar that crawls to ninety percent and stalls is worse than a spinner, because it promises a finish it cannot keep and trains users to distrust the indicator. A skeleton screen that never resolves into content reads as a permanent broken state. And for a wait under roughly a second, the working guide is to do less, not more, since a flash of skeleton or a spinner that appears and vanishes is more jarring than a brief, quiet pause. Match the device to the wait: instant feedback for short delays, full communication and chunking for the long ones.
When you face a long loading state, reach for the levers before you reach for the spinner. Show real progress where you can measure it, set an honest expectation of how long it will take, reveal content in pieces so the user can start before the whole is ready, and keep a skeleton or status in view so the screen never looks dead. Treat the spinner as the last resort for the rare case where nothing else is knowable, not the default for every wait.