Use when animation is limited by browser support, platform capabilities, or technical requirements
Work within platform limitations while preserving animation intent.
Issue: Runtime calculations too expensive Fix: Pre-calculate animations. Use CSS keyframes (pose-to-pose) over JS frame-by-frame (straight ahead).
Issue: Complex shapes cause rendering issues Fix: Simplify geometry. Use CSS shapes over SVG paths. Reduce polygon counts in 3D.
Issue: Consistent timing across devices
Fix: Use relative units. Test on slowest target device. Consider requestAnimationFrame for JS.
Issue: Budget only allows essential animation Fix: Prioritize primary actions. Cut secondary animations first when constrained.
Issue: Limited screen real estate Fix: Animate in place. Use transforms that don't affect layout. Consider reduce-motion as default on constrained platforms.
// Feature detection
const supportsAnimation =
'animate' in Element.prototype &&
CSS.supports('transform', 'translateZ(0)');
if (supportsAnimation) {
element.animate(keyframes, options);
} else {
element.classList.add('final-state');
}
// Progressive enhancement
@supports (animation: name) {
.element {
animation: fadeIn 200ms ease-out;
}
}
-webkit- prefixesprefers-reduced-motion as proxy