CSS Loader Generator
Color Tools
Build 16 pure CSS loaders, including skeletons, progress, orbit, ripple, and equalizers. Adjust size, speed, and color, then copy HTML and CSS.
<div class="tclg-status" role="status" aria-live="polite"><span class="tclg-sr-only">Loading…</span><div class="tclg-spinner" aria-hidden="true"></div></div>
@keyframes tclg-spinner-motion { to { transform: rotate(360deg); } }
.tclg-spinner { width: 40px; height: 40px; border: 5px solid #6366f140; border-top-color: #6366f1; border-radius: 50%; animation: tclg-spinner-motion 800ms linear infinite; }
.tclg-sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
@media (prefers-reduced-motion: reduce) { .tclg-status, .tclg-status *, .tclg-status *::before, .tclg-status *::after { animation: none !important; } }How to use this tool
- Select a loader type.
- Adjust size, color, and animation speed.
- Copy the HTML and CSS for use in your project.
How CSS loaders work
A CSS loader is a small HTML shape animated with @keyframes, so the copied
snippet needs no JavaScript or image file. Choose one of 16 patterns, then adjust its size,
color, and animation duration. The generator namespaces its classes and keyframe names with
tclg- to reduce clashes when a snippet is pasted beside other styles. Most motion uses
transform and opacity, which usually avoid repeated layout work;
test the result in the page where it will appear, especially when several loaders animate at
once.
Choose a pattern for the waiting state
The catalog includes spinner, dots, bars, pulse, ring, and bouncing styles, plus orbit, ripple, equalizer, wave, chase, dual ring, flip, and hourglass animations. These small indicators fit short actions such as submitting a form or waiting for a search result. Skeleton creates three shimmering placeholder lines, which work well when a card or article layout is known before its content arrives. The indeterminate progress bar moves across a track to show ongoing work, but it does not measure completion or represent a percentage.
Accessible output and reduced motion
The “Include accessibility + reduced-motion support” option is enabled by default. Its HTML
wraps the visual shape in role="status" and aria-live="polite",
includes visually hidden “Loading…” text for assistive technology, and marks the decorative
animation as hidden. The generated CSS also includes a prefers-reduced-motion: reduce rule that stops the animation for visitors who have asked their device to reduce motion. The loader
remains as a static shape; it does not replace the actual loading message or provide progress details.
Use a spinner or bouncing dot when the wait is brief and its duration is unknown. Prefer skeleton lines when they mirror the content layout, such as rows in a dashboard, because their shape helps set expectations about what will appear. Use this indeterminate bar for an upload or calculation only while its progress cannot be measured; if your application knows the completed fraction, use a progress element that reports that value instead. In every case, remove the loading state when the operation finishes, and keep important error or completion messages available as text.
Frequently asked questions
Are these loaders pure CSS?
Yes. No JavaScript or images are required - only HTML and CSS.
Related tools
- CSS AnimationBuild a more custom keyframe sequence when the loader preset is too limited.
- Bezier EditorTune easing for smoother acceleration through each loader cycle.
- Palette GeneratorChoose coordinated colors for multi-part loading indicators.
- Particle PlaygroundExplore a richer canvas animation for full-screen waiting states.