Custom keyframe animations let you create smooth, unique movements for your webpage elements. They make your site feel lively and fun.
Custom keyframe animations in Tailwind
module.exports = {
theme: {
extend: {
keyframes: {
customName: {
'0%': { transform: 'scale(1)' },
'50%': { transform: 'scale(1.5)' },
'100%': { transform: 'scale(1)' },
},
},
animation: {
customAnimation: 'customName 2s ease-in-out infinite',
},
},
},
}Define your keyframes inside extend.keyframes with a name and steps.
Then create an animation using that keyframe name inside extend.animation.
keyframes: {
bounce: {
'0%, 100%': { transform: 'translateY(0)' },
'50%': { transform: 'translateY(-10px)' },
},
},
animation: {
bounce: 'bounce 1s infinite',
}keyframes: {
fadeIn: {
'0%': { opacity: '0' },
'100%': { opacity: '1' },
},
},
animation: {
fadeIn: 'fadeIn 3s ease forwards',
}This page shows a blue button that gently grows and shrinks repeatedly using a custom pulse animation.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Custom Keyframe Animation</title> <script src="https://cdn.tailwindcss.com"></script> <script> tailwind.config = { theme: { extend: { keyframes: { pulseScale: { '0%, 100%': { transform: 'scale(1)' }, '50%': { transform: 'scale(1.2)' }, }, }, animation: { pulseScale: 'pulseScale 2s ease-in-out infinite', }, }, }, }; </script> </head> <body class="flex items-center justify-center min-h-screen bg-gray-100"> <button class="bg-blue-600 text-white px-6 py-3 rounded-lg animate-pulseScale focus:outline-none focus:ring-4 focus:ring-blue-300" aria-label="Pulsing button"> Click Me </button> </body> </html>
Always give your animations meaningful names to keep your code clear.
Use focus:outline-none and focus:ring classes to keep accessibility when animating interactive elements.
Test animations on different screen sizes to ensure they look good everywhere.
Custom keyframe animations let you create unique movements for your webpage elements.
Define keyframes and animations inside Tailwind's extend section.
Use the animation class on elements to see your animation in action.
Practice
Solution
Step 1: Understand what keyframe animations do
Keyframe animations define how elements move or change over time.Step 2: Relate to Tailwind's custom animations
Custom keyframe animations let you create unique movement effects beyond default animations.Final Answer:
To create unique movement effects on webpage elements -> Option AQuick Check:
Custom animations = unique movements [OK]
- Confusing animations with color or font changes
- Thinking animations improve loading speed
- Mixing animations with layout changes
tailwind.config.js?Solution
Step 1: Identify keyframe syntax in Tailwind config
Keyframes are defined insideextend.keyframeswith percentage steps and CSS properties.Step 2: Check animation property linking keyframes
The animation name and duration are set insideextend.animation.Final Answer:
extend: { keyframes: { bounce: { '0%': { transform: 'translateY(0)' }, '50%': { transform: 'translateY(-25%)' }, '100%': { transform: 'translateY(0)' } } }, animation: { bounce: 'bounce 1s infinite' } } -> Option BQuick Check:
Keyframes + animation property = correct syntax [OK]
- Defining colors or fonts instead of keyframes
- Missing percentage steps in keyframes
- Not linking animation name to keyframes
extend: { keyframes: { fadeIn: { '0%': { opacity: '0' }, '100%': { opacity: '1' } } }, animation: { fadeIn: 'fadeIn 2s ease-in forwards' } }What will happen when you add
class="animate-fadeIn" to an element?Solution
Step 1: Analyze keyframes named fadeIn
Opacity changes from 0 (invisible) at 0% to 1 (visible) at 100%.Step 2: Understand animation properties
Animation lasts 2 seconds, easing in, and stays at final state (forwards).Final Answer:
Element fades in from transparent to visible over 2 seconds -> Option DQuick Check:
fadeIn keyframes = fade in effect [OK]
- Confusing fadeIn with slide animations
- Ignoring animation duration and easing
- Assuming fade out instead of fade in
extend: { keyframes: { spinSlow: { '0%': { transform: 'rotate(0deg)' }, '100%': { transform: 'rotate(360deg)' } } }, animation: { spinSlow: 'spinSlow 3s linear infinite' } }But the animation does not run on your element with
class="animate-spinSlow". What is the likely problem?Solution
Step 1: Check Tailwind config syntax
The keyframe and animation syntax is correct with '0%' and '100%' and camelCase names.Step 2: Understand Tailwind build process
Changes intailwind.config.jsrequire restarting the development server to apply.Final Answer:
Forgot to restart the development server after config change -> Option AQuick Check:
Restart server after config edits [OK]
- Using wrong percentage syntax in keyframes
- Wrong animation class name format
- Believing Tailwind can't do custom animations
Solution
Step 1: Identify correct transform and opacity start/end values
Moving up means translateY from 20px (start) to 0 (end). Fading in means opacity from 0 to 1.Step 2: Match animation timing and properties
Duration 1.5s, easing ease-out, and forwards to keep final state are correct.Final Answer:
extend: { keyframes: { moveUpFadeIn: { '0%': { transform: 'translateY(20px)', opacity: '0' }, '100%': { transform: 'translateY(0)', opacity: '1' } } }, animation: { moveUpFadeIn: 'moveUpFadeIn 1.5s ease-out forwards' } } -> Option CQuick Check:
TranslateY 20px to 0 + opacity 0 to 1 = move up fade in [OK]
- Using translateX instead of translateY for vertical movement
- Reversing opacity values (fade out instead of fade in)
- Swapping start and end positions
Ready to prove it?
Pass the test and this pattern moves unknown
