Skeleton CSS Loader Generator
Generate animated skeleton loader CSS (shimmer) for content placeholders.
Skeleton screens: perceived performance over raw speed
A skeleton loader (or skeleton screen) is a low-fidelity placeholder that mirrors the layout of the final content while the real data is still loading. Popularised by Facebook around 2014 and quickly adopted by LinkedIn, YouTube, Slack and Medium, the technique replaces a generic spinner with a grey wireframe of the page about to appear. The user immediately understands the structure β "there will be an avatar here, three lines of text, a picture below" β which makes the wait feel shorter even when the actual load time has not changed. This is the classic perceived performance win: you have not made the page faster, you have made the wait feel productive.
.skeleton {
background: linear-gradient(90deg,
#eee 0%, #f5f5f5 50%, #eee 100%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
There is a second, less obvious win: skeleton screens reduce Cumulative Layout Shift (CLS), one of Google's Core Web Vitals. When you reserve the exact rectangle the avatar, the heading and the body text will occupy, content drops in without pushing anything sideways and CLS stays near zero. Spinners do the opposite β the page collapses to a tiny icon and then re-expands when data arrives, often shoving content under the user's finger right as they tap.
Pulse, shimmer or wave?
- Pulse β opacity oscillates between roughly 0.5 and 1. Cheap, calm, the default in Tailwind via
animate-pulse. - Shimmer β a bright band slides across a darker background. The Facebook look; reads as "loading" without words.
- Wave β a soft gradient travels in one direction, less aggressive than shimmer. Material UI's default.
When to use a skeleton (and when not to)
Skeletons shine when the layout is predictable: a feed of cards, a profile page, a product listing. They also help on slow or unstable mobile networks, where every saved frame of frustration is a saved user. Avoid them when the structure is unpredictable (search results that may be empty, dynamic dashboards), inside forms (use a disabled input instead) or on buttons (an inline spinner is clearer). The sweet spot is the 200 msβ3 s range: under 200 ms the content appears before the skeleton renders, and over 5 s users expect a more informative status β an estimated time, a step counter, or an explicit message.
Accessibility
Wrap the skeleton container with aria-busy="true" and aria-live="polite" so screen readers announce the wait without spamming. Honour @media (prefers-reduced-motion: reduce) by stopping the shimmer (keep the grey blocks, drop the animation) β the moving gradient can be uncomfortable for users with vestibular disorders. Make the placeholder colour theme-aware with CSS custom properties so it adapts to dark mode without a second stylesheet.
FAQ
Should I build skeletons with SVG or plain divs? Plain divs and CSS are easier to author, maintain and theme. SVG-based libraries like react-content-loader are useful when you want a single asset that scales perfectly across breakpoints or when the placeholder shape is genuinely irregular.
How do I keep the skeleton in sync with the real layout? Author the skeleton inside the same component as the loaded view, swapping by a loading flag. Sharing CSS classes (paddings, grid columns) guarantees the dimensions match and CLS stays at zero.
Do skeletons make the page actually faster? No β the data still takes the same time. What changes is the perception of speed and the user's tolerance for waiting. The win is psychological, not technical.
Is there an upper limit on wait time? Yes. Above 3β5 s, a static skeleton starts to feel broken β users wonder if the page is frozen. Replace it with a progress message, an ETA, or the option to retry.
Related Tools
Handwriting Generator
Convert typed text into an image with handwriting appearance. Useful for adding a personal touch to digital work.
Resume Generator
Fill a simple printable A4 CV from a form with personal data, education and experience.
Favicon Generator
Generate a favicon from text/emoji in all common sizes (16, 32, 48, 64, 192, 512). PNG download.