26 / 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 Breathing Film Grain Card with SVG Turbulence Noise
A sepia Super-8 card whose grain breathes faster and stronger on hover. The noise is a data-URI SVG feTurbulence — real fractal noise, not dots — and the hover doesn't start an animation so much as speed one up.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tch-26 w-full min-h-svh grid place-items-center bg-tch26-bg font-tch26-mono p-8">
<article tabindex="0" class="group relative w-[330px] h-[440px] rounded-lg overflow-hidden cursor-pointer outline-none bg-[linear-gradient(160deg,#3a2e22,#1b140d)] shadow-[0_20px_45px_rgb(0_0_0/0.5)] focus-visible:outline-2 focus-visible:outline-tch26-acc focus-visible:outline-offset-4 before:content-[''] before:absolute before:inset-0 before:bg-[radial-gradient(ellipse_at_50%_35%,rgb(210_170_110/0.35),transparent_60%),linear-gradient(160deg,#5a4732,#241a10)] after:content-[''] after:absolute after:inset-0 after:z-3 after:pointer-events-none after:shadow-[inset_0_0_90px_rgb(0_0_0/0.7)]">
<div class="absolute -inset-1/2 z-2 pointer-events-none opacity-12 mix-blend-overlay animate-tch26-drift transition-opacity duration-500 group-hover:opacity-42 group-hover:[animation-duration:0.25s] group-focus-visible:opacity-42 motion-reduce:animate-none bg-[url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120%22%20height%3D%22120%22%3E%3Cfilter%20id%3D%22n%22%3E%3CfeTurbulence%20type%3D%22fractalNoise%22%20baseFrequency%3D%220.9%22%20numOctaves%3D%223%22%20stitchTiles%3D%22stitch%22%2F%3E%3C%2Ffilter%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20filter%3D%22url(%23n)%22%2F%3E%3C%2Fsvg%3E')]"></div>
<div class="relative z-4 h-full p-[2.4rem] flex flex-col justify-between text-tch26-ink">
<span class="text-[0.72rem] tracking-[0.2em] text-tch26-acc">SUPER 8 · 1974</span>
<h2 class="font-tch26-display font-semibold italic text-[3rem] leading-[0.95]">Golden<br>Hour Reel</h2>
<p class="text-[0.82rem] leading-[1.65] text-tch26-body">A scanned film transfer. Hover and the grain breathes, like light running through celluloid.</p>
</div>
</article>
</section><section class="tch-26 w-full min-h-svh grid place-items-center bg-tch26-bg font-tch26-mono p-8">
<article tabindex="0" class="group relative w-[330px] h-[440px] rounded-lg overflow-hidden cursor-pointer outline-none bg-[linear-gradient(160deg,#3a2e22,#1b140d)] shadow-[0_20px_45px_rgb(0_0_0/0.5)] focus-visible:outline-2 focus-visible:outline-tch26-acc focus-visible:outline-offset-4 before:content-[''] before:absolute before:inset-0 before:bg-[radial-gradient(ellipse_at_50%_35%,rgb(210_170_110/0.35),transparent_60%),linear-gradient(160deg,#5a4732,#241a10)] after:content-[''] after:absolute after:inset-0 after:z-3 after:pointer-events-none after:shadow-[inset_0_0_90px_rgb(0_0_0/0.7)]">
<div class="absolute -inset-1/2 z-2 pointer-events-none opacity-12 mix-blend-overlay animate-tch26-drift transition-opacity duration-500 group-hover:opacity-42 group-hover:[animation-duration:0.25s] group-focus-visible:opacity-42 motion-reduce:animate-none bg-[url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120%22%20height%3D%22120%22%3E%3Cfilter%20id%3D%22n%22%3E%3CfeTurbulence%20type%3D%22fractalNoise%22%20baseFrequency%3D%220.9%22%20numOctaves%3D%223%22%20stitchTiles%3D%22stitch%22%2F%3E%3C%2Ffilter%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20filter%3D%22url(%23n)%22%2F%3E%3C%2Fsvg%3E')]"></div>
<div class="relative z-4 h-full p-[2.4rem] flex flex-col justify-between text-tch26-ink">
<span class="text-[0.72rem] tracking-[0.2em] text-tch26-acc">SUPER 8 · 1974</span>
<h2 class="font-tch26-display font-semibold italic text-[3rem] leading-[0.95]">Golden<br>Hour Reel</h2>
<p class="text-[0.82rem] leading-[1.65] text-tch26-body">A scanned film transfer. Hover and the grain breathes, like light running through celluloid.</p>
</div>
</article>
</section>@import "tailwindcss";
@keyframes tch26-drift {
0% {
transform: translate(0,0);
}
25% {
transform: translate(-8%, 5%);
}
50% {
transform: translate(6%, -8%);
}
75% {
transform: translate(-5%, -4%);
}
100% {
transform: translate(7%, 6%);
}
}
@theme {
--color-tch26-bg: #16130f;
--color-tch26-bg: oklch(0.18 0.01 70);
--color-tch26-ink: #f0e2cc;
--color-tch26-ink: oklch(0.92 0.03 80);
--color-tch26-body: #c4b39a;
--color-tch26-body: oklch(0.77 0.03 80);
--color-tch26-acc: #c9a877;
--color-tch26-acc: oklch(0.74 0.07 75);
--font-tch26-mono: 'Fragment Mono', ui-monospace, monospace;
--font-tch26-display: 'Cormorant', Georgia, serif;
--animate-tch26-drift: tch26-drift 0.6s steps(4) infinite;
}
.tch-26 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@keyframes tch26-drift {
0% {
transform: translate(0,0);
}
25% {
transform: translate(-8%, 5%);
}
50% {
transform: translate(6%, -8%);
}
75% {
transform: translate(-5%, -4%);
}
100% {
transform: translate(7%, 6%);
}
}
@theme {
--color-tch26-bg: #16130f;
--color-tch26-bg: oklch(0.18 0.01 70);
--color-tch26-ink: #f0e2cc;
--color-tch26-ink: oklch(0.92 0.03 80);
--color-tch26-body: #c4b39a;
--color-tch26-body: oklch(0.77 0.03 80);
--color-tch26-acc: #c9a877;
--color-tch26-acc: oklch(0.74 0.07 75);
--font-tch26-mono: 'Fragment Mono', ui-monospace, monospace;
--font-tch26-display: 'Cormorant', Georgia, serif;
--animate-tch26-drift: tch26-drift 0.6s steps(4) infinite;
}
.tch-26 {
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";
@keyframes tch26-drift {
0% {
transform: translate(0,0);
}
25% {
transform: translate(-8%, 5%);
}
50% {
transform: translate(6%, -8%);
}
75% {
transform: translate(-5%, -4%);
}
100% {
transform: translate(7%, 6%);
}
}
@theme {
--color-tch26-bg: #16130f;
--color-tch26-bg: oklch(0.18 0.01 70);
--color-tch26-ink: #f0e2cc;
--color-tch26-ink: oklch(0.92 0.03 80);
--color-tch26-body: #c4b39a;
--color-tch26-body: oklch(0.77 0.03 80);
--color-tch26-acc: #c9a877;
--color-tch26-acc: oklch(0.74 0.07 75);
--font-tch26-mono: 'Fragment Mono', ui-monospace, monospace;
--font-tch26-display: 'Cormorant', Georgia, serif;
--animate-tch26-drift: tch26-drift 0.6s steps(4) infinite;
}
.tch-26 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@keyframes tch26-drift {
0% {
transform: translate(0,0);
}
25% {
transform: translate(-8%, 5%);
}
50% {
transform: translate(6%, -8%);
}
75% {
transform: translate(-5%, -4%);
}
100% {
transform: translate(7%, 6%);
}
}
@theme {
--color-tch26-bg: #16130f;
--color-tch26-bg: oklch(0.18 0.01 70);
--color-tch26-ink: #f0e2cc;
--color-tch26-ink: oklch(0.92 0.03 80);
--color-tch26-body: #c4b39a;
--color-tch26-body: oklch(0.77 0.03 80);
--color-tch26-acc: #c9a877;
--color-tch26-acc: oklch(0.74 0.07 75);
--font-tch26-mono: 'Fragment Mono', ui-monospace, monospace;
--font-tch26-display: 'Cormorant', Georgia, serif;
--animate-tch26-drift: tch26-drift 0.6s steps(4) infinite;
}
.tch-26 {
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=Cormorant:wght@500;600&family=Fragment+Mono&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=Cormorant:wght@500;600&family=Fragment+Mono&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
group-hover:[animation-duration:0.25s]is the port's most interesting single utility: an arbitrary property overriding one longhand of a running animation, which is exactly what the CSS original did and what most people assume utilities cannot do.- The data URI needs full percent-encoding inside an arbitrary value — raw
<,"and spaces break the class parser. Encode once, paste, done. - UI change from the CSS original: focusable card, grain intensifies on
group-focus-visible:, and the vignette moved to the card's ownafter:so the grain layer no longer sits above it.
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 Breathing Film Grain Card with SVG Turbulence Noise
Source: https://codefronts.com/motion/tailwind-css-card-hover-effects/tailwind-breathing-film-grain-card/
A sepia Super-8 card whose grain breathes faster and stronger on hover. The noise is a data-URI SVG feTurbulence — real fractal noise, not dots — and the hover doesn't start an animation so much as speed one up.
## HTML
```html
<section class="tch-26 w-full min-h-svh grid place-items-center bg-tch26-bg font-tch26-mono p-8">
<article tabindex="0" class="group relative w-[330px] h-[440px] rounded-lg overflow-hidden cursor-pointer outline-none bg-[linear-gradient(160deg,#3a2e22,#1b140d)] shadow-[0_20px_45px_rgb(0_0_0/0.5)] focus-visible:outline-2 focus-visible:outline-tch26-acc focus-visible:outline-offset-4 before:content-[''] before:absolute before:inset-0 before:bg-[radial-gradient(ellipse_at_50%_35%,rgb(210_170_110/0.35),transparent_60%),linear-gradient(160deg,#5a4732,#241a10)] after:content-[''] after:absolute after:inset-0 after:z-3 after:pointer-events-none after:shadow-[inset_0_0_90px_rgb(0_0_0/0.7)]">
<div class="absolute -inset-1/2 z-2 pointer-events-none opacity-12 mix-blend-overlay animate-tch26-drift transition-opacity duration-500 group-hover:opacity-42 group-hover:[animation-duration:0.25s] group-focus-visible:opacity-42 motion-reduce:animate-none bg-[url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120%22%20height%3D%22120%22%3E%3Cfilter%20id%3D%22n%22%3E%3CfeTurbulence%20type%3D%22fractalNoise%22%20baseFrequency%3D%220.9%22%20numOctaves%3D%223%22%20stitchTiles%3D%22stitch%22%2F%3E%3C%2Ffilter%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20filter%3D%22url(%23n)%22%2F%3E%3C%2Fsvg%3E')]"></div>
<div class="relative z-4 h-full p-[2.4rem] flex flex-col justify-between text-tch26-ink">
<span class="text-[0.72rem] tracking-[0.2em] text-tch26-acc">SUPER 8 · 1974</span>
<h2 class="font-tch26-display font-semibold italic text-[3rem] leading-[0.95]">Golden<br>Hour Reel</h2>
<p class="text-[0.82rem] leading-[1.65] text-tch26-body">A scanned film transfer. Hover and the grain breathes, like light running through celluloid.</p>
</div>
</article>
</section>
```
## CSS
```css
@import "tailwindcss";
@keyframes tch26-drift {
0% {
transform: translate(0,0);
}
25% {
transform: translate(-8%, 5%);
}
50% {
transform: translate(6%, -8%);
}
75% {
transform: translate(-5%, -4%);
}
100% {
transform: translate(7%, 6%);
}
}
@theme {
--color-tch26-bg: #16130f;
--color-tch26-bg: oklch(0.18 0.01 70);
--color-tch26-ink: #f0e2cc;
--color-tch26-ink: oklch(0.92 0.03 80);
--color-tch26-body: #c4b39a;
--color-tch26-body: oklch(0.77 0.03 80);
--color-tch26-acc: #c9a877;
--color-tch26-acc: oklch(0.74 0.07 75);
--font-tch26-mono: 'Fragment Mono', ui-monospace, monospace;
--font-tch26-display: 'Cormorant', Georgia, serif;
--animate-tch26-drift: tch26-drift 0.6s steps(4) infinite;
}
.tch-26 {
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 Breathing Film Grain Card with SVG Turbulence Noise
Source: https://codefronts.com/motion/tailwind-css-card-hover-effects/tailwind-breathing-film-grain-card/
A sepia Super-8 card whose grain breathes faster and stronger on hover. The noise is a data-URI SVG feTurbulence — real fractal noise, not dots — and the hover doesn't start an animation so much as speed one up.
## HTML
```html
<section class="tch-26 w-full min-h-svh grid place-items-center bg-tch26-bg font-tch26-mono p-8">
<article tabindex="0" class="group relative w-[330px] h-[440px] rounded-lg overflow-hidden cursor-pointer outline-none bg-[linear-gradient(160deg,#3a2e22,#1b140d)] shadow-[0_20px_45px_rgb(0_0_0/0.5)] focus-visible:outline-2 focus-visible:outline-tch26-acc focus-visible:outline-offset-4 before:content-[''] before:absolute before:inset-0 before:bg-[radial-gradient(ellipse_at_50%_35%,rgb(210_170_110/0.35),transparent_60%),linear-gradient(160deg,#5a4732,#241a10)] after:content-[''] after:absolute after:inset-0 after:z-3 after:pointer-events-none after:shadow-[inset_0_0_90px_rgb(0_0_0/0.7)]">
<div class="absolute -inset-1/2 z-2 pointer-events-none opacity-12 mix-blend-overlay animate-tch26-drift transition-opacity duration-500 group-hover:opacity-42 group-hover:[animation-duration:0.25s] group-focus-visible:opacity-42 motion-reduce:animate-none bg-[url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120%22%20height%3D%22120%22%3E%3Cfilter%20id%3D%22n%22%3E%3CfeTurbulence%20type%3D%22fractalNoise%22%20baseFrequency%3D%220.9%22%20numOctaves%3D%223%22%20stitchTiles%3D%22stitch%22%2F%3E%3C%2Ffilter%3E%3Crect%20width%3D%22100%25%22%20height%3D%22100%25%22%20filter%3D%22url(%23n)%22%2F%3E%3C%2Fsvg%3E')]"></div>
<div class="relative z-4 h-full p-[2.4rem] flex flex-col justify-between text-tch26-ink">
<span class="text-[0.72rem] tracking-[0.2em] text-tch26-acc">SUPER 8 · 1974</span>
<h2 class="font-tch26-display font-semibold italic text-[3rem] leading-[0.95]">Golden<br>Hour Reel</h2>
<p class="text-[0.82rem] leading-[1.65] text-tch26-body">A scanned film transfer. Hover and the grain breathes, like light running through celluloid.</p>
</div>
</article>
</section>
```
## CSS
```css
@import "tailwindcss";
@keyframes tch26-drift {
0% {
transform: translate(0,0);
}
25% {
transform: translate(-8%, 5%);
}
50% {
transform: translate(6%, -8%);
}
75% {
transform: translate(-5%, -4%);
}
100% {
transform: translate(7%, 6%);
}
}
@theme {
--color-tch26-bg: #16130f;
--color-tch26-bg: oklch(0.18 0.01 70);
--color-tch26-ink: #f0e2cc;
--color-tch26-ink: oklch(0.92 0.03 80);
--color-tch26-body: #c4b39a;
--color-tch26-body: oklch(0.77 0.03 80);
--color-tch26-acc: #c9a877;
--color-tch26-acc: oklch(0.74 0.07 75);
--font-tch26-mono: 'Fragment Mono', ui-monospace, monospace;
--font-tch26-display: 'Cormorant', Georgia, serif;
--animate-tch26-drift: tch26-drift 0.6s steps(4) infinite;
}
.tch-26 {
width: 100%;
min-height: 100svh;
}
```How this works
Real noise, no assets. An SVG filter with baseFrequency="0.9" and three octaves produces fractal noise that tiles seamlessly. Encoded as a data URI it costs no request and scales to any DPI, which is why this beats a noise PNG.
Hover changes tempo, not state. The grain is already drifting at 0.6s per cycle; hover drops that to 0.25s and raises opacity from 0.12 to 0.42. Because the animation never restarts, the transition into the faster state is seamless — the film just runs harder.
The layer is oversized on purpose. -inset-1/2 means the grain extends half the card's size beyond every edge, so its 8% translate jitter can never reveal a bare corner.
Make it yours
- Grain coarseness is
baseFrequencyin the SVG — 0.6 is chunky 16mm, 1.2 is fine 35mm. - Blend mode:
overlayis balanced,soft-lightis cinema,multiplyreads as paper. - Rest opacity is the honest dial — 0.12 is a whisper, 0.25 is an archival print.
Gotchas — read before shipping
mix-blend-modeneeds an opaque parent background to blend against.- The grain layer must be
pointer-events-none; it covers the whole card and then some. motion-reduce:animate-nonefreezes the grain but keeps it visible — the texture is the identity, the drift is the flourish.- On OLED, fine noise can shimmer; a
blur-[0.2px]softens it without losing the texture.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
SVG filters in data URIs, mix-blend-mode and keyframes are universally supported; the floor is Tailwind v4's generated sheet.