Circular text
Also called spinning text, text on a circle, or rotating badge text
Text set around a circle that turns slowly, often as a badge around a logo or a round "scroll down" button.
import { useId } from 'react';
const R = 74;
// A full circle as two arcs, starting at 9 o'clock and running clockwise.
const CIRCLE = `M ${100 - R},100 a ${R},${R} 0 1,1 ${R * 2},0 a ${R},${R} 0 1,1 -${R * 2},0`;
type ScrollBadgeProps = { text?: string; onClick: () => void };
export function ScrollBadge({
text = 'Scroll down • Scroll down • ',
onClick
}: ScrollBadgeProps) {
const id = useId();
return (
<div className='relative grid size-50 place-items-center'>
{/* Only the ring spins; the button in the middle stays upright. */}
<svg
aria-hidden
viewBox='0 0 200 200'
className='absolute inset-0 size-full animate-[spin_14s_linear_infinite] motion-reduce:animate-none'
>
<path id={id} d={CIRCLE} fill='none' />
{/* whitespace-pre keeps the trailing space, which SVG drops by default. */}
<text className='fill-current text-[17px] font-semibold whitespace-pre uppercase'>
{/* textLength spreads the letters over the whole circumference. */}
<textPath href={`#${id}`} textLength={2 * Math.PI * R} lengthAdjust='spacing'>
{text}
</textPath>
</text>
</svg>
<button
type='button'
aria-label='Scroll down'
onClick={onClick}
className='grid size-20 place-items-center rounded-full bg-black text-2xl text-white'
>
↓
</button>
</div>
);
}Wrap the hero's round "scroll down" button in circular text: a 200px SVG ring with "SCROLL DOWN • SCROLL DOWN • " on a textPath that follows a circle of radius 74, with textLength set to the circumference so the phrase meets itself, in 17px semibold uppercase. Spin only the ring, one full turn every 14 seconds on a linear CSS animation, keep the arrow upright, mark the ring aria-hidden, give the button aria-label "Scroll down", and stop the spin when prefers-reduced-motion is set.
Paste into Layerwise or any AI coding tool.
What is Circular text?
Circular text places a short phrase around a circle, usually repeated so it closes on itself, and spins the ring slowly. The cleanest way to build it is an SVG <textPath> that follows a circular <path>, with textLength set to the circumference so the letters spread evenly. Another way rotates each letter by 360° / count around a shared center.
It shows up as a "scroll down" or "play reel" button in hero sections, as a seal around a logo, and on sticker-style badges such as "New · Limited · New". A full turn every 10 to 20 seconds feels calm and ambient.
Spin the ring with a CSS rotate animation, which runs on the compositor, and keep the center icon upright. The repeated text is decoration, so mark the SVG aria-hidden and give the button its own label. Keep the phrase short, since letters crowd on a small circle, and stop the spin when someone prefers reduced motion.
Often confused with
- Rotate
- Rotate is the basic transform that turns any element. Circular text uses it to spin a ring of letters set on a circular path.
Related terms
All termsRotate
A CSS transform that turns an element around its transform origin by an angle, such as `rotate(45deg)`.
Looping animation
An animation that plays more than once, either a set number of times or forever, set in CSS with animation-iteration-count.
Hero section
The large first section at the top of a landing page, with a headline, a short subhead, a call to action, and a visual.
Transform origin
The point an element rotates and scales around. It defaults to the center, and moving it changes where a transform seems to start.
Build it with Layerwise
Describe your app, watch it run in a live preview, and publish it with a database, storage, and sign-in built in.