22 / 33
All 33 in 33 Tailwind CSS Card Hover Effects
- 01Tailwind 3D Tilt & Parallax Card with Depth Layers
- 02Tailwind Glowing Gradient & Glassmorphic Border Card
- 03Tailwind Image Zoom Card with Slide-Up Content Reveal
- 04Tailwind 3D Flip Card (Front to Back) with backface-visibility
- 05Tailwind Sibling De-emphasis Pricing Grid with has-hover
- 06Tailwind Minimalist Elevation Card with Layered Dynamic Shadows
- 07Tailwind Elastic Lift Card with Spring Cubic-Bezier
- 08Tailwind Animated Conic Gradient Border Card with @property
- 09Tailwind Stacked Layer Reveal Card (Fanned Risograph Deck)
- 10Tailwind Holographic Foil Shimmer Card with mix-blend-mode
- 11Tailwind Curtain Reveal Card (Parting Velvet Halves)
- 12Tailwind Corner Peel Card with clip-path Triangles
- 13Tailwind Neon Sign Card with Layered Text-Shadow Glow
- 14Tailwind CRT Scanline Terminal Card with Sweeping Beam
- 15Tailwind Depth Parallax Landscape Card with Layer Multipliers
- 16Tailwind Cursor Spotlight Card with Masked Border Highlight
- 17Tailwind 3D Tilt Product Card with Specular Glare
- 18Tailwind Slide-Up Panel Card with Peek Header Swap
- 19Tailwind Credit Card Flip with Magnetic Strip & CVV
- 20Tailwind RGB Channel-Split Glitch Card
- 21Tailwind Rotating Conic Aura Card with Blurred Gradient Bloom
- 22Tailwind Blob-to-Rectangle Border Morph Card
- 23Tailwind Magnetic Float Orb Card with Pointer Attraction
- 24Tailwind Typewriter Reveal Card with Steps Animation & Caret
- 25Tailwind Magazine Overlay Slide Card (Full-Face Panel Takeover)
- 26Tailwind Breathing Film Grain Card with SVG Turbulence Noise
- 27Tailwind Frosted Glass Intensify Card with Deepening Backdrop Blur
- 28Tailwind Blueprint Reveal Card with Circular clip-path Wipe
- 29Tailwind Cursor-Anchored Shockwave Ripple Card
- 30Tailwind Color-Burn Ignition Card with Grayscale-to-Fire Hover
- 31Tailwind Prismatic Light Sweep Card with Screen Blend Bar
- 32Tailwind Book Cover Open Card with Hinged 3D Rotation
- 33Tailwind Drifting Aurora Ribbons Card with Blurred Gradient Bands
Tailwind Blob-to-Rectangle Border Morph Card
A meditation card that rests as an organic blob and settles into a clean rounded rectangle on hover, with the icon and button reshaping in sync. Three elements morph on one spring curve, and because the curve is shared it becomes a @theme easing token.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tch-22 w-full min-h-svh grid place-items-center bg-tch22-bg bg-[radial-gradient(circle_at_80%_10%,#ffe0cc,transparent_50%)] font-tch22-sans p-8">
<article tabindex="0" class="group relative w-[320px] h-[420px] overflow-hidden cursor-pointer outline-none text-white bg-[linear-gradient(155deg,#ff7e54,#ff4d8d)] rounded-[38%_62%_63%_37%/41%_44%_56%_59%] shadow-[0_20px_45px_rgb(255_77_141/0.35)] transition-[border-radius,translate,box-shadow] duration-700 ease-tch22-settle hover:rounded-[28px] hover:-translate-y-1.5 hover:shadow-[0_30px_60px_rgb(255_77_141/0.45)] focus-visible:rounded-[28px] focus-visible:-translate-y-1.5 focus-visible:outline-3 focus-visible:outline-white focus-visible:outline-offset-4 motion-reduce:duration-150 before:content-[''] before:absolute before:inset-0 before:bg-[radial-gradient(circle_at_30%_20%,rgb(255_255_255/0.35),transparent_55%)]">
<div class="relative z-2 h-full p-[2.6rem] flex flex-col justify-between">
<div class="grid place-items-center size-14 rounded-full bg-white/25 text-[1.6rem] transition-[border-radius] duration-700 ease-tch22-settle group-hover:rounded-2xl group-focus-visible:rounded-2xl motion-reduce:duration-150">🫧</div>
<div>
<h2 class="font-tch22-display font-bold text-[2.5rem] leading-none">Bubble<br>Wellness</h2>
<p class="text-[0.9rem] leading-[1.6] text-white/90 mt-2">A meditation app that breathes with you. Shapes soften and settle as you exhale.</p>
</div>
<a href="#" class="self-start inline-flex items-center min-h-11 px-6 rounded-full bg-white text-tch22-acc font-tch22-display font-semibold text-[0.9rem] no-underline transition-[border-radius] duration-700 ease-tch22-settle group-hover:rounded-xl focus-visible:outline-2 focus-visible:outline-white focus-visible:outline-offset-2 motion-reduce:duration-150">Try a session</a>
</div>
</article>
</section><section class="tch-22 w-full min-h-svh grid place-items-center bg-tch22-bg bg-[radial-gradient(circle_at_80%_10%,#ffe0cc,transparent_50%)] font-tch22-sans p-8">
<article tabindex="0" class="group relative w-[320px] h-[420px] overflow-hidden cursor-pointer outline-none text-white bg-[linear-gradient(155deg,#ff7e54,#ff4d8d)] rounded-[38%_62%_63%_37%/41%_44%_56%_59%] shadow-[0_20px_45px_rgb(255_77_141/0.35)] transition-[border-radius,translate,box-shadow] duration-700 ease-tch22-settle hover:rounded-[28px] hover:-translate-y-1.5 hover:shadow-[0_30px_60px_rgb(255_77_141/0.45)] focus-visible:rounded-[28px] focus-visible:-translate-y-1.5 focus-visible:outline-3 focus-visible:outline-white focus-visible:outline-offset-4 motion-reduce:duration-150 before:content-[''] before:absolute before:inset-0 before:bg-[radial-gradient(circle_at_30%_20%,rgb(255_255_255/0.35),transparent_55%)]">
<div class="relative z-2 h-full p-[2.6rem] flex flex-col justify-between">
<div class="grid place-items-center size-14 rounded-full bg-white/25 text-[1.6rem] transition-[border-radius] duration-700 ease-tch22-settle group-hover:rounded-2xl group-focus-visible:rounded-2xl motion-reduce:duration-150">🫧</div>
<div>
<h2 class="font-tch22-display font-bold text-[2.5rem] leading-none">Bubble<br>Wellness</h2>
<p class="text-[0.9rem] leading-[1.6] text-white/90 mt-2">A meditation app that breathes with you. Shapes soften and settle as you exhale.</p>
</div>
<a href="#" class="self-start inline-flex items-center min-h-11 px-6 rounded-full bg-white text-tch22-acc font-tch22-display font-semibold text-[0.9rem] no-underline transition-[border-radius] duration-700 ease-tch22-settle group-hover:rounded-xl focus-visible:outline-2 focus-visible:outline-white focus-visible:outline-offset-2 motion-reduce:duration-150">Try a session</a>
</div>
</article>
</section>@import "tailwindcss";
@theme {
--color-tch22-bg: #fef0e6;
--color-tch22-bg: oklch(0.96 0.02 55);
--color-tch22-acc: #ff4d8d;
--color-tch22-acc: oklch(0.68 0.22 5);
--font-tch22-sans: 'DM Sans', system-ui, sans-serif;
--font-tch22-display: 'Fredoka', system-ui, sans-serif;
--ease-tch22-settle: cubic-bezier(0.34, 1.4, 0.5, 1);
}
.tch-22 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tch22-bg: #fef0e6;
--color-tch22-bg: oklch(0.96 0.02 55);
--color-tch22-acc: #ff4d8d;
--color-tch22-acc: oklch(0.68 0.22 5);
--font-tch22-sans: 'DM Sans', system-ui, sans-serif;
--font-tch22-display: 'Fredoka', system-ui, sans-serif;
--ease-tch22-settle: cubic-bezier(0.34, 1.4, 0.5, 1);
}
.tch-22 {
width: 100%;
min-height: 100svh;
}Setup — do this once per project
Skip this if your project already runs Tailwind v4.
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>Compiles in the browser — perfect for a CodePen or a quick test, not for production.
npm install tailwindcss @tailwindcss/vite
npm install tailwindcss @tailwindcss/vite// vite.config.js ("type": "module" in package.json)
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [tailwindcss()],
})// vite.config.js ("type": "module" in package.json)
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [tailwindcss()],
})Any v4 setup works — Vite, PostCSS or the CLI. Nothing in this demo is bundler-specific.
@import "tailwindcss";
@theme {
--color-tch22-bg: #fef0e6;
--color-tch22-bg: oklch(0.96 0.02 55);
--color-tch22-acc: #ff4d8d;
--color-tch22-acc: oklch(0.68 0.22 5);
--font-tch22-sans: 'DM Sans', system-ui, sans-serif;
--font-tch22-display: 'Fredoka', system-ui, sans-serif;
--ease-tch22-settle: cubic-bezier(0.34, 1.4, 0.5, 1);
}
.tch-22 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tch22-bg: #fef0e6;
--color-tch22-bg: oklch(0.96 0.02 55);
--color-tch22-acc: #ff4d8d;
--color-tch22-acc: oklch(0.68 0.22 5);
--font-tch22-sans: 'DM Sans', system-ui, sans-serif;
--font-tch22-display: 'Fredoka', system-ui, sans-serif;
--ease-tch22-settle: cubic-bezier(0.34, 1.4, 0.5, 1);
}
.tch-22 {
width: 100%;
min-height: 100svh;
}<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fredoka:wght@500;600;700&family=DM+Sans:opsz,wght@9..40,400;9..40,500&display=swap">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fredoka:wght@500;600;700&family=DM+Sans:opsz,wght@9..40,400;9..40,500&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
- The eight-value radius is exactly the kind of thing arbitrary values exist for: not a design-scale token, not repeatable, and unambiguous where it sits.
- Three elements sharing
ease-tch22-settleis the same argument as demo 07 — a curve used more than once belongs in@theme. - UI change from the CSS original: focusable card, morph on
focus-visible:, the button is a real link with a 44px target, and reduced motion shortens to 150ms rather than killing the transition.
Here's a working CSS demo from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Tailwind Blob-to-Rectangle Border Morph Card
Source: https://codefronts.com/motion/tailwind-css-card-hover-effects/tailwind-blob-to-rectangle-border-morph-card/
A meditation card that rests as an organic blob and settles into a clean rounded rectangle on hover, with the icon and button reshaping in sync. Three elements morph on one spring curve, and because the curve is shared it becomes a @theme easing token.
## HTML
```html
<section class="tch-22 w-full min-h-svh grid place-items-center bg-tch22-bg bg-[radial-gradient(circle_at_80%_10%,#ffe0cc,transparent_50%)] font-tch22-sans p-8">
<article tabindex="0" class="group relative w-[320px] h-[420px] overflow-hidden cursor-pointer outline-none text-white bg-[linear-gradient(155deg,#ff7e54,#ff4d8d)] rounded-[38%_62%_63%_37%/41%_44%_56%_59%] shadow-[0_20px_45px_rgb(255_77_141/0.35)] transition-[border-radius,translate,box-shadow] duration-700 ease-tch22-settle hover:rounded-[28px] hover:-translate-y-1.5 hover:shadow-[0_30px_60px_rgb(255_77_141/0.45)] focus-visible:rounded-[28px] focus-visible:-translate-y-1.5 focus-visible:outline-3 focus-visible:outline-white focus-visible:outline-offset-4 motion-reduce:duration-150 before:content-[''] before:absolute before:inset-0 before:bg-[radial-gradient(circle_at_30%_20%,rgb(255_255_255/0.35),transparent_55%)]">
<div class="relative z-2 h-full p-[2.6rem] flex flex-col justify-between">
<div class="grid place-items-center size-14 rounded-full bg-white/25 text-[1.6rem] transition-[border-radius] duration-700 ease-tch22-settle group-hover:rounded-2xl group-focus-visible:rounded-2xl motion-reduce:duration-150">🫧</div>
<div>
<h2 class="font-tch22-display font-bold text-[2.5rem] leading-none">Bubble<br>Wellness</h2>
<p class="text-[0.9rem] leading-[1.6] text-white/90 mt-2">A meditation app that breathes with you. Shapes soften and settle as you exhale.</p>
</div>
<a href="#" class="self-start inline-flex items-center min-h-11 px-6 rounded-full bg-white text-tch22-acc font-tch22-display font-semibold text-[0.9rem] no-underline transition-[border-radius] duration-700 ease-tch22-settle group-hover:rounded-xl focus-visible:outline-2 focus-visible:outline-white focus-visible:outline-offset-2 motion-reduce:duration-150">Try a session</a>
</div>
</article>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tch22-bg: #fef0e6;
--color-tch22-bg: oklch(0.96 0.02 55);
--color-tch22-acc: #ff4d8d;
--color-tch22-acc: oklch(0.68 0.22 5);
--font-tch22-sans: 'DM Sans', system-ui, sans-serif;
--font-tch22-display: 'Fredoka', system-ui, sans-serif;
--ease-tch22-settle: cubic-bezier(0.34, 1.4, 0.5, 1);
}
.tch-22 {
width: 100%;
min-height: 100svh;
}
```Here's a working CSS demo from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Tailwind Blob-to-Rectangle Border Morph Card
Source: https://codefronts.com/motion/tailwind-css-card-hover-effects/tailwind-blob-to-rectangle-border-morph-card/
A meditation card that rests as an organic blob and settles into a clean rounded rectangle on hover, with the icon and button reshaping in sync. Three elements morph on one spring curve, and because the curve is shared it becomes a @theme easing token.
## HTML
```html
<section class="tch-22 w-full min-h-svh grid place-items-center bg-tch22-bg bg-[radial-gradient(circle_at_80%_10%,#ffe0cc,transparent_50%)] font-tch22-sans p-8">
<article tabindex="0" class="group relative w-[320px] h-[420px] overflow-hidden cursor-pointer outline-none text-white bg-[linear-gradient(155deg,#ff7e54,#ff4d8d)] rounded-[38%_62%_63%_37%/41%_44%_56%_59%] shadow-[0_20px_45px_rgb(255_77_141/0.35)] transition-[border-radius,translate,box-shadow] duration-700 ease-tch22-settle hover:rounded-[28px] hover:-translate-y-1.5 hover:shadow-[0_30px_60px_rgb(255_77_141/0.45)] focus-visible:rounded-[28px] focus-visible:-translate-y-1.5 focus-visible:outline-3 focus-visible:outline-white focus-visible:outline-offset-4 motion-reduce:duration-150 before:content-[''] before:absolute before:inset-0 before:bg-[radial-gradient(circle_at_30%_20%,rgb(255_255_255/0.35),transparent_55%)]">
<div class="relative z-2 h-full p-[2.6rem] flex flex-col justify-between">
<div class="grid place-items-center size-14 rounded-full bg-white/25 text-[1.6rem] transition-[border-radius] duration-700 ease-tch22-settle group-hover:rounded-2xl group-focus-visible:rounded-2xl motion-reduce:duration-150">🫧</div>
<div>
<h2 class="font-tch22-display font-bold text-[2.5rem] leading-none">Bubble<br>Wellness</h2>
<p class="text-[0.9rem] leading-[1.6] text-white/90 mt-2">A meditation app that breathes with you. Shapes soften and settle as you exhale.</p>
</div>
<a href="#" class="self-start inline-flex items-center min-h-11 px-6 rounded-full bg-white text-tch22-acc font-tch22-display font-semibold text-[0.9rem] no-underline transition-[border-radius] duration-700 ease-tch22-settle group-hover:rounded-xl focus-visible:outline-2 focus-visible:outline-white focus-visible:outline-offset-2 motion-reduce:duration-150">Try a session</a>
</div>
</article>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tch22-bg: #fef0e6;
--color-tch22-bg: oklch(0.96 0.02 55);
--color-tch22-acc: #ff4d8d;
--color-tch22-acc: oklch(0.68 0.22 5);
--font-tch22-sans: 'DM Sans', system-ui, sans-serif;
--font-tch22-display: 'Fredoka', system-ui, sans-serif;
--ease-tch22-settle: cubic-bezier(0.34, 1.4, 0.5, 1);
}
.tch-22 {
width: 100%;
min-height: 100svh;
}
```How this works
Eight values make a blob. border-radius accepts four horizontal and four vertical radii; mismatched percentages produce an asymmetric organic shape. Tailwind carries the whole thing through an arbitrary value with underscores for the spaces — unlovely to read, but exact.
Three elements, one curve. Card, icon and button all morph on ease-tch22-settle, a spring with mild overshoot. Sharing the curve is what makes the card feel like one organism relaxing rather than three independent animations.
border-radius is animatable; border-image is not. That is the boundary of this technique — radius morphs are free, edge-texture morphs need pseudo-elements.
Make it yours
- Rest shape: change the eight percentages. Closer to 50% is rounder; wilder spreads read as liquid.
- Settle target:
rounded-[28px]is calm;rounded-noneis a hard snap to grid. - Timing: 700ms is a slow exhale, which is the entire brand argument for this card.
Gotchas — read before shipping
- Test the blob against real content — an aggressive radius clips corner text before you notice it in a screenshot.
- Radii above ~50% of the shorter side produce ellipses. Usually intentional here, but check both states.
motion-reduce:should shorten, not delete: the card still needs to reach its settled shape.- Keep the button's morph subtler than the card's; a pill collapsing to a square reads as a different button.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
Animating border-radius is universally supported; border-image animation is not, in any browser.