Spinner Ring

링 스피너

A ring with one edge colored differently, spun forever — the simplest rotating loader.

Also known as: Ring spinnerLoading ring
···
html
<div class="wrap" role="status" aria-live="polite">
  <div class="ring" aria-hidden="true"></div>
  <span class="cap">border-top 색상 + rotate</span>
</div>
css
.wrap{display:flex;flex-direction:column;align-items:center;gap:16px}
.ring{width:clamp(34px,11vmin,64px);height:clamp(34px,11vmin,64px);border-radius:50%;border:clamp(3px,.9vmin,5px) solid var(--line);border-top-color:var(--accent);animation:sr .8s linear infinite}
@keyframes sr{to{transform:rotate(360deg)}}
.cap{font-size:clamp(9px,2.4vmin,11px);color:var(--muted);letter-spacing:.02em}

The standard indeterminate indicator for a small space — inside a button, or an inline loading spot. It fits short, unpredictable requests like a form submit or an API call; once a task breaks into steps with a known progress, a determinate progress-ring serves the user better.

Built by coloring the whole border a faint tone (var(--line)) except the top edge, which gets the accent color, then spinning it forever with a linear transform: rotate. At three lines of CSS it's the cheapest loader here, which is why it's the default in most component libraries.

If it flashes on and off within 200ms it reads as a glitch, so skip showing it at all for loads that fast; for a long wait covering the whole screen, a skeleton usually feels faster. Give the wrapper role="status" and aria-live="polite" — the spin itself is decorative and can stay hidden from screen readers. Consider swapping the spin for a static ring icon under prefers-reduced-motion.