Testing

CSS Animation: Browser Support, Properties, Issues

CSS Animation works in Chrome 43+, Edge 12+, Firefox 16+, Safari 9+, Opera 30+, and IE 10+. Learn the key properties, how to create one, and known issues.

Author

Prince Dewani

May 1, 2026

CSS Animation is a W3C CSS module that uses the @keyframes at-rule and the animation property to interpolate CSS values over time without JavaScript. It works in Chrome 43+, Edge 12+, Firefox 16+, Safari 9+, Opera 30+, Samsung Internet 4+, and Internet Explorer 10+, with prefixed support reaching back to Chrome 4, Safari 5.1, and Firefox 5.

This guide covers what CSS Animation is, the browsers that support it, the key properties, how to create one, and the known issues.

What is CSS Animation?

CSS Animation is a W3C standard, defined in the CSS Animations Module Level 1, that animates CSS property values over time using the @keyframes at-rule. The animation shorthand combines name, duration, timing function, delay, iteration count, direction, fill mode, and play state into one declaration. It runs on the browser's compositor without any JavaScript.

Which browsers does CSS Animation support?

CSS Animation works in every modern Chromium, Gecko, and WebKit browser. Chrome 43, Edge 12, Firefox 16, Safari 9, Opera 30, Samsung Internet 4, and Internet Explorer 10 enable it by default, and older versions supported the feature with the -webkit- or -moz- vendor prefix.

Loading browser compatibility data...

CSS Animation compatibility in Chrome

Chrome supports CSS Animation by default from Chrome 43 without any vendor prefix on Windows, macOS, Linux, ChromeOS, and Android. Chrome 4 to 42 supported the feature with the -webkit- prefix on the animation property and on @-webkit-keyframes. The animation engine sits on Chrome's compositor, so transform and opacity keyframes run on the GPU.

CSS Animation compatibility in Edge

Microsoft Edge supports CSS Animation from Edge 12 on Windows, macOS, and Linux with no vendor prefix. The legacy EdgeHTML build and the Chromium-based Edge build both ship unprefixed animation and @keyframes. Any CSS Animation that runs on Chrome runs on Edge with the same syntax.

CSS Animation compatibility in Firefox

Firefox supports CSS Animation by default from Firefox 16 without any vendor prefix on Windows, macOS, Linux, and Android. Firefox 5 to 15 supported the feature with the -moz- prefix on the animation property and on @-moz-keyframes. Firefox runs the same Gecko animation engine on every platform.

CSS Animation compatibility in Safari

Safari supports unprefixed CSS Animation from Safari 9 on macOS and from Safari on iOS 9 on iPhone and iPad. Safari 5.1 to 8 supported the feature behind the -webkit- prefix, and Safari 4 to 5 had partial support. WebKit on visionOS, iPadOS, and macOS all share the same animation engine.

CSS Animation compatibility in Opera

Opera supports CSS Animation by default from Opera 12 without any vendor prefix on desktop, and Opera Mobile 12.1 added support on Android. Opera 9 to 11.6 did not support CSS Animation. Modern Opera tracks the Chromium release cadence, so the animation engine matches Chrome's Blink implementation closely.

CSS Animation compatibility in Samsung Internet

Samsung Internet supports CSS Animation by default from Samsung Internet 4 on Galaxy phones and tablets. Every release ships unprefixed animation, @keyframes, and the full set of animation sub-properties. The browser shares the underlying Chromium engine with Chrome on Android, so animation behavior matches Chrome's compositor closely.

CSS Animation compatibility in Android Browser

Chrome for Android supports unprefixed CSS Animation on every release. The legacy Android Browser added partial support from version 2.1 with the -webkit- prefix, and full unprefixed support from version 4. WebView on modern Android inherits the Chromium engine, so apps that embed WebView pick up the animation engine automatically.

CSS Animation compatibility in Internet Explorer

Internet Explorer 10 and 11 support CSS Animation without any vendor prefix on Windows. Internet Explorer 5.5 through 9 do not support CSS Animation, because the Trident engine never shipped the @keyframes at-rule or the animation property. Microsoft has retired Internet Explorer; users should switch to Microsoft Edge or another modern browser.

Note

Note: CSS Animation can render differently on Safari, older Android Browser, and Internet Explorer. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!

What are the key properties of CSS Animation?

CSS Animation builds on the @keyframes at-rule and a set of animation sub-properties that the animation shorthand combines. Each sub-property controls one axis of the animation, and most pages set them through the shorthand for clarity.

  • @keyframes: The at-rule that defines the keyframes. Each block lists a percentage or the from and to keywords, plus the CSS properties to apply at that point. The browser interpolates between the listed stops.
  • animation-name: Points the element at one or more @keyframes rules by name. The value none disables the animation without removing the rule.
  • animation-duration: Sets how long one cycle takes, in seconds or milliseconds. A value of 0s skips the animation entirely.
  • animation-timing-function: Controls the rate curve. Accepts ease, linear, ease-in, ease-out, ease-in-out, step-start, step-end, steps(), and cubic-bezier().
  • animation-delay: Pushes the start time forward, or with a negative value starts the animation mid-cycle.
  • animation-iteration-count: Runs the keyframes a fixed number of times, or infinite for a continuous loop.
  • animation-direction: Picks normal, reverse, alternate, or alternate-reverse to play forward, backward, or back and forth.
  • animation-fill-mode: Decides whether the element holds the from values before the animation starts, the to values after it ends, both, or none.
  • animation-play-state: Pauses or resumes a running animation through the running and paused values, useful for hover and focus interactions.
  • animation: The shorthand that combines every sub-property in one declaration, plus animation-timeline for scroll-driven animations on Chrome 115+.

How do you create a CSS animation?

A CSS animation needs a @keyframes rule that lists the steps and an animation declaration on the target element that picks the rule and the timing. The browser does the rest, no JavaScript or library required.

  • Define the keyframes: Write a @keyframes block with a name and the CSS property values at each stop. Use from and to for a two-step animation, or percentages for finer control.
  • Pick the target element: Add a class or selector for the element you want to animate, so the keyframes only run on the elements you choose.
  • Apply the animation shorthand: Set animation: name duration timing-function delay iteration-count direction fill-mode play-state on the target. The shorthand reads left to right, and any missing slot falls back to the default.
  • Pick GPU-friendly properties: Animate transform and opacity for the smoothest result. Animating top, left, width, or height triggers layout on every frame and can cause jank on low-end devices.
  • Test prefers-reduced-motion: Wrap the animation in a @media (prefers-reduced-motion: no-preference) query, so users who turned reduced motion on do not see a jarring effect.
  • Verify support with feature detection: Run the snippet below in DevTools to confirm the browser advertises the animation property before falling back to a static state.
// Feature-detect CSS Animation in any modern browser
const supportsCssAnimation = () => {
    const probe = document.createElement("div").style;
    return "animation" in probe || "webkitAnimation" in probe;
};

if (supportsCssAnimation()) {
    console.log("CSS Animation is available, ready to attach @keyframes rules");
} else {
    console.log("CSS Animation is missing, fall back to a static UI state");
}

If the console logs the missing branch, the page is on Internet Explorer 9 or older, Opera Mini, or a stale Android Browser, and a non-animated state should ship instead.

...

What are the known issues with CSS Animation?

CSS Animation has wide cross-browser support, but the small differences in how Chromium, Gecko, and WebKit handle keyframes, transforms, and timing still hit production code. Plan around these before you ship a heavy animation.

  • Safari composites differently from Blink: Safari on macOS and iOS promotes animated elements to their own compositor layer aggressively, which can break the stacking order on a parent that has overflow: hidden, border-radius, or a backdrop-filter. The same keyframes that look right on Chrome can render with a hard edge on Safari.
  • Firefox interpolates discrete properties differently: Firefox treats some properties as non-animatable that Chrome interpolates, which leaves a keyframe stuck at the from value on Gecko. The CSS Animations Level 2 draft pins down the rules, but every shipping browser does not yet match the spec exactly.
  • Vendor prefix drift on legacy browsers: Chrome 4 to 42, Safari 5.1 to 8, Firefox 5 to 15, and the legacy Android Browser need -webkit- or -moz- prefixes on both the animation property and the @keyframes block. A modern stylesheet that drops the prefixes silently breaks on those browsers.
  • Internet Explorer 9 and Opera Mini have no support: IE 5.5 to 9 and Opera Mini do not implement @keyframes, and the animation property is treated as an unknown declaration. Pages that rely on a keyframe to reveal content keep the from state forever on those clients.
  • animation-timeline is Chromium-only: The scroll-driven animation extension lands first in Chrome 115+ and Edge 115+, while Safari and Firefox still gate it behind a flag. Polyfill the feature with the scroll-timeline.js shim, or fall back to a static layout on the missing engines.
  • prefers-reduced-motion is honored inconsistently: Most browsers respect the media query, but a few WebView builds on Android still ignore it. In my experience, the safest pattern is to write the reduced-motion query first and then add the full keyframes inside the no-preference branch, so the default state is the calm one.
...

Citations

All CSS Animation version numbers and platform notes in this guide come from these primary sources:

Author

Prince Dewani is a Community Contributor at TestMu AI, where he manages content strategies around software testing, QA, and test automation. He is certified in Selenium, Cypress, Playwright, Appium, Automation Testing, and KaneAI. Prince has also presented academic research at the international conference PBCON-01. He further specializes in on-page SEO, bridging marketing with core testing technologies. On LinkedIn, he is followed by 4,300+ QA engineers, developers, DevOps experts, tech leaders, and AI-focused practitioners in the global testing community.

Open in ChatGPT Icon

Open in ChatGPT

Open in Claude Icon

Open in Claude

Open in Perplexity Icon

Open in Perplexity

Open in Grok Icon

Open in Grok

Open in Gemini AI Icon

Open in Gemini AI

Copied to Clipboard!
...

3000+ Browsers. One Platform.

See exactly how your site performs everywhere.

Try it free
...

Write Tests in Plain English with KaneAI

Create, debug, and evolve tests using natural language.

Try for free

Frequently asked questions

Did you find this page helpful?

More Related Hubs

TestMu AI forEnterprise

Get access to solutions built on Enterprise
grade security, privacy, & compliance

  • Advanced access controls
  • Advanced data retention rules
  • Advanced Local Testing
  • Premium Support options
  • Early access to beta features
  • Private Slack Channel
  • Unlimited Manual Accessibility DevTools Tests