7 Pure CSS1 with JSPublished 2026-10-04Free · no sign-up
Eight skeleton screens that show the shape of content while it loads: a product card with a shimmer, a contact list, a full article, a table, a profile header, a product grid, a chat thread and a complete demo that swaps the skeleton for real content.
A placeholder card that shows the shape of the content while it loads: an image block, a title line and two text lines. A light band sweeps across using an animated background gradient, and the card is marked aria-busy with a hidden Loading label.
Placeholder rows for a message or contact list, each with a round avatar and two lines of different widths. Varying the widths makes the skeleton look like real text instead of a grid of identical bars, which feels more natural.
A full article placeholder: a wide hero image, a heading in two lines, author details and paragraphs. Using the real page layout for the skeleton means nothing jumps when the content arrives, which keeps the cumulative layout shift score low.
A dashboard table placeholder with a header row and five body rows. Real column headers stay visible while the cells load, so people know what is coming, and the pulse animation is staggered by row with a custom property for a gentle wave.
A profile page placeholder with a cover banner, an overlapping round avatar, a name line and three stat blocks. The avatar overlap is done with a negative margin, matching the loaded design exactly so the swap from skeleton to content is seamless.
Four product placeholders in a responsive grid, the same columns as the real catalogue. Each tile has an image block, a name and a price bar; the shimmer is one gradient fixed to the viewport with background-attachment, so all tiles shimmer in sync.
A card that shows its skeleton for a moment and then swaps in the real content, the full pattern rather than just the placeholder. aria-busy flips from true to false when the content arrives, and a Reload button lets you replay the transition.
Placeholder chat bubbles that alternate left and right, with different widths, to suggest a conversation loading. The bubble shapes match real messages, including the flattened corner on the speaker's side, so the loaded thread lines up exactly.
A skeleton should use the same sizes and spacing as the finished content, so nothing moves when the real data arrives. That keeps your Cumulative Layout Shift score low and makes loading feel faster.
Shimmer or pulse
A moving shimmer is an animated gradient over grey blocks; a pulse simply fades the blocks in and out. Both are fine; keep them subtle, and switch them off with prefers-reduced-motion.
Tell assistive technology
Skeleton blocks mean nothing to a screen reader. Mark the loading region with aria-busy="true" and a label such as Loading products, then set aria-busy to false when the content is in place.
Do not overuse them
Skeletons help when loading takes more than about half a second. For instant content they only add flicker, so show them after a short delay or only on slow requests.
Frequently asked questions
Are skeleton screens better than spinners?
For content-shaped areas such as cards and lists, usually yes, because they show what is coming and reduce perceived waiting.
Do these need JavaScript?
Only the swap demo, to simulate content arriving.
Can one shimmer cover several tiles?
Yes. The product grid uses a fixed background so every tile shimmers in sync.