Skip to main content

Style Preset

Layout Template

Animation

Colors

Dimensions

Animation Settings

Add Elements

Preview Options

Live Preview

Common Use Cases

📱
Mobile Apps

Content loading placeholders

📊
Dashboards

Data fetching states

🛒
E-commerce

Product grid loading

📝
Blogs

Article list loading

CSS

/* Skeleton Loader Styles */
.skeleton-container {
  display: block;
  
  
  
  gap: 12px;
  padding: 16px;
  max-width: 320px;
}

.skeleton {
  background-color: #e0e0e0;
  border-radius: 4px;
  display: inline-block;
  background: linear-gradient(
    90deg,
    #e0e0e0 0%,
    #f5f5f5 50%,
    #e0e0e0 100%
  );
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.5s ease-in-out infinite;
}

.skeleton-circle {
  border-radius: 50%;
}

.skeleton-text {
  border-radius: 4px;
}

@keyframes skeleton-shimmer {
  0% {
    background-position: 200% 0;
  }
  100% {
    background-position: -200% 0;
  }
}

HTML

<!-- Skeleton Loader -->
<div class="skeleton-container">
  <div class="skeleton " style="width: 100%; height: 200px;" aria-label="Loading image"></div>
  <div class="skeleton skeleton-text" style="width: 80%; height: 24px;" aria-label="Loading title"></div>
  <div class="skeleton skeleton-text" style="width: 60%; height: 16px;" aria-label="Loading subtitle"></div>
  <div class="skeleton skeleton-text" style="width: 100%; height: 48px;" aria-label="Loading description"></div>
  <div class="skeleton " style="width: 100px; height: 36px;" aria-label="Loading button"></div>
</div>

React Component

import './Skeleton.css';

function SkeletonLoader() {
  return (
    <div className="skeleton-container">
      <div
        className="skeleton"
        style={{ width: '100%', height: '200px' }}
        aria-label="Loading image"
      />
      <div
        className="skeleton skeleton-text"
        style={{ width: '80%', height: '24px' }}
        aria-label="Loading title"
      />
      <div
        className="skeleton skeleton-text"
        style={{ width: '60%', height: '16px' }}
        aria-label="Loading subtitle"
      />
      <div
        className="skeleton skeleton-text"
        style={{ width: '100%', height: '48px' }}
        aria-label="Loading description"
      />
      <div
        className="skeleton"
        style={{ width: '100px', height: '36px' }}
        aria-label="Loading button"
      />
    </div>
  );
}

export default SkeletonLoader;

Skeleton Loader Best Practices

Performance

  • Use CSS animations over JavaScript for better performance
  • Keep animation duration between 1-2 seconds
  • Limit the number of animated elements on screen
  • Use will-change sparingly to hint GPU acceleration

Design

  • Match skeleton shapes to actual content layout
  • Use subtle color differences (10-15% lighter/darker)
  • Keep consistent border radius with your design system
  • Avoid too many different heights - keep it simple

User Experience

  • Show skeletons immediately while data loads
  • Avoid skeleton flash for fast loads (<300ms)
  • Use skeletons for primary content, spinners for actions
  • Maintain layout stability when content loads

Accessibility

  • Use aria-busy="true" on loading containers
  • Add aria-label for screen reader context
  • Respect prefers-reduced-motion preference
  • Don't rely on animation alone to indicate loading

Need Custom Loading Experiences?

Our team can create polished loading states and animations tailored to your brand.

Work With Brix340

Rate this tool