A free animated Join Now button featuring SVG path morphing, typewriter text reveal, color cycling, floating icon circles, 3D CSS hover, confetti explosion on click, and a gradient modal with progress bar. Pure HTML, CSS, and vanilla JavaScript. Zero libraries. Copy-paste ready.
Every CSS @keyframes and JavaScript technique used in the Super Enhanced Join Now Button.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Super Enhanced Join Now Button</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<!-- SVG Join Now Button -->
<div class="join-container" id="joinBtn">
<svg viewBox="0 0 280 120" xmlns="http://www.w3.org/2000/svg">
<!-- Gradient definition -->
<defs>
<linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#ff6b6b; stop-opacity:1"/>
<stop offset="100%" style="stop-color:#feca57; stop-opacity:1"/>
</linearGradient>
</defs>
<!-- Morphing background path -->
<path class="background"
d="M0,60 Q70,10 140,60 T280,60 Q350,110 280,60 T0,60"
fill="url(#bgGrad)"/>
<!-- Floating icon circles -->
<g class="icon" transform="translate(30, 40)">
<circle cx="10" cy="10" r="10"/>
<circle cx="35" cy="10" r="8"/>
<circle cx="60" cy="10" r="6"/>
</g>
<!-- Typewriter + color-cycle text -->
<text x="140" y="75" class="text">Join Now</text>
<!-- Scatter particles -->
<circle class="particles" cx="250" cy="30" r="4" fill="#fff"/>
<circle class="particles" cx="260" cy="50" r="3" fill="#fff"/>
<circle class="particles" cx="270" cy="70" r="2" fill="#fff"/>
</svg>
</div>
<!-- Join Modal with Progress Bar -->
<div class="modal" id="joinModal">
<h2>Welcome Aboard! 🎉</h2>
<p>Joining in progress...</p>
<div class="progress-bar">
<div class="progress-fill"></div>
</div>
<p>Redirecting to your dashboard...</p>
<button onclick="closeModal()">Skip</button>
</div>
<script src="script.js"></script>
</body>
</html>
How SVG path morphing, confetti explosion, 3D hover, and the modal progress bar work.
CSS SVG path morphing uses @keyframes with the d property to animate between two SVG path strings that have the same number and type of commands. Both paths here use Q (quadratic bezier) commands — the only difference is the control point Y-coordinate flipping from 10 to 110, inverting the wave shape. The browser interpolates the coordinate values, creating a smooth organic blob morphing effect at 4s infinite ease-in-out.
The confetti uses JavaScript DOM creation: a for loop runs 20 times. Each iteration creates a div.confetti, sets CSS custom properties --x and --y to random values from (Math.random()-0.5)*200 (±100px range), positions the element at e.clientX/clientY (click coordinates), and appends it to body. The CSS @keyframes burst animation uses translate(var(--x), var(--y)) to move each piece in its unique direction. setTimeout removes each element after 1000ms preventing DOM buildup.
The 3D hover uses CSS perspective: 1000px on body to establish a 3D viewing context, and transform-style: preserve-3d on .join-container to place the child element in 3D space. The :hover rule applies transform: rotateX(10deg) rotateY(10deg) scale(1.05) with transition: transform 0.3s ease. The rotateX and rotateY tilt the button along both axes simultaneously. For a mouse-tracking 3D tilt, you would use JavaScript mousemove with getBoundingClientRect() to calculate relative cursor position and apply dynamic rotation values.
The SVG typewriter uses the steps() timing function: animation: typewriter 3s steps(8) 1s forwards. The @keyframes simply animates to { opacity: 1 } from the initial opacity: 0. The steps(8) timing creates 8 equal discrete jumps instead of smooth interpolation, mimicking a character-by-character appearance. The 1s delay starts it after load. The forwards fill-mode keeps opacity at 1 after the animation completes, then colorCycle and wave chain in with animation-delay: 4s.
The modal uses display: none / display: block toggled by JavaScript classList.add('show') and classList.remove('show'). It centers with position: fixed, top: 50%, left: 50%, transform: translate(-50%, -50%). The .progress-fill uses @keyframes fill { to { width: 100%; } } with animation: fill 3s ease-in-out forwards, growing from 0% to 100% width. JavaScript automatically hides the modal after setTimeout with a 3000ms delay. The Skip button calls closeModal() which removes the .show class immediately.
The 7 animations are: (1) morph — SVG path d property morphs between two blob shapes, (2) typewriter — steps(8) opacity reveal, (3) colorCycle — SVG fill cycling through 4 colors, (4) wave — text translateY float, (5) float — icon circles translateY(-15px), (6) bounce — icon circles scale(1.1) alternate pulse, (7) scatter — particles translate+rotate to the top right. Plus the confetti burst @keyframes for the JavaScript-created confetti elements. All animations run simultaneously via CSS animation shorthand.
Free courses in JavaScript, Python, HTML, CSS, SQL, DSA, Kotlin, C, C++, C#. Zero account needed.