Overview
Animation features include:- Smooth Transitions for interactive elements
- Loading Animations for better perceived performance
- Scroll Animations for engaging content reveals
- Hover Effects for interactive feedback
- Performance Optimized animations
- Accessibility Compliant motion design
Animation Types
Transitions
Copy
/* Base transition variables */
:root {
--transition-fast: 0.15s ease;
--transition-normal: 0.3s ease;
--transition-slow: 0.5s ease;
--transition-bounce: 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
/* Button transitions */
.btn {
transition: all var(--transition-normal);
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
/* Card transitions */
.card {
transition: transform var(--transition-normal), box-shadow var(--transition-normal);
}
.card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
}
/* Link transitions */
a {
transition: color var(--transition-fast);
}
a:hover {
color: var(--color-primary);
}
Loading Animations
Copy
/* Spinner animation */
.spinner {
width: 40px;
height: 40px;
border: 4px solid var(--color-border);
border-top: 4px solid var(--color-primary);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Skeleton loading */
.skeleton {
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: skeleton-loading 1.5s infinite;
}
@keyframes skeleton-loading {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
/* Fade in animation */
.fade-in {
opacity: 0;
animation: fadeIn 0.6s ease forwards;
}
@keyframes fadeIn {
to { opacity: 1; }
}
Scroll Animations
Copy
/* Reveal on scroll */
.reveal {
opacity: 0;
transform: translateY(30px);
transition: all 0.6s ease;
}
.reveal.revealed {
opacity: 1;
transform: translateY(0);
}
/* Stagger children */
.reveal-stagger > * {
opacity: 0;
transform: translateY(30px);
transition: all 0.6s ease;
}
.reveal-stagger.revealed > * {
opacity: 1;
transform: translateY(0);
}
.reveal-stagger.revealed > *:nth-child(1) { transition-delay: 0.1s; }
.reveal-stagger.revealed > *:nth-child(2) { transition-delay: 0.2s; }
.reveal-stagger.revealed > *:nth-child(3) { transition-delay: 0.3s; }
.reveal-stagger.revealed > *:nth-child(4) { transition-delay: 0.4s; }
JavaScript Implementation
Scroll Animations
Copy
// Intersection Observer for scroll animations
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('revealed');
}
});
}, observerOptions);
// Observe elements with reveal class
document.querySelectorAll('.reveal, .reveal-stagger').forEach(el => {
observer.observe(el);
});
Loading States
Copy
// Show loading state
function showLoading(element) {
element.classList.add('loading');
element.innerHTML = '<div class="spinner"></div>';
}
// Hide loading state
function hideLoading(element, content) {
element.classList.remove('loading');
element.innerHTML = content;
}
// Skeleton loading
function showSkeleton(element) {
element.classList.add('skeleton');
element.innerHTML = '<div class="skeleton-placeholder"></div>';
}
Performance Optimization
Hardware Acceleration
Copy
/* Use transform and opacity for better performance */
.animate {
transform: translateZ(0); /* Force hardware acceleration */
will-change: transform, opacity;
}
/* Avoid animating layout properties */
.performance-friendly {
/* Good: transform, opacity */
transform: scale(1.1);
opacity: 0.8;
/* Avoid: width, height, margin, padding */
/* width: 200px; */
/* margin: 20px; */
}
Reduced Motion
Copy
/* Respect user's motion preferences */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* Custom reduced motion class */
.reduced-motion {
animation: none !important;
transition: none !important;
}
Animation Best Practices
Accessibility
Copy
/* Focus indicators */
.focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
}
/* High contrast mode */
@media (prefers-contrast: high) {
.btn:hover {
outline: 2px solid currentColor;
}
}
Performance
Copy
/* Optimize animations */
.optimized-animation {
/* Use transform instead of position changes */
transform: translateX(100px);
/* Use opacity for fade effects */
opacity: 0;
/* Avoid layout-triggering properties */
/* left: 100px; */
/* width: 200px; */
}