CSS
CSS Animation Keyframes: Syntax, Use Cases, and Best Practices
CSS animation keyframes allow developers to create smooth, precise animations by defining specific styles at various points during an element’s animation sequence. These keyframes give complete control over the animation timeline, enabling you to build complex visual effects purely with CSS, without relying on JavaScript.
Animation keyframes CSS supports are essential for animating UI elements such as buttons, loaders, modals, and entire layouts. They enhance user experience by making interfaces feel more interactive and polished.
Learn CSS on Mimo
You’ll see them used constantly in frontend projects, from landing pages to dashboards.
What Are CSS Animation Keyframes?
CSS animation keyframes define how an element should appear at specific points during an animation. Each keyframe specifies the intermediate style properties at a given percentage of the animation duration, from 0% to 100%. The browser interpolates values between these points to create smooth transitions.
This interpolation is what creates the motion in between keyframes without you manually defining every frame.
Here is a simple example of how CSS animation keyframes are structured:
CSS
@keyframes slideIn {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(0);
}
}
This animation moves an element from left to right by changing its transform property from the starting position at 0% to the final position at 100%.
How to Use CSS Animation Keyframes
To use animation keyframes CSS provides, you need two parts:
- A
@keyframesrule that defines the animation steps. - CSS properties applied to an element to trigger the animation.
CSS
@keyframes fadeIn {
0% { opacity: 0; }
100% { opacity: 1; }
}
.element {
animation-name: fadeIn;
animation-duration: 2s;
}
In this example, the .element will fade in over 2 seconds using the defined keyframes.
You could apply this to a simple div to animate it into view.
Essential Animation Properties
To use CSS animation keyframes effectively, you must understand the properties that control animation behavior:
animation-name: The name of the keyframes to apply.animation-duration: Total time the animation takes to complete.animation-timing-function: Controls the pacing of the animation (e.g.,ease,linear,ease-in-out).animation-delay: Specifies a delay before the animation starts.animation-iteration-count: Number of times the animation runs (can beinfinite).animation-direction: Defines the direction of the animation (normal,reverse,alternate, etc.).animation-fill-mode: Specifies the styles applied before and after the animation.
Combining these allows for a wide range of animation behaviors.
CSS Keyframes Syntax Variations
Keyframes can use either percentages or the keywords from and to, which are equivalent to 0% and 100% respectively.
CSS
@keyframes grow {
from { width: 100px; }
to { width: 300px; }
}
This makes it easier to read for short animations, but percentages are more flexible for complex sequences.
You can also include multiple intermediate steps:
CSS
@keyframes bounce {
0% { transform: translateY(0); }
50% { transform: translateY(-50px); }
100% { transform: translateY(0); }
}
This defines a bounce effect by adjusting position at different stages. The percentages here are often called keyframe selectors because they “select” which moment in the timeline the styles apply to.
Combining Multiple Animations
Elements can have multiple animations applied by separating each one with commas:
CSS
.element {
animation-name: moveRight, fadeIn;
animation-duration: 1s, 2s;
}
Each animation must have its respective timing values. This approach allows you to layer effects like movement and opacity changes together.
Reversing and Alternating Animations
The animation-direction property changes the playback direction of animation keyframes that CSS executes.
normal: Plays from 0% to 100%.reverse: Plays from 100% to 0%.alternate: Plays forward, then backward.alternate-reverse: Plays backward, then forward.
Example:
CSS
.element {
animation: bounce 2s infinite alternate;
}
This creates a smooth back-and-forth bouncing motion.
Looping and Infinite Animations
To create continuous animations, set animation-iteration-count to infinite.
CSS
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.loader {
animation: spin 1s linear infinite;
}
This is commonly used for loading indicators or spinning icons.
Creating Staggered or Sequential Animations
You can delay animations using the animation-delay property. This is useful for animating elements in a sequence.
CSS
.item:nth-child(1) { animation-delay: 0s; }
.item:nth-child(2) { animation-delay: 0.2s; }
.item:nth-child(3) { animation-delay: 0.4s; }
Each element starts slightly after the previous one, creating a cascading effect.
Advanced Keyframe Techniques
Animating Multiple Properties
You can animate several CSS properties within one keyframe sequence:
CSS
@keyframes fancy {
0% {
opacity: 0;
transform: scale(0.5);
}
100% {
opacity: 1;
transform: scale(1);
}
}
This creates a combined fade-and-zoom effect, ideal for tooltips or cards.
Using CSS Variables in Keyframes
Modern browsers support CSS variables inside animations:
CSS
:root {
--rotation: 360deg;
}
@keyframes rotateVar {
to { transform: rotate(var(--rotation)); }
}
This lets you change animation parameters dynamically using JavaScript or media queries.
These variables are also called custom properties, and they’re great when you want one animation to follow the same design system values as the rest of your CSS styles.
Shorthand vs Longhand Animation Declarations
CSS gives you a long list of animation properties, but you can compress them using a shorthand version too:
CSS
.element {
animation: fadeIn2s ease-in-out0s1 normal both;
}
That line sets name, duration, timing, delay, iteration count, direction, and fill mode in one go. If you’re ever unsure what you’re setting, write it longhand first, then switch to shorthand once it looks right.
CSS Transitions vs Keyframes
Keyframes define a full timeline, while CSS transitions animate changes between two states (like normal → hover). Transitions often rely on the transition property, while keyframes rely on animation-* properties.
Transitions are great for simple interactions, but keyframes win when you need multiple steps, looping motion, or more control over the animation curve.
Keyframe Animation in CSS for Responsive Design
Keyframe animation in CSS can be adjusted for different screen sizes using media queries:
CSS
@media (max-width: 600px) {
@keyframes slideIn {
0% { transform: translateX(-50%); }
100% { transform: translateX(0); }
}
}
This ensures animations work well on mobile devices and don’t interfere with usability.
Styling Animated Elements: Common UI Details
Animations tend to look better when the element already has good styling, even if the motion is subtle.
For example, pairing motion with a soft background-color, a crisp border-width, and a gentle box-shadow can make a UI feel more polished. If the element has sharp edges, adding border-radius can instantly make it feel “app-like.”
If you use box-sizing: border-box;, layout math becomes easier while you animate things like size or padding. That’s especially useful if you’re animating a card component in a design template.
Typography matters too. Subtle motion paired with the right fonts can make a page feel much more intentional than motion alone. For text-based animations, you might also tweak text-align and text-decoration so the content stays readable while it moves.
Animating Layouts with Flexbox
Keyframes aren’t only for flashy effects. You can animate components inside flex layouts and still keep structure stable.
If a container uses display: flex, properties like align-items and justify-content control how children line up. Animations can run on the children without breaking alignment, which is useful for loaders, onboarding steps, and UI hints.
Using Pseudo-Elements in Keyframe Animations
You can animate extra decorative layers using pseudo-elements like ::before and ::after. These are perfect for things like shine effects, pulsing rings, or background accents without adding extra HTML.
Working with Images and SVG
Animations don’t have to be limited to boxes. You can animate an SVG icon with keyframes too, like rotating a spinner or pulsing a stroke. This is a common pattern for loaders and status indicators.
You can also animate visual layers like background-image, which is useful for simple gradient shifts or “moving highlight” effects (though you’ll often animate background-position rather than the image itself).
Browser Compatibility and Performance
CSS animation keyframes are supported in all modern browsers, including Chrome, Firefox, Safari, and Edge. However, consider the following tips for better performance:
- Avoid animating properties like
width,height, ortopwhich trigger layout recalculations. - Prefer
transformandopacity, which are GPU-accelerated. - Limit the number of simultaneous animations, especially on mobile.
Animations should enhance user experience, not hinder it with lag or jank.
Keyframes as an At-Rule
The @keyframes block is a special CSS at-rule, meaning it starts with @ and defines behavior outside a normal selector block. You’ll sometimes hear people refer to @keyframes as the keyframes at-rule, since it’s the specific at-rule used to define animations.
Stacking and Layering During Animations
Animated elements can overlap, especially when they move across the screen. In those cases, z-index becomes important so the right layer appears on top. If two animated elements “fight” for visibility, checking z-index often solves the mystery fast.
Specificity and Unexpected Overrides
If your animation rules aren’t applying, you might be dealing with specificity. A more specific selector can override your animation declaration, even if your keyframes are correct. Checking computed styles in DevTools usually reveals the culprit.
Debugging Animation Keyframes
Use browser developer tools to inspect and debug animations:
- Chrome DevTools lets you scrub through animations frame by frame.
- The “Animations” panel shows timing, easing curves, and keyframe points.
- Use the
animation-play-stateproperty to pause or play animations manually for testing.
This is helpful for syncing animation timing across multiple elements or fixing unexpected behavior.
Some teams also keep animation snippets in Github so everyone can reuse and tweak the same patterns.
Practical Use Cases for CSS Animation Keyframes
Loading Indicators
Create spinning, bouncing, or pulsing loaders using keyframes. These are lightweight and don’t require JavaScript.
Navigation Menus
Slide-in or fade-in mobile navs enhance the user experience while keeping the implementation simple.
Onboarding Steps
Animate onboarding modals, tooltips, or instructions to gradually guide users through the interface.
Attention-Grabbing Buttons
Use subtle bounce, pulse, or glow effects on CTAs to increase engagement without being intrusive.
Theme Transitions
Smoothly animate background or text color changes during dark mode toggles using keyframes with color properties.
If you ever need to sync animations with data, you can trigger class changes based on an API response, but the animation itself still runs in CSS.
Best Practices for Animation Keyframes CSS
- Keep animations short — usually under 1 second for most UI elements.
- Use
ease-outorease-in-outfor natural pacing. - Combine
animation-fill-mode: bothto retain start and end states. - Avoid too many concurrent animations to reduce performance strain.
- Use
will-change: transformon animated elements for better rendering performance. - Test animations with reduced motion settings for accessibility compliance.
Animations should feel intuitive and non-disruptive.
CSS animation keyframes provide a powerful way to bring life to web interfaces. They allow developers to define how elements change over time, controlling movement, opacity, color, and transformations with precision. From simple fades to complex motion sequences, CSS animation keyframes are foundational for crafting interactive and visually engaging websites.
Join 35M+ people learning for free on Mimo
4.8 out of 5 across 1M+ reviews
Check us out on Apple AppStore, Google Play Store, and Trustpilot