Dashed circular progress bar in CSS — Orbit example
A dashed circular progress bar is what you reach for when “progress” is really a count of completed steps, not a continuous percentage. Each dash represents one unit, and the visual gap between them tells the user “this is discrete” — the same way a stepper input feels different from a slider. Onboarding flows, quiz progress, multi-day streaks all benefit from this treatment.
This example builds the bar from ten <o-arc> segments, three at full opacity, three lighter, and three lighter still — giving the impression of a fade-out toward the unfilled end. The gap between dashes comes for free from the gap-10 class.
How it works
gap-10on every arc is what creates the visible separation between segments. Without it, the ten arcs would touch and look like a single ring with color stops.- Three opacity tiers (
<o-arc>plain,.light,.lighter) simulate a fade-out using three CSS variables —--o-blue,--o-blue-light, and--o-blue-lighter— that ship with Orbit’s color palette. To represent a different completion percentage, change how many arcs of each tier you use. - The center label is a
satelliteatorbit-0(center) wrapped in acapsuleso the text sits flat regardless of the surrounding rotation. Theborder-color: transparentkeeps the satellite invisible while letting the number show. - No JavaScript is needed for static states. To make the bar respond to a value, swap arc classes via JS: each arc represents 10%, so
value=70means the first 7 arcs are--o-blueand the rest are--o-blue-lighter.
Customization
Make it represent steps instead of percent:
<o-arc class="gap-10"></o-arc> <!-- step 1 done --><o-arc class="gap-10"></o-arc> <!-- step 2 done --><o-arc class="gap-10 lighter"></o-arc> <!-- step 3 pending --><!-- ... -->Use a different color theme by replacing --o-blue with any other Orbit palette variable (--o-green, --o-purple, --o-orange).
Add an outer label ring by stacking another orbit with text satellites:
<div class="orbit-5"> <div class="satellite">Day 1</div> <div class="satellite">Day 2</div> ...</div>Related
- Solid progress with background
- Progress with handle
<o-arc>element reference- Use case: fitness and health apps
Use this in your project
Install Orbit CSS and copy the markup above.