Skip to main content
Understanding browser support helps you choose the right animation techniques and implement appropriate fallbacks.

CSS animation support

CSS animations and transforms have excellent browser support.

Core features (100% support)

CSS Transitions

Supported in all modern browsers since 2012

CSS Animations

@keyframes and animation properties universally supported

2D Transforms

translate, rotate, scale, skew - full support

Opacity

Opacity transitions work everywhere

Advanced features

FeatureChromeFirefoxSafariEdge
3D Transforms✅ All✅ All✅ All✅ All
will-change✅ 36+✅ 36+✅ 9.1+✅ 79+
prefers-reduced-motion✅ 74+✅ 63+✅ 10.1+✅ 79+
scroll-timeline✅ 115+⚠️ Flag❌ No✅ 115+

Vendor prefixes (legacy)

Modern browsers don’t need prefixes, but for older browser support:
.element {
  -webkit-animation: slide 1s;  /* Safari < 9, Chrome < 43 */
  animation: slide 1s;
}

@-webkit-keyframes slide {
  from { -webkit-transform: translateX(0); }
  to { -webkit-transform: translateX(100px); }
}

@keyframes slide {
  from { transform: translateX(0); }
  to { transform: translateX(100px); }
}
Tools like Autoprefixer automatically add vendor prefixes based on your browser support targets.

JavaScript API support

Web Animations API (WAAPI)

element.animate(
  [{ transform: 'translateX(0)' }, { transform: 'translateX(100px)' }],
  { duration: 1000, easing: 'ease-out' }
)
Support: Chrome 36+, Firefox 48+, Safari 13.1+, Edge 79+ Polyfill: web-animations-js

requestAnimationFrame

const animate = () => {
  // Update animation state
  requestAnimationFrame(animate)
}
requestAnimationFrame(animate)
Support: ✅ Universal support in all modern browsers

IntersectionObserver (scroll triggers)

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('animate')
    }
  })
})
Support: Chrome 51+, Firefox 55+, Safari 12.1+, Edge 79+

Library compatibility

Animation libraries used in the playground:

Framer Motion

  • Browser support: Chrome, Firefox, Safari, Edge (last 2 versions)
  • Bundle size: ~50KB minified
  • Fallbacks: Automatically disables complex features in unsupported browsers
"browserslist": [
  ">0.2%",
  "not dead",
  "not op_mini all"
]

GSAP (GreenSock)

  • Browser support: IE11+, all modern browsers
  • Bundle size: ~50KB for core
  • Fallbacks: Comprehensive legacy browser support built-in

React Spring

  • Browser support: Same as React (IE11+ with polyfills)
  • Bundle size: ~35KB
  • Fallbacks: Works with interpolation in older browsers

Feature detection

Test for support before using advanced features:

CSS feature detection

const supportsTransform = CSS.supports('transform', 'translateX(10px)')
const supportsBackdropFilter = CSS.supports('backdrop-filter', 'blur(10px)')

if (supportsTransform) {
  // Use transform animations
} else {
  // Fallback to position animations
}

Intersection Observer detection

if ('IntersectionObserver' in window) {
  // Use IntersectionObserver for scroll animations
  const observer = new IntersectionObserver(callback)
} else {
  // Fallback to scroll event listeners
  window.addEventListener('scroll', handleScroll)
}

Reduced motion preference

const prefersReducedMotion = window.matchMedia(
  '(prefers-reduced-motion: reduce)'
).matches

if (prefersReducedMotion) {
  // Disable or simplify animations
}

Fallback strategies

Start with basic functionality, add animations as enhancement:
.card {
  /* Base styles - work everywhere */
  padding: 1rem;
  background: white;
}

@media (prefers-reduced-motion: no-preference) {
  .card {
    /* Enhanced: Add smooth transitions */
    transition: transform 0.3s ease;
  }
  
  .card:hover {
    transform: translateY(-4px);
  }
}

Testing across browsers

1

Use browser DevTools

Chrome DevTools → More Tools → Rendering → Emulate CSS media featuresTest prefers-reduced-motion without changing OS settings.
2

BrowserStack/Sauce Labs

Test on real devices and browser versions:
  • iOS Safari (especially important - has quirks)
  • Android Chrome
  • Legacy browsers if needed
3

Can I Use

Check caniuse.com for specific feature support:
  • CSS animations
  • Transform 3D
  • Web Animations API
  • IntersectionObserver

Common browser-specific issues

Safari

Safari requires -webkit- prefix for some 3D transform properties. Also has quirks with will-change and backdrop-filter.
.element {
  -webkit-backface-visibility: hidden;  /* Safari */
  backface-visibility: hidden;
}

iOS Safari

  • Scroll animations may not work in iframes
  • Fixed positioning with transforms can be glitchy
  • Hardware limits on number of simultaneous animations

Firefox

  • Older versions had issues with large blur() values
  • Some 3D transform performance differences

Next.js deployment (Vercel)

The Animation Playground is a Next.js app optimized for Vercel:
// vercel.json
{
  "buildCommand": "next build",
  "outputDirectory": ".next",
  "cleanUrls": true
}
Browser support target:
// package.json
"browserslist": [
  ">0.2%",
  "not dead",
  "not ie 11",
  "not op_mini all"
]

Recommendations

Modern browsers

Use all features freely - transform, opacity, Web Animations API, etc.

Respect user preferences

Always check prefers-reduced-motion and provide alternatives

Test on mobile

iOS Safari can behave differently than desktop Safari

Monitor bundle size

Animation libraries add significant KB - use tree-shaking

Build docs developers (and LLMs) love