Pure CSS loading animations – copy, paste, and customize. No JavaScript required.
The Classic Spinner is the baseline component for indicating real-time data streaming or background computations. It relies heavily on geometric precision. By establishing a symmetrical block width and height of 50px, alongside a standard border-radius: 50%, the underlying browser viewport compiles a mathematically perfect circular mask. The actual rotational movement does not translate multiple elements; instead, it uses a solid foundational light track (#e2e8f0) accented by a single high-contrast primary accent border (#3b82f6).When the browser parses the continuous loop initialized by the @keyframes spin directive, it applies hardware-accelerated rendering rules to smoothly swing the transformation coordinates from 0% to 100% up to a complete 360deg rotation. To make this component fit smaller layouts seamlessly—like nested buttons or miniature dashboard panels—developers can scale down the layout variables proportionally while maintaining a steady linear infinite timing rhythm to prevent sudden layout skips.
<div class="spinner"></div>
<style>
.spinner {
width: 50px; height: 50px;
border: 4px solid #e2e8f0;
border-top: 4px solid #3b82f6;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin { 100% { transform: rotate(360deg); } }
</style>For softer, modern interactive frameworks such as chat windows, message streams, or conversational AI interfaces, the Pulse Dots layout acts as an optimal micro-interaction. This UI model coordinates a horizontal row of multiple standard inline spans structured cleanly inside a flex wrapper (display: flex; gap: 8px;). Rather than shifting spatial layout coordinates across the X or Y axis, this indicator communicates activity by altering two safe rendering properties simultaneously: visual scale() transformations and element opacity settings.The unique layout charm of this loader relies entirely on rhythmic staggering. By using native CSS rules, developers apply an incremental animation-delay property across each subsequent dot element. When the animation runs, the elements shift fluidly between a minimized scale of 0.6 at half opacity and a fully realized scale of 1 at absolute opacity. This subtle wave effect lowers user abandonment rates by creating an intuitive feeling of momentum and ongoing server communication.
<div class="pulse-dots">
<span></span><span></span><span></span>
</div>
<style>
.pulse-dots { display: flex; gap: 8px; }
.pulse-dots span {
width: 12px; height: 12px;
background: #3b82f6; border-radius: 50%;
animation: pulse 1.4s ease-in-out infinite;
}
@keyframes pulse {
0%,80%,100% { transform: scale(0.6); opacity: 0.5; }
40% { transform: scale(1); opacity: 1; }
}
</style>The Skeleton Card represents an essential structural evolution in contemporary user experience design. Instead of showing a traditional abstract indicator while your page processes extensive data requests, skeleton modules build a placeholder blueprint that maps out the incoming content layout. This design framework structures empty blocks—like avatar placeholders (.skeleton-avatar) and content text lines (.skeleton-line)—using a neutral background base token (#e2e8f0).The animation layer drops standard rotational rules to focus strictly on an endless shimmering wave illusion. The @keyframes shimmer loop transitions the container elements between an opacity floor of 0.3 and a ceiling of 1 across an effortless 1.5s cycle. This persistent rhythmic shift tricks the human brain into experiencing significantly reduced perceived load times. This makes it a critical performance optimization strategy for social feeds, dashboard cards, and media grids.
<div class="skeleton-card">
<div class="skeleton-avatar"></div>
<div class="skeleton-line"></div>
</div>
<style>
.skeleton-avatar, .skeleton-line {
background: #e2e8f0;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
0% { opacity: 0.3; } 50% { opacity: 1; } 100% { opacity: 0.3; }
}
</style>The Animated Progress Bar provides an exceptional linear tracking option ideal for file file system syncs, image uploads, or multi-step checkout processes. The visual structure relies on a parent tracking path track container (.progress-bar-container) set to a rounded height profile of 8px. Inside this static track sits the active percentage indicators element (.progress-bar), which expands dynamically along the horizontal field.The specialized @keyframes progress rule controls an elastic acceleration arc. The bar element initializes at an absolute width constraint of 0%, surges mid-cycle up to 70%, and accelerates smoothly to terminate completely at 100% before immediately resetting back to zero. This continuous loop utilizes an ease-in-out timing metric to make the linear motion feel organic, responsive, and highly fluid to the end user.
<div class="progress-bar-container">
<div class="progress-bar"></div>
</div>
<style>
.progress-bar-container {
background: #e2e8f0; border-radius: 20px; height: 8px;
}
.progress-bar {
width: 0%; height: 8px;
background: #3b82f6; border-radius: 20px;
animation: progress 2s ease-in-out infinite;
}
@keyframes progress {
0% { width: 0%; } 50% { width: 70%; } 100% { width: 100%; }
}
</style>Get 15+ advanced loaders (skeleton tables, infinite scroll spinners, SVG loaders) in the Pro Pack.
Get Pro Pack – $7 →These free snippets took time to create. A small coffee keeps them coming.
☕ Buy Me a Coffee