09ローディングバッジのホログラムシマー
処理中を知らせるバッジの上を虹色の斜めの帯が繰り返し走り、終わるまで輝き続けます。
使いどころ決済処理中バッジ、アップロード・同期の進行表示、AI生成待機状態
repeating-linear-gradientbackground-position 애니메이션transform: scale 펄스

<main class="stage">
<div class="loading-badge">
<span class="loading-badge__shine" aria-hidden="true"></span>
<span class="loading-badge__dot" aria-hidden="true"></span>
<span class="loading-badge__label">処理中</span>
</div>
</main>@use "../../../../site/static/demo-tokens" as *;
$duration: $dur-loop; // 시머 띠가 한 번 훑는 시간
$easing: linear;
$color: $subject-blue; // 점 색
@include stage($stage-ink);
.loading-badge {
position: relative;
overflow: hidden;
display: inline-flex;
align-items: center;
gap: $sp-2;
padding: $sp-2 $sp-4;
border-radius: $r-pill;
background: $stage-ink;
box-shadow: $shadow-press;
border: 1px solid rgba($stage-paper, .12);
}
.loading-badge__shine {
position: absolute; inset: 0;
background: repeating-linear-gradient(115deg,
transparent 0 12%, rgba(255, 94, 203, .55) 12% 16%, rgba(94, 241, 255, .55) 16% 20%,
rgba(163, 255, 94, .55) 20% 24%, transparent 24% 36%);
background-size: 260% 260%;
animation: shimmer-sweep $duration $easing infinite;
}
.loading-badge__dot {
position: relative; z-index: 1;
width: 8px; height: 8px; border-radius: $r-pill;
background: $color;
animation: dot-pulse $duration $ease-out infinite;
}
.loading-badge__label { position: relative; z-index: 1; font-size: 11px; font-weight: 700; color: $stage-paper; font-family: inherit; }
@keyframes shimmer-sweep {
0% { background-position: 0% 0%; }
100% { background-position: -260% -260%; }
}
@keyframes dot-pulse {
0%, 100% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.4); opacity: .6; }
}
@media (prefers-reduced-motion: reduce) {
.loading-badge__shine,
.loading-badge__dot { animation: none; }
}html, body {
margin: 0;
overflow: hidden;
}
.stage {
box-sizing: border-box;
min-height: 100vh;
display: grid;
place-items: center;
margin: 0;
background: #17141a;
font-family: -apple-system, "Segoe UI", "Noto Sans KR", sans-serif;
padding: clamp(8px, 4vw, 24px);
}
.loading-badge {
position: relative;
overflow: hidden;
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 16px;
border-radius: 999px;
background: #17141a;
box-shadow: 0 6px 12px rgba(23, 20, 26, 0.32);
border: 1px solid rgba(255, 255, 255, 0.12);
}
.loading-badge__shine {
position: absolute;
inset: 0;
background: repeating-linear-gradient(115deg, transparent 0 12%, rgba(255, 94, 203, 0.55) 12% 16%, rgba(94, 241, 255, 0.55) 16% 20%, rgba(163, 255, 94, 0.55) 20% 24%, transparent 24% 36%);
background-size: 260% 260%;
animation: shimmer-sweep 2s linear infinite;
}
.loading-badge__dot {
position: relative;
z-index: 1;
width: 8px;
height: 8px;
border-radius: 999px;
background: #2f6df6;
animation: dot-pulse 2s ease-out infinite;
}
.loading-badge__label {
position: relative;
z-index: 1;
font-size: 11px;
font-weight: 700;
color: #ffffff;
font-family: inherit;
}
@keyframes shimmer-sweep {
0% {
background-position: 0% 0%;
}
100% {
background-position: -260% -260%;
}
}
@keyframes dot-pulse {
0%, 100% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.4);
opacity: 0.6;
}
}
@media (prefers-reduced-motion: reduce) {
.loading-badge__shine,
.loading-badge__dot {
animation: none;
}
}import type { CSSProperties } from "react";
import styles from "./LoadingShimmerBadge.module.scss";
export type LoadingShimmerBadgeProps = {
label: string;
/** 시머 띠가 한 번 훑는 시간 (기본 2000ms) */
duration?: number;
easing?: string;
/** 점 색 */
color?: string;
};
type Vars = CSSProperties & { "--duration"?: string; "--easing"?: string; "--color"?: string };
export default function LoadingShimmerBadge({
label,
duration = 2000,
easing = "linear",
color = "#2f6df6",
}: LoadingShimmerBadgeProps) {
const vars: Vars = { "--duration": `${duration}ms`, "--easing": easing, "--color": color };
return (
<div className={styles.badge} style={vars}>
<span className={styles.shine} aria-hidden="true" />
<span className={styles.dot} aria-hidden="true" />
<span className={styles.label}>{label}</span>
</div>
);
}09 ローディングバッジのホログラムシマー — 計測 累積面積 1.649% · 動いたフレーム 23/23GODRICH オリジナル · SCSS と React は zip に同梱 · CSS ホログラムカード効果9選 — ステッカー・バッジ・チケット
このデモが属する記事
CSS ホログラムカード効果9選 — ステッカー・バッジ・チケットCSS ホログラムとは、角度によって光の反射が変わる箔素材を、CSSのグラデーションとアニメーションだけで再現する技法です。ポケモンカードのような輝きは何度も画面で見かけますが、いざコードにしようとすると手が止まることが多いので、カード・ス この記事のデモをすべて見る


