02Vòng đôi xoay ngược chiều
Vòng trong và vòng ngoài xoay ngược chiều nhau, tạo cảm giác chiều sâu.
Dùng choLoading trong modal, card dashboard đang tải dữ liệu
역방향1.2초 · 0.9초두 겹

<main class="stage">
<div class="spinner" role="status" aria-label="Đang tải">
<span class="spinner__ring spinner__ring--outer" aria-hidden="true"></span>
<span class="spinner__ring spinner__ring--inner" aria-hidden="true"></span>
</div>
</main>@use "../../../../site/static/demo-tokens" as *;
$duration-outer: 1.2s; // 바깥 링 한 바퀴
$duration-inner: .9s; // 안쪽 링 한 바퀴 (역방향)
$color: $subject-ink; // 바깥 링 색
@include stage($stage-yellow);
.spinner {
position: relative;
width: clamp(56px, 16vw, 84px);
height: clamp(56px, 16vw, 84px);
}
.spinner__ring {
position: absolute;
inset: 0;
border-radius: 50%;
border: 5px solid transparent;
}
.spinner__ring--outer {
border-top-color: $color;
border-bottom-color: $color;
animation: spin $duration-outer linear infinite;
}
.spinner__ring--inner {
inset: 13px;
border-left-color: $subject-blue;
border-right-color: $subject-blue;
animation: spin-rev $duration-inner linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
@keyframes spin-rev {
to { transform: rotate(-360deg); }
}
@media (prefers-reduced-motion: reduce) {
.spinner__ring--outer, .spinner__ring--inner { 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);
}
.spinner {
position: relative;
width: clamp(56px, 16vw, 84px);
height: clamp(56px, 16vw, 84px);
}
.spinner__ring {
position: absolute;
inset: 0;
border-radius: 50%;
border: 5px solid transparent;
}
.spinner__ring--outer {
border-top-color: #17141a;
border-bottom-color: #17141a;
animation: spin 1.2s linear infinite;
}
.spinner__ring--inner {
inset: 13px;
border-left-color: #2f6df6;
border-right-color: #2f6df6;
animation: spin-rev 0.9s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
@keyframes spin-rev {
to {
transform: rotate(-360deg);
}
}
@media (prefers-reduced-motion: reduce) {
.spinner__ring--outer, .spinner__ring--inner {
animation: none;
}
}import type { CSSProperties } from "react";
import styles from "./DualRingSpinner.module.scss";
export type DualRingSpinnerProps = {
/** 스피너 지름 (기본 68px) */
size?: number;
/** 바깥 링 한 바퀴 시간 (기본 1200ms) */
durationOuter?: number;
/** 안쪽 링 한 바퀴 시간, 역방향 (기본 900ms) */
durationInner?: number;
/** 바깥 링 색 */
color?: string;
/** 안쪽 링 색 */
accent?: string;
label?: string;
};
type Vars = CSSProperties & {
"--size"?: string;
"--duration-outer"?: string;
"--duration-inner"?: string;
"--color"?: string;
"--accent"?: string;
};
export default function DualRingSpinner({
size = 68,
durationOuter = 1200,
durationInner = 900,
color = "#17141a",
accent = "#2f6df6",
label = "Loading",
}: DualRingSpinnerProps) {
const vars: Vars = {
"--size": `${size}px`,
"--duration-outer": `${durationOuter}ms`,
"--duration-inner": `${durationInner}ms`,
"--color": color,
"--accent": accent,
};
return (
<div className={styles.spinner} style={vars} role="status" aria-label={label}>
<span className={styles.outer} aria-hidden="true" />
<span className={styles.inner} aria-hidden="true" />
</div>
);
}02 Vòng đôi xoay ngược chiều — Diện tích đo được 1.833% · khung hình chuyển động 23/23Nguyên tác GODRICH · SCSS và React nằm trong tệp zip · 9 hiệu ứng css loading spinner animation gọn nhẹ
Bài viết chứa demo này
9 hiệu ứng css loading spinner animation gọn nhẹCSS loading spinner animation là một khối nhỏ tự xoay, tự nảy hoặc tự đổi độ sáng bằng thuần CSS để báo cho người dùng b Xem tất cả demo trong bài này


