Corner Peel Hover Reveal Card — CSS clip-path Page-Curl Effect
Corner Peel Hover Reveal Card · Animations · Plain HTML & CSS · Live preview
Copy & paste
Source Code
<div class="demo">
<div class="peel-card">
<div class="peel-under">
<span class="under-label">🎉 15% OFF</span>
<p>Use code PEEL15 at checkout</p>
</div>
<div class="peel-front">
<div class="peel-corner"></div>
<h3>Summer Sale</h3>
<p>Hover the corner to peel</p>
</div>
</div>
</div>* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: system-ui, sans-serif; background: #f8fafc; display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 24px; }
.peel-card { position: relative; width: 260px; height: 170px; }
.peel-under { position: absolute; inset: 0; border-radius: 16px; background: linear-gradient(135deg,#f59e0b,#ef4444); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; color: #fff; text-align: center; padding: 20px; }
.under-label { font-size: 17px; font-weight: 800; }
.peel-under p { font-size: 12px; opacity: 0.9; font-weight: 600; }
.peel-front { position: absolute; inset: 0; border-radius: 16px; background: #fff; border: 1px solid #e2e8f0; box-shadow: 0 8px 22px rgba(15,23,42,0.08); padding: 20px; display: flex; flex-direction: column; justify-content: flex-end; gap: 4px;
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 0 30px, 30px 30px, 30px 0);
transition: clip-path 0.35s cubic-bezier(.4,0,.2,1);
}
.peel-card:hover .peel-front {
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%, 0 108px, 108px 108px, 108px 0);
}
.peel-front h3 { font-size: 15px; font-weight: 800; color: #111827; }
.peel-front p { font-size: 11.5px; color: #94a3b8; font-weight: 600; }
.peel-corner { position: absolute; top: 0; left: 0; width: 30px; height: 30px; background: linear-gradient(135deg, transparent 48%, #fde68a 50%, #f59e0b 100%); border-radius: 16px 0 0 0; box-shadow: -2px 2px 6px rgba(0,0,0,0.08); transition: width 0.35s cubic-bezier(.4,0,.2,1), height 0.35s cubic-bezier(.4,0,.2,1); pointer-events: none; }
.peel-card:hover .peel-corner { width: 108px; height: 108px; }Extend with AI
Take This Snippet Further With AI
The AI prompt for this one is for Patreon supporters ($3 a month), along with a site with no ads. Supporters enter the passcode once and it is remembered in this browser.
What's included
Features
About this UI Snippet
Corner Peel Hover Card — Animating a Notched clip-path Polygon

This effect simulates a folded paper corner lifting away from a card to reveal something hidden beneath it — a classic print and skeuomorphic-UI motif — using nothing but a layered clip-path and a small gradient triangle, animated on hover with no JavaScript at all.
Two stacked layers, one clipped with a notch
.peel-under is a plain full-size panel sitting behind everything, showing the "reveal" content (a discount code, in this demo). .peel-front sits on top of it at the same size, but its clip-path is a seven-point polygon that traces the card's full rectangle *except* for a small square notch cut out of the top-left corner — 0 0, 100% 0, 100% 100%, 0 100%, 0 30px, 30px 30px, 30px 0. That notch is what lets a small triangle of the layer underneath show through even at rest.
Why the notch size, not a transform, is what animates
On :hover, the polygon's notch coordinates change from 30px/30px to 108px/108px, and because clip-path is transitioned with a cubic-bezier easing, the browser smoothly interpolates every point of the polygon between those two states — the missing corner visibly grows from a small triangle into a large one, exposing more of .peel-under as it does. This is a fundamentally different technique from a folding rotate3d transform (which would need a separately shaped, separately positioned corner piece with 3D perspective); here, the "peeling front layer" is really just one shape whose cut corner is getting bigger.
The corner fold decoration is a separate, matching element
.peel-corner is a small absolutely-positioned square in the exact top-left corner, styled with a diagonal two-color linear gradient (transparent 48%, #fde68a 50%, #f59e0b 100%) to fake the look of a folded paper triangle with a shaded underside, plus a subtle drop shadow. Its own width/height are animated on the same hover trigger and with the same transition timing as the front layer's clip-path notch, so the folded-corner graphic visually grows in lockstep with the clipped notch it's supposed to be sitting inside — two separately-styled elements kept in sync purely by sharing the same CSS trigger and duration.
Where this earns its place over a plain reveal-on-hover panel
A simple opacity or translate reveal communicates "something appears," but a corner-peel specifically communicates "there's something *underneath* this card," which reads well for surfacing secondary information a designer wants to feel discoverable rather than immediately obvious — a hidden discount code, a secondary stat, or an easter-egg detail on a promotional card.
Step by step
How to Use
- 1Edit the hidden content in .peel-underReplace the discount code copy with whatever content should be revealed by the peel.
- 2Edit the visible front content in .peel-frontUpdate the heading and hint text shown on the card before it's peeled.
- 3Adjust the peel sizeChange the 108px values in both the hover clip-path and .peel-corner's hover width/height together — they must match for the fold graphic to align with the actual clipped notch.
- 4Change the corner gradient colorsUpdate the linear-gradient stops on .peel-corner to make the fold graphic match your card's reveal-layer background.
- 5Trigger on click instead of hover for touch devicesSwap the .peel-card:hover selectors for a .peel-card.peeled class toggled by a click/tap listener if you need touch support.
Real-world uses
Common Use Cases
Got questions?
Frequently Asked Questions
No — the fold is a small square element with a CSS linear-gradient set diagonally to fake a folded triangle with a shaded underside, plus a drop-shadow for depth. No image assets are used.
A true 3D page-fold with perspective and rotate3d is far more complex to implement correctly (needing a separately shaped back-face element with matching lighting), while a clip-path notch achieves a convincing, lightweight "something is peeling back" effect with a single transitioning property.
Add a small script that toggles a class like .peeled on the .peel-card element on click/tap, and change the CSS selectors from :hover to that class instead — the rest of the animation logic stays identical.
Yes — mirror the polygon coordinates in clip-path (swap which corner has the notch) and reposition .peel-corner to the corresponding corner with a matching border-radius and gradient angle adjustment.
The clip-path notch is what actually exposes the hidden layer underneath, while .peel-corner is a purely decorative graphic meant to visually sit inside that exposed notch as a "folded paper" cue — if their sizes diverge, the fold graphic will either overflow the notch or leave part of it undecorated.
No — both layers are absolutely positioned within a fixed-size .peel-card container, and only clip-path and the corner element's own width/height animate, so no surrounding layout shifts occur during the hover.