How to Create Stunning Animated Hero Sections for Your Website
Your hero section is the first thing visitors see. It has roughly 3 seconds to make an impression before someone bounces. A static headline and a button simply won't cut it anymore — animated hero sections have become the gold standard for modern, high-converting landing pages.
In this guide, you'll learn exactly how to build a hero section that looks professional, loads fast, and works across all devices.
Why Animated Hero Sections Matter
Before we dive into the code, let's talk about why animation is worth the effort.
Higher Engagement Rates
Studies consistently show that motion captures human attention far more effectively than static content. An animated gradient, a floating element, or a typewriter headline immediately draws the eye and encourages visitors to keep reading.
Stronger Brand Perception
Polished animation signals quality. When a visitor lands on a site with smooth, intentional motion, they subconsciously associate that quality with your product or service. It's the digital equivalent of a well-designed storefront.
Better Conversion
Well-placed animation can guide the user's eye toward your call-to-action (CTA). A subtle pulse on the "Get Started" button, a glowing border on a signup form — these micro-interactions have been shown to lift conversion rates by 10–30% in A/B tests.
The Anatomy of a Great Animated Hero Section
Every high-performing animated hero has the same core components:
- Background layer — animated gradient, particle field, or video loop
- Headline — bold, keyword-rich, often animated with a typewriter or fade-in effect
- Subheadline — concise description of the value proposition
- CTA button — prominent, with a hover/pulse animation
- Social proof — avatar stack, star ratings, or customer count
- Visual element — product screenshot, 3D illustration, or animated blob
Let's build each one.
Setting Up the Foundation
We'll use Next.js + Tailwind CSS as our stack, the same foundation that powers Animation Web.
npx create-next-app@latest my-hero --typescript --tailwind
cd my-heroBasic Hero Layout
// components/Hero.tsx
export default function Hero() {
return (
<section className="relative min-h-screen flex items-center justify-center overflow-hidden">
{/* Background layer */}
<HeroBackground />
{/* Content */}
<div className="relative z-10 text-center px-4 max-w-4xl mx-auto">
<AnimatedHeadline />
<p className="mt-6 text-xl text-white/80 max-w-2xl mx-auto">
Build stunning websites in minutes with AI-powered animation prompts.
</p>
<CTAButton />
</div>
</section>
);
}Building the Animated Background
The background is the most impactful element. Here are three approaches ranked by visual impact.
Option 1: Animated Gradient (Best for Performance)
A smoothly shifting gradient is the simplest and most performant option. It works beautifully on mobile and requires zero JavaScript.
/* globals.css */
@keyframes gradient-shift {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
.hero-gradient {
background: linear-gradient(
-45deg,
#ee7752,
#e73c7e,
#23a6d5,
#23d5ab
);
background-size: 400% 400%;
animation: gradient-shift 15s ease infinite;
}function HeroBackground() {
return (
<div className="absolute inset-0 hero-gradient opacity-90" />
);
}Option 2: Floating Blob Animation
Blobs give a modern, organic feel — perfect for SaaS products and creative tools.
function HeroBackground() {
return (
<div className="absolute inset-0 overflow-hidden bg-gray-950">
<div className="absolute -top-40 -left-40 w-96 h-96 bg-purple-500 rounded-full mix-blend-multiply filter blur-3xl opacity-40 animate-blob" />
<div className="absolute -top-40 -right-40 w-96 h-96 bg-blue-500 rounded-full mix-blend-multiply filter blur-3xl opacity-40 animate-blob animation-delay-2000" />
<div className="absolute -bottom-40 left-1/2 w-96 h-96 bg-pink-500 rounded-full mix-blend-multiply filter blur-3xl opacity-40 animate-blob animation-delay-4000" />
</div>
);
}Add this to your tailwind.config.ts:
theme: {
extend: {
animation: {
blob: 'blob 7s infinite',
},
keyframes: {
blob: {
'0%': { transform: 'translate(0px, 0px) scale(1)' },
'33%': { transform: 'translate(30px, -50px) scale(1.1)' },
'66%': { transform: 'translate(-20px, 20px) scale(0.9)' },
'100%':{ transform: 'translate(0px, 0px) scale(1)' },
},
},
},
},Option 3: CSS Grid Beam (Advanced)
This creates a glowing grid effect reminiscent of linear.app and Vercel's marketing pages.
function HeroBackground() {
return (
<div className="absolute inset-0 bg-gray-950">
{/* Grid pattern */}
<div
className="absolute inset-0 opacity-20"
style={{
backgroundImage: `
linear-gradient(rgba(255,255,255,.1) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,.1) 1px, transparent 1px)
`,
backgroundSize: '40px 40px',
}}
/>
{/* Radial glow */}
<div className="absolute inset-0 bg-[radial-gradient(ellipse_at_center,_rgba(120,80,255,0.3)_0%,_transparent_70%)]" />
</div>
);
}Animating the Headline
A typewriter or staggered fade-in effect on your headline is one of the highest-impact animations you can add.
Typewriter Effect (Pure CSS)
@keyframes typewriter {
from { width: 0 }
to { width: 100% }
}
@keyframes blink-cursor {
from, to { border-color: transparent }
50% { border-color: white }
}
.typewriter {
overflow: hidden;
border-right: 3px solid white;
white-space: nowrap;
width: 0;
animation:
typewriter 3s steps(40, end) forwards,
blink-cursor 0.75s step-end infinite;
}function AnimatedHeadline() {
return (
<h1 className="text-5xl md:text-7xl font-bold text-white">
<span className="typewriter">Build Animations.</span>
<br />
<span className="text-transparent bg-clip-text bg-gradient-to-r from-purple-400 to-pink-400">
Ship Faster.
</span>
</h1>
);
}Staggered Word Reveal (with Framer Motion)
For maximum polish, use Framer Motion's staggerChildren:
'use client';
import { motion } from 'framer-motion';
const words = ['Build', 'Stunning', 'Animated', 'Websites'];
function AnimatedHeadline() {
return (
<motion.h1
className="text-6xl font-bold text-white"
initial="hidden"
animate="visible"
variants={{
hidden: {},
visible: { transition: { staggerChildren: 0.12 } },
}}
>
{words.map((word) => (
<motion.span
key={word}
className="inline-block mr-4"
variants={{
hidden: { opacity: 0, y: 40 },
visible: { opacity: 1, y: 0, transition: { duration: 0.5 } },
}}
>
{word}
</motion.span>
))}
</motion.h1>
);
}The CTA Button
Never neglect the CTA. A well-animated button can significantly lift click-through rates.
function CTAButton() {
return (
<div className="mt-10 flex flex-col sm:flex-row gap-4 justify-center">
<button className="
relative px-8 py-4 rounded-xl font-semibold text-lg
bg-white text-gray-900
transition-all duration-200
hover:scale-105 hover:shadow-2xl hover:shadow-white/20
active:scale-95
group
">
{/* Shimmer effect */}
<span className="
absolute inset-0 rounded-xl
bg-gradient-to-r from-transparent via-white/40 to-transparent
-translate-x-full group-hover:translate-x-full
transition-transform duration-700
" />
<span className="relative">Get Started Free →</span>
</button>
<button className="
px-8 py-4 rounded-xl font-semibold text-lg
border border-white/30 text-white
hover:bg-white/10 hover:border-white/60
transition-all duration-200
">
View Examples
</button>
</div>
);
}Performance Best Practices
Animation is only valuable if it's smooth. Follow these rules:
1. Animate Only GPU-Accelerated Properties
Stick to transform and opacity. These properties are handled by the GPU and won't cause layout reflow.
| ✅ Use These | ❌ Avoid These |
|---|---|
transform: translateX() | left, right, top, bottom |
transform: scale() | width, height |
opacity | margin, padding |
2. Use will-change Sparingly
.animated-element {
will-change: transform, opacity;
}Only apply will-change to elements that are actively animating. Don't set it on everything — it consumes GPU memory.
3. Respect prefers-reduced-motion
Always provide a fallback for users who prefer reduced motion (important for accessibility):
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}4. Lazy-Load Heavy Animations
If you're using canvas-based animations (particles, WebGL), lazy-load them:
import dynamic from 'next/dynamic';
const ParticleBackground = dynamic(
() => import('@/components/ParticleBackground'),
{ ssr: false }
);Putting It All Together
Here's the complete hero component:
// components/Hero.tsx
export default function Hero() {
return (
<section className="relative min-h-screen flex items-center justify-center overflow-hidden">
{/* Animated gradient background */}
<div className="absolute inset-0 hero-gradient" />
{/* Blob overlays */}
<div className="absolute top-1/4 left-1/4 w-72 h-72 bg-purple-500/30 rounded-full blur-3xl animate-blob" />
<div className="absolute top-1/3 right-1/4 w-72 h-72 bg-pink-500/30 rounded-full blur-3xl animate-blob animation-delay-2000" />
{/* Content */}
<div className="relative z-10 text-center px-4 max-w-4xl mx-auto">
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/10 border border-white/20 text-white text-sm mb-8">
<span className="w-2 h-2 rounded-full bg-green-400 animate-pulse" />
New: AI Animation Prompts Library →
</div>
<h1 className="text-5xl md:text-7xl font-bold text-white leading-tight">
Build Websites That<br />
<span className="text-transparent bg-clip-text bg-gradient-to-r from-purple-400 to-pink-400">
Actually Move
</span>
</h1>
<p className="mt-6 text-xl text-white/70 max-w-2xl mx-auto">
Animation Web gives you hundreds of ready-to-use animated backgrounds,
hero sections, and UI prompts — so you can ship stunning sites in hours, not weeks.
</p>
<div className="mt-10 flex flex-col sm:flex-row gap-4 justify-center">
<a
href="/pricing"
className="px-8 py-4 rounded-xl bg-white text-gray-900 font-semibold text-lg hover:scale-105 transition-transform"
>
Start Building Free
</a>
<a
href="/background"
className="px-8 py-4 rounded-xl border border-white/30 text-white font-semibold text-lg hover:bg-white/10 transition-colors"
>
Browse Library
</a>
</div>
{/* Social proof */}
<div className="mt-12 flex items-center justify-center gap-2 text-white/60 text-sm">
<div className="flex -space-x-2">
{[1,2,3,4,5].map(i => (
<div key={i} className="w-8 h-8 rounded-full bg-gradient-to-br from-purple-400 to-pink-400 border-2 border-gray-900" />
))}
</div>
<span>Loved by <strong className="text-white">2,000+</strong> developers</span>
</div>
</div>
</section>
);
}Final Checklist
Before shipping your hero section, run through this checklist:
- Animation runs at 60fps on mobile (check Chrome DevTools Performance tab)
-
prefers-reduced-motionfallback is in place - Hero renders above the fold on all common screen sizes
- CTA button has clear hover and active states
- Background animation doesn't interfere with text readability
- Images are optimized (use
next/imagewith properpriorityflag) - No layout shift (CLS score < 0.1)
Get Instant Inspiration
Building a great animated hero section from scratch takes time. That's exactly why we built Animation Web — a curated library of hundreds of ready-to-use animated backgrounds, hero section templates, and gradient prompts.
Browse the Background Library or explore Hero Section Templates to find the perfect starting point for your next project.
Stop re-inventing the wheel. Start with something beautiful.