SVG✨ Premium

Spirograph

Rosace de seize anneaux décentrés : la moitié tourne dans un sens, l'autre moitié dans l'autre, et les deux rosaces se croisent comme au spirographe.

CSSJSRotation

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. SVG comprend 30 effets, dont 3 gratuits. Découvrir la catégorie →

3 exemples d'usage

Appli de recettes — cadran du minuteur de cuisson qui tourne pendant le décompte — Spirograph exemple 1

① Appli de recettes — cadran du minuteur de cuisson qui tourne pendant le décompte

QuandÀ l'étape « Laisser mijoter », on lance le minuteur : la rosace cuivrée se met à tourner autour du temps restant, le bouton devient « Pause » et l'arrête net.
PourquoiLe cadran montre d'un coup d'œil, de loin, que le minuteur tourne ; en pause, la rosace se fige sans disparaître.
Réglagesdata-rings="12" data-hue="18" data-hue-step="4", --spg-base: 120px, --spg-offset: 40px, --spg-speed: 8s, --spg-line: 1.5px, --spg-play à paused puis running au clic. Le décompte est géré par la scène.
Blog d'un horloger — illustration d'en-tête d'un article sur le guillochage — Spirograph exemple 2

② Blog d'un horloger — illustration d'en-tête d'un article sur le guillochage

QuandL'article s'ouvre sur une large bande sombre où une rosace dorée de 24 anneaux tourne très lentement, coupée en haut et en bas comme une photo de cadran.
PourquoiLe guillochage grave justement des cercles décalés autour d'un centre : la rosace illustre le sujet de l'article au lieu d'une photo d'archive.
Réglagesdata-rings="24" data-hue="34" data-hue-step="1", --spg-base: 200px, --spg-offset: 62px, --spg-speed: 30s, --spg-height: 176px, --spg-bg: #16212b.
Plateforme de cours — anneaux autour de la photo de profil pendant son envoi — Spirograph exemple 3

③ Plateforme de cours — anneaux autour de la photo de profil pendant son envoi

QuandSur la page Profil, on choisit une nouvelle photo : dix anneaux violets apparaissent et tournent autour de l'avatar jusqu'à ce que la barre atteigne 100 %, puis s'effacent.
PourquoiLe retour se voit à l'endroit exact où l'image va changer, et le petit écart des anneaux (10 px) forme un halo serré qui ne déborde pas sur le formulaire.
Réglagesdata-rings="10" data-hue="235" data-hue-step="8", racine de 150 px (--spg-height: 150px), --spg-base: 96px, --spg-offset: 10px, --spg-speed: 3s, --spg-bg: transparent. L'apparition et la barre de progression sont gérées par la scène.

Comment ça marche

Le script crée data-rings anneaux (16 par défaut) dans le point central .spg-stage. Chaque anneau est un cercle de 120 px (--spg-base) dont le centre est écarté de 50 px (--spg-offset) du centre de la zone, et orienté selon un angle de départ réparti : 0°, 22,5°, 45°… Superposés, ces cercles décentrés dessinent une rosace, la figure que trace un spirographe.

La rotation passe par une seule animation, spgSpin : translate(-50%, -50%) rotate(angle) translateX(écart), l'angle allant du départ à départ + 360°. Comme le cercle est décentré, le faire tourner le fait réellement circuler autour du milieu. Les anneaux pairs tournent dans le sens des aiguilles d'une montre, les impairs en sens inverse (.spg-ring--reverse), tous en 12 s par tour. Il y a donc deux rosaces de huit anneaux qui se croisent : elles se superposent en une rosace à seize pétales, se séparent, tissent des losanges, puis se rejoignent.

Les couleurs vont du bleu au rose : teinte 220° plus 10° par anneau (data-hue, data-hue-step), opacité qui baisse doucement de 0,85 à un peu moins de 0,5. La variable --spg-play passe toute la rosace en pause (paused) ou en marche (running) sans la redessiner. --spg-grow et --spg-drift, à 0 par défaut, rendent les anneaux de tailles et de vitesses différentes.

Accessibilité

  • Décor : le conteneur des anneaux porte aria-hidden="true". Dans un minuteur ou un envoi de fichier, le temps restant et l'état doivent être écrits en texte (role="timer", aria-live).
  • Mouvement réduit : sous prefers-reduced-motion: reduce, l'animation est retirée et chaque anneau reste à son angle de départ : la rosace complète est affichée, immobile.
  • Aucune interaction : rien ne prend le focus, rien ne réagit au pointeur. Le réglage --spg-play permet à votre propre bouton de suspendre la rotation.
  • Mouvement continu : deux groupes qui tournent en sens contraires créent une impression de tourbillon. Sur une page de lecture, préférez une vitesse lente (--spg-speed de 20 à 30 s) ou une zone qui ne reste pas sous les yeux en permanence.

Compatibilité navigateur

CSS et une dizaine de lignes de JavaScript pour créer les anneaux. Les variables CSS utilisées dans @keyframes et NodeList.forEach fixent les versions minimales relevées dans les données MDN. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : 16 anneaux par copie, rotation visible dans les trois moteurs, deux copies indépendantes, rosace immobile en mouvement réduit.

Chrome 51+✓ Complet (mesuré)
Firefox 50+✓ Complet (mesuré)
Safari 10+✓ Complet (mesuré sur WebKit)
Edge 79+✓ Complet (moteur de Chrome)
Safari iOS 10+✓ Non vérifié sur appareil
Chrome Android 51+✓ Complet (mesuré à 390 px, tactile)

Sans JavaScript, la zone reste vide. Les navigateurs sans variables CSS n'affichent pas la rosace.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0615-root" data-rings="16">
  <div class="spg-stage" aria-hidden="true"></div>
</div>

Paiement unique, sans abonnement — le code est à toi pour toujours

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
data-rings (racine) 16 Nombre d'anneaux (1 à 40), répartis à intervalles égaux. Un nombre pair donne deux rosaces égales qui tournent en sens contraires.
data-hue / data-hue-step (racine) 220 / 10 Teinte du premier anneau et pas de teinte entre deux anneaux (−60 à 60). Un pas de 1 ou 2 donne une rosace presque d'une seule couleur.
--spg-base 120px Diamètre des anneaux.
--spg-offset 50px Distance entre le centre d'un anneau et le centre de la zone. 0 superpose tous les anneaux en un seul cercle qui paraît immobile ; plus grand, la rosace s'ouvre.
--spg-speed 12s Durée d'un tour complet.
--spg-play running paused fige la rosace là où elle est ; repasser à running la relance.
--spg-grow / --spg-drift 0px / 0 Agrandissement par anneau et écart de vitesse par anneau (0,1 = chaque anneau 10 % plus lent que le précédent). Ils cassent la symétrie de la rosace.
--spg-line / --spg-height / --spg-bg 1px / 300px / #0a0a0f Épaisseur du trait, hauteur de la zone et fond. La rosace reste centrée ; si elle est plus grande que la zone, elle est coupée.

FAQ

Recursive Circles emboîte des cercles les uns dans les autres et les fait respirer sur place. Ici, des anneaux de même taille sont décalés du centre et tournent autour de lui en deux groupes de sens contraires : c'est la rotation qui crée le motif.
Le jouet trace une seule courbe continue (une hypotrochoïde). L'effet en reproduit l'aspect avec des cercles décalés autour d'un centre, ce qui donne la même rosace en restant léger : pas de canvas, pas de calcul de courbe.
Changez la variable sur la racine : root.style.setProperty('--spg-play', 'paused'), puis 'running' pour repartir. La rosace reprend exactement là où elle s'était arrêtée.