Keyframe animations let you create smooth changes in how things look on a webpage over time. They help make websites feel alive and interesting.
Keyframe animations in CSS
Start learning this pattern below
Jump into concepts and practice - no test required
@keyframes animation-name { 0% { /* styles at start */ } 50% { /* styles halfway */ } 100% { /* styles at end */ } } selector { animation-name: animation-name; animation-duration: time; animation-iteration-count: number | infinite; animation-timing-function: easing; }
The @keyframes rule defines the animation steps.
Use percentages (0% to 100%) to set styles at different times.
@keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } .box { animation-name: fadeIn; animation-duration: 2s; animation-fill-mode: forwards; }
@keyframes slideRight { 0% { transform: translateX(0); } 100% { transform: translateX(100px); } } .button { animation-name: slideRight; animation-duration: 1s; animation-iteration-count: infinite; animation-direction: alternate; }
This webpage shows a square box that smoothly changes its background color from light blue to light green and back continuously. The animation uses keyframes to define the color steps and CSS properties to control timing and repetition.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Keyframe Animation Example</title> <style> @keyframes colorChange { 0% { background-color: lightblue; } 50% { background-color: lightgreen; } 100% { background-color: lightblue; } } .animated-box { width: 150px; height: 150px; background-color: lightblue; animation-name: colorChange; animation-duration: 4s; animation-iteration-count: infinite; animation-timing-function: ease-in-out; border-radius: 1rem; margin: 2rem auto; display: flex; align-items: center; justify-content: center; font-family: sans-serif; color: #333; font-weight: bold; user-select: none; } </style> </head> <body> <main> <section> <div class="animated-box" aria-label="Box that changes color smoothly"> Watch me change! </div> </section> </main> </body> </html>
Always use animation-fill-mode: forwards; if you want the animation to keep the last style after finishing.
Use animation-iteration-count: infinite; to repeat animations endlessly.
Test animations in your browser's developer tools to adjust timing and effects easily.
Keyframe animations let you change styles smoothly over time.
Define steps with @keyframes and apply with CSS animation properties.
Use animations to make websites more engaging and interactive.
Practice
@keyframes rule do in CSS animations?Solution
Step 1: Understand the role of
The@keyframes@keyframesrule defines how styles change at different points during the animation timeline.Step 2: Differentiate from animation properties
Properties likeanimation-durationoranimation-nameapply the animation, but@keyframessets the actual style changes.Final Answer:
Defines the stages of an animation with style changes over time -> Option DQuick Check:
@keyframesdefines animation steps [OK]
@keyframes sets animation steps [OK]- Confusing
@keyframeswith animation properties - Thinking
@keyframesapplies animation to elements - Mixing up animation duration with keyframe definitions
fade that changes opacity from 0 to 1?Solution
Step 1: Recall correct
The correct rule is@keyframessyntax@keyframesfollowed by the animation name and curly braces containing percentage or keyword steps.Step 2: Check the step keywords and values
Valid steps arefromandtoor percentages like0%and100%. @keyframes fade { from { opacity: 0; } to { opacity: 1; } } usesfromandtocorrectly.Final Answer:
@keyframes fade { from { opacity: 0; } to { opacity: 1; } } -> Option BQuick Check:
Correct@keyframessyntax usesfromandto[OK]
@keyframes with from/to or 0%/100% [OK]- Using
@animationinstead of@keyframes - Using invalid step names like
startorend - Omitting percentage signs or keywords in steps
<div> element when the page loads?div {
width: 100px;
height: 100px;
background-color: red;
animation: slide 2s forwards;
}
@keyframes slide {
0% { transform: translateX(0); }
100% { transform: translateX(200px); }
}Solution
Step 1: Analyze the animation properties
The div has an animation namedslidethat lasts 2 seconds and usesforwardsfill mode, meaning it keeps the final state.Step 2: Understand the keyframe effect
Theslideanimation moves the div fromtranslateX(0)totranslateX(200px), which moves it 200 pixels to the right.Final Answer:
The div moves 200px to the right over 2 seconds and stays there -> Option AQuick Check:
Animation moves right 200px and stays [OK]
- Confusing direction of translateX (right vs left)
- Ignoring the forwards fill mode effect
- Thinking animation happens instantly without duration
@keyframes grow {
0% { width: 100px; }
100% { width: 200px }
}
.box {
animation-name: grow;
animation-duration: 3s;
animation-iteration-count: infinite
}Solution
Step 1: Check syntax inside
Each CSS declaration must end with a semicolon. The@keyframeswidth: 200pxline is missing a semicolon.Step 2: Verify animation properties
The propertiesanimation-name,animation-duration, andanimation-iteration-countare correct and properly used.Final Answer:
Missing semicolon afterwidth: 200pxin keyframes -> Option AQuick Check:
CSS declarations need semicolons [OK]
- Omitting semicolons inside keyframes
- Confusing animation property names
- Using wrong units for duration
Solution
Step 1: Understand bounce motion direction
A bouncing ball moves down (positive Y) then back up (to zero). So translateY should go from 0 to positive value and back.Step 2: Analyze each option's keyframes
@keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(100px); } } moves from 0 to 100px down at 50% and back to 0 at 100%, simulating a bounce. @keyframes bounce { 0% { transform: translateY(100px); } 50% { transform: translateY(0); } 100% { transform: translateY(100px); } } starts at 100px down, which is unnatural. @keyframes bounce { 0% { transform: translateY(0); } 50% { transform: translateY(-100px); } 100% { transform: translateY(0); } } moves up (-100px), not down. @keyframes bounce { 0% { transform: translateX(0); } 50% { transform: translateX(100px); } 100% { transform: translateX(0); } } moves horizontally, not vertically.Final Answer:
@keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(100px); } } -> Option CQuick Check:
Bounce moves down then up vertically [OK]
- Using negative translateY for bounce down
- Animating horizontal movement instead of vertical
- Starting animation at the bottom position
