02Sticker corner peel + holographic sweep
One corner of the sticker card sits slightly lifted at rest, and hovering sends a rainbow sheet sweeping diagonally underneath it.
Best forPlanner/diary sticker mockups, badge-style product sticker previews
clip-path 모서리repeating-linear-gradientbackground-position 스윕

<main class="stage">
<div class="sticker is-demo" tabindex="0">
<span class="sticker__peel" aria-hidden="true"></span>
<span class="sticker__shine" aria-hidden="true"></span>
<span class="sticker__flag">NEW</span>
</div>
</main>@use "../../../../site/static/demo-tokens" as *;
$duration: $dur-base; // 모서리가 더 들리는 시간
$easing: $ease-out;
$color: $subject-cream; // 스티커 바탕색
@include stage($stage-yellow);
.sticker {
position: relative;
width: min(150px, 48vw);
aspect-ratio: 1;
border-radius: $r-card;
background: $color;
box-shadow: $shadow-press;
overflow: hidden;
outline: none;
cursor: pointer;
}
.sticker__peel {
position: absolute; top: 0; right: 0;
width: 40px; height: 40px;
background: linear-gradient(135deg, rgba($stage-ink, .08) 50%, $stage-paper 50%);
clip-path: polygon(100% 0, 0 0, 100% 100%);
transform-origin: 100% 0; // 규칙8: 스티커 접힌 코너 경첩
box-shadow: -6px 6px 12px rgba($stage-ink, .28);
}
.sticker__shine {
position: absolute; inset: 0;
background: repeating-linear-gradient(115deg,
transparent 0 10%, #dcb9d1 10% 12%, #b9d9dc 12% 14%, #c8dcb9 14% 16%, #dcdab9 16% 18%, transparent 18% 30%);
background-size: 260% 260%;
background-position: -60% -60%;
mix-blend-mode: multiply;
opacity: 0;
}
.sticker__flag {
position: absolute; left: $sp-3; bottom: $sp-3;
font-weight: 800; font-size: 12px; letter-spacing: .04em; color: $stage-ink; font-family: inherit;
}
.sticker:hover .sticker__peel,
.sticker:focus-visible .sticker__peel { transform: rotate(-16deg) translate(6px, -6px); }
.sticker:hover .sticker__shine,
.sticker:focus-visible .sticker__shine { opacity: .9; background-position: 60% 60%; transition: opacity $duration $easing, background-position $duration $easing; }
.sticker.is-demo .sticker__peel { animation: peel-loop $dur-loop $easing infinite; }
.sticker.is-demo .sticker__shine { animation: sweep-loop $dur-loop $easing infinite; }
@keyframes peel-loop {
0%, 10% { transform: rotate(-6deg) translate(2px, -2px); }
40% { transform: rotate(-18deg) translate(7px, -7px); }
70% { transform: rotate(-13deg) translate(5px, -5px); }
90%, 100% { transform: rotate(-6deg) translate(2px, -2px); }
}
@keyframes sweep-loop {
0%, 10% { opacity: 0; background-position: -60% -60%; }
40% { opacity: .9; background-position: 20% 20%; }
70% { opacity: .9; background-position: 90% 90%; }
90%, 100% { opacity: 0; background-position: 150% 150%; }
}
@media (prefers-reduced-motion: reduce) {
.sticker__peel { transform: rotate(-12deg) translate(4px, -4px); }
.sticker__shine { opacity: .5; background-position: 40% 40%; }
.sticker.is-demo .sticker__peel,
.sticker.is-demo .sticker__shine { animation: none; }
}html, body {
margin: 0;
overflow: hidden;
}
.stage {
box-sizing: border-box;
min-height: 100vh;
display: grid;
place-items: center;
margin: 0;
background: #ffd23f;
font-family: -apple-system, "Segoe UI", "Noto Sans KR", sans-serif;
padding: clamp(8px, 4vw, 24px);
}
.sticker {
position: relative;
width: min(150px, 48vw);
aspect-ratio: 1;
border-radius: 16px;
background: #fff7e6;
box-shadow: 0 6px 12px rgba(23, 20, 26, 0.32);
overflow: hidden;
outline: none;
cursor: pointer;
}
.sticker__peel {
position: absolute;
top: 0;
right: 0;
width: 40px;
height: 40px;
background: linear-gradient(135deg, rgba(23, 20, 26, 0.08) 50%, #ffffff 50%);
clip-path: polygon(100% 0, 0 0, 100% 100%);
transform-origin: 100% 0;
box-shadow: -6px 6px 12px rgba(23, 20, 26, 0.28);
}
.sticker__shine {
position: absolute;
inset: 0;
background: repeating-linear-gradient(115deg, transparent 0 10%, #dcb9d1 10% 12%, #b9d9dc 12% 14%, #c8dcb9 14% 16%, #dcdab9 16% 18%, transparent 18% 30%);
background-size: 260% 260%;
background-position: -60% -60%;
mix-blend-mode: multiply;
opacity: 0;
}
.sticker__flag {
position: absolute;
left: 12px;
bottom: 12px;
font-weight: 800;
font-size: 12px;
letter-spacing: 0.04em;
color: #17141a;
font-family: inherit;
}
.sticker:hover .sticker__peel,
.sticker:focus-visible .sticker__peel {
transform: rotate(-16deg) translate(6px, -6px);
}
.sticker:hover .sticker__shine,
.sticker:focus-visible .sticker__shine {
opacity: 0.9;
background-position: 60% 60%;
transition: opacity 300ms ease-out, background-position 300ms ease-out;
}
.sticker.is-demo .sticker__peel {
animation: peel-loop 2s ease-out infinite;
}
.sticker.is-demo .sticker__shine {
animation: sweep-loop 2s ease-out infinite;
}
@keyframes peel-loop {
0%, 10% {
transform: rotate(-6deg) translate(2px, -2px);
}
40% {
transform: rotate(-18deg) translate(7px, -7px);
}
70% {
transform: rotate(-13deg) translate(5px, -5px);
}
90%, 100% {
transform: rotate(-6deg) translate(2px, -2px);
}
}
@keyframes sweep-loop {
0%, 10% {
opacity: 0;
background-position: -60% -60%;
}
40% {
opacity: 0.9;
background-position: 20% 20%;
}
70% {
opacity: 0.9;
background-position: 90% 90%;
}
90%, 100% {
opacity: 0;
background-position: 150% 150%;
}
}
@media (prefers-reduced-motion: reduce) {
.sticker__peel {
transform: rotate(-12deg) translate(4px, -4px);
}
.sticker__shine {
opacity: 0.5;
background-position: 40% 40%;
}
.sticker.is-demo .sticker__peel,
.sticker.is-demo .sticker__shine {
animation: none;
}
}import type { CSSProperties } from "react";
import styles from "./StickerPeelShine.module.scss";
export type StickerPeelShineProps = {
flag: string;
/** 모서리가 더 들리는 시간 (기본 300ms) */
duration?: number;
easing?: string;
/** 스티커 바탕색 */
color?: string;
};
type Vars = CSSProperties & { "--duration"?: string; "--easing"?: string; "--color"?: string };
export default function StickerPeelShine({
flag,
duration = 300,
easing = "ease-out",
color = "#fff7e6",
}: StickerPeelShineProps) {
const vars: Vars = { "--duration": `${duration}ms`, "--easing": easing, "--color": color };
return (
<div className={styles.sticker} style={vars} tabIndex={0}>
<span className={styles.peel} aria-hidden="true" />
<span className={styles.shine} aria-hidden="true" />
<span className={styles.flag}>{flag}</span>
</div>
);
}02 Sticker corner peel + holographic sweep — Measured area 15.39% · moving frames 19/23Original by GODRICH · SCSS and React ship in the zip · 9 CSS Holographic Card Effects (Copy-Paste)
The post this demo lives in
9 CSS Holographic Card Effects (Copy-Paste)A CSS holographic card effect fakes how foil catches light from different angles using only CSS gradients — the shine be See all demos in this post


