The CSS animation-fill-mode
property dictates how an animation styles the target element before the animation starts and after it ends. Essentially, it controls whether the element retains the styles from the first frame, the last frame, both, or neither, outside the animation’s active duration.
Understanding animation-fill-mode
CSS animations are a powerful way to add visual flair and interactivity to web pages. However, without proper control, an element might revert to its original state once the animation finishes, negating the desired effect. This is where animation-fill-mode
comes in. It addresses the periods before and after the animation actually plays, ensuring a seamless and predictable user experience.
This property can take one of four primary values:
-
none
: This is the default value. The animation doesn’t apply any styles to the target element outside of the animation’s execution time. The element reverts to its original, non-animated state. -
forwards
: The element retains the styles defined by the last keyframe of the animation when the animation is complete. This is particularly useful if you want the final state of the animation to persist. -
backwards
: The element adopts the styles defined by the first keyframe of the animation before the animation starts. This is handy when you want to apply initial styles based on the animation’s starting point. -
both
: This combines the effects offorwards
andbackwards
. The element adopts the styles defined by the first keyframe before the animation starts and retains the styles from the last keyframe after the animation is complete.
Practical Applications and Examples
Consider a simple animation that moves an element across the screen:
@keyframes slide {
from {
transform: translateX(0);
}
to {
transform: translateX(200px);
}
}
.element {
width: 100px;
height: 100px;
background-color: red;
animation-name: slide;
animation-duration: 2s;
}
Without animation-fill-mode
, the element would snap back to its original position after the animation completes. By adding animation-fill-mode: forwards;
, the element remains at the 200px offset. Adding animation-fill-mode: backwards;
would ensure that even before the animation starts, if the initial keyframe defines any specific styles (even if they are the same as the original styles), they are applied. animation-fill-mode: both;
provides both of these behaviours.
The choice of which value to use depends entirely on the desired effect. Experimentation is key to understanding how each option interacts with your specific animation.
Browser Compatibility
animation-fill-mode
enjoys excellent browser support across all modern browsers, including Chrome, Firefox, Safari, Edge, and Opera. This makes it a safe and reliable property to use in your web development projects. Always consult up-to-date documentation and browser compatibility tables like those on MDN Web Docs for the most accurate information.
Frequently Asked Questions (FAQs)
FAQ 1: What happens if I don’t specify animation-fill-mode
?
If you don’t specify animation-fill-mode
, the default value, none
, is used. This means the element will revert to its original styling before the animation began once the animation completes. This can often lead to a jarring visual effect if you intend the final state of the animation to persist.
FAQ 2: Can I use animation-fill-mode
with multiple animations?
Yes, you can. You can specify animation-fill-mode
for each individual animation when using the shorthand animation
property, or you can use the individual animation-fill-mode
property for each element. For instance:
.element {
animation: slide 2s ease-in-out forwards, fade 1s linear backwards;
}
In this example, the slide
animation will use forwards
, and the fade
animation will use backwards
.
FAQ 3: How does animation-fill-mode
interact with animation-iteration-count
?
If animation-iteration-count
is set to a finite number, animation-fill-mode: forwards;
(or both
) will apply the final keyframe styles after the last iteration completes. If animation-iteration-count
is set to infinite
, the final keyframe styles will never be applied, as the animation never truly “ends”. It keeps looping. In such cases, forwards
and both
will effectively have no effect once the animation starts looping.
FAQ 4: What if my first keyframe doesn’t define any styles? Will animation-fill-mode: backwards;
do anything?
If your first keyframe doesn’t explicitly define any styles that are different from the element’s initial state, animation-fill-mode: backwards;
will effectively do nothing. It only applies the styles defined in the first keyframe before the animation starts.
FAQ 5: Can I change the animation-fill-mode
using JavaScript?
Yes, you can modify the animation-fill-mode
property using JavaScript. For example:
const element = document.querySelector('.element');
element.style.animationFillMode = 'forwards';
This allows you to dynamically control the animation behavior based on user interactions or other conditions.
FAQ 6: How does animation-fill-mode
work with animation-direction: alternate;
?
When animation-direction
is set to alternate
, the animation reverses direction on each iteration. animation-fill-mode: forwards;
will apply the styles from the last keyframe of the last forward iteration. If the number of iterations is odd, this will be the same as the to
keyframe. If the number of iterations is even, it will be the same as the from
keyframe.
FAQ 7: Is animation-fill-mode
animatable itself?
No, animation-fill-mode
is not an animatable property. You cannot transition between different values of animation-fill-mode
. You can, however, dynamically change its value using JavaScript, as mentioned earlier.
FAQ 8: Does animation-fill-mode
affect the rendering performance?
The performance impact of using animation-fill-mode
is generally negligible. Modern browsers are highly optimized for handling CSS animations, and animation-fill-mode
doesn’t introduce any significant overhead. However, complex animations with numerous elements and intricate styling should always be tested for performance on target devices.
FAQ 9: How does animation-fill-mode
interact with animation-delay
?
When animation-fill-mode
is set to backwards
or both
, the styles from the first keyframe are applied during the animation-delay
period. This means the element will adopt those styles as soon as the delay starts, even before the animation officially begins.
FAQ 10: Can I use shorthand for animation-fill-mode
?
Yes, you can use the shorthand animation
property to specify animation-fill-mode
along with other animation properties. For example:
.element {
animation: slide 2s ease-in-out forwards;
}
This sets the animation-name
to slide
, the animation-duration
to 2 seconds, the animation-timing-function
to ease-in-out
, and the animation-fill-mode
to forwards
.
FAQ 11: What’s the difference between animation-fill-mode: forwards;
and setting the final styles directly in the CSS?
While both approaches might achieve a similar visual outcome, using animation-fill-mode: forwards;
offers several advantages:
- Maintainability: The final state is tied directly to the animation definition, making it easier to understand and modify the animation’s behavior.
- Dynamic Control: You can dynamically change the
animation-fill-mode
using JavaScript, allowing for more flexible control over the animation’s behavior. - Clarity: It explicitly communicates the intent that the final state of the animation should persist.
Setting the styles directly in the CSS might be simpler for very basic animations, but animation-fill-mode: forwards;
is generally the preferred approach for more complex scenarios.
FAQ 12: Are there any alternatives to animation-fill-mode
?
While animation-fill-mode
is the most direct and efficient way to control the styling before and after an animation, you could achieve similar effects using JavaScript and event listeners (animationstart
, animationend
). However, this approach is significantly more complex and less performant than using animation-fill-mode
directly in CSS. Therefore, animation-fill-mode
is almost always the best choice.
By mastering animation-fill-mode
, you gain a powerful tool for creating more refined and professional CSS animations, ensuring your elements behave as expected and deliver a smooth and engaging user experience.