Data✨ Premium

Progress Ring

Anneau SVG en dégradé qui se remplit jusqu'à sa valeur quand il apparaît, puis glisse vers chaque nouvelle valeur : un vrai indicateur de progression.

SVGCSS

Mis à jour le

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

3 exemples d'usage

Profil de bénévole complété à 75 % — l'anneau entoure la photo — Progress Ring exemple 1

① Profil de bénévole complété à 75 % — l'anneau entoure la photo

QuandDans son espace membre, la bénévole voit son avatar cerclé d'un anneau aux trois quarts. Elle coche « Vos disponibilités » puis « Permis de conduire » : l'anneau avance à 85 % puis se ferme à 100 %.
PourquoiL'anneau autour de la photo dit « votre profil » sans un mot de plus, et le voir progresser à chaque information ajoutée donne envie de finir — les associations ont besoin de ces renseignements pour proposer des missions.
Réglages--prng-size:112px, --prng-stroke:7, --prng-from:#14b8a6, --prng-to:#22c55e, --prng-track:#e2ece7, fond transparent. Le texte central est masqué par le CSS de la scène pour laisser la place à l'avatar ; la pastille « Profil complété à… » reprend aria-valuetext. Chaque case cochée ajoute ses points à aria-valuenow.
Pastilles d'avancement au bout de chaque leçon — programme d'un cours de solfège — Progress Ring exemple 2

② Pastilles d'avancement au bout de chaque leçon — programme d'un cours de solfège

QuandLa page du cours liste six leçons avec leur durée ; au bout de chaque ligne, un petit anneau de 34 px montre où l'élève en est : pleins pour les leçons terminées, entamés pour celles en cours, vides pour la suite. Ils se remplissent quand la liste arrive à l'écran.
PourquoiDans une liste, un anneau lit plus vite qu'un pourcentage écrit : l'œil repère d'un coup où reprendre. À cette taille, le mouvement d'apparition reste discret.
RéglagesSix racines, une par ligne : --prng-size:34px, --prng-stroke:12 (le trait garde son épaisseur à petite taille), dégradé #f59e0b→#b45309, piste #efe5d6, texte central masqué. aria-label="Avancement de la leçon 3" sur chaque anneau.
Taux de correspondance après un test d'orientation — le grand anneau du résultat — Progress Ring exemple 3

③ Taux de correspondance après un test d'orientation — le grand anneau du résultat

QuandAprès la douzième question, l'élève clique « Voir mon résultat » : un grand anneau se remplit jusqu'à 75 % à côté du métier proposé. « Métier suivant » fait glisser l'anneau vers la valeur du métier d'après.
PourquoiLe résultat est le moment attendu du questionnaire : l'anneau qui se remplit à l'ouverture fait patienter une seconde et donne du relief au chiffre ; il reste ensuite un repère stable quand on compare les métiers.
Réglages--prng-size:168px, --prng-stroke:9, dégradé #818cf8→#f472b6, piste rgba(129,140,248,.18), fond transparent. Le panneau du résultat est caché jusqu'au clic, l'anneau part en apparaissant ; « Métier suivant » écrit 62 puis 54 dans aria-valuenow.

Comment ça marche

La valeur se règle à un seul endroit : aria-valuenow sur .prng-ring (de 0 à 100 par défaut, ou entre aria-valuemin et aria-valuemax). Le script en tire la part à peindre, écrit le texte du centre (« 75 % » en français, « 75% » en anglais, selon l'attribut lang de la page) et le recopie dans aria-valuetext. Le chiffre affiché et l'anneau ne peuvent donc plus se contredire.

L'anneau est un cercle SVG de rayon 50 dont le trait fait 314,16 unités (sa circonférence). Tant qu'il n'est pas visible, il reste vide ; dès qu'il l'est à moitié (IntersectionObserver), le script pose --prng-offset et la transition CSS de 2 s (ease-out) le remplit en partant du haut. Cela n'arrive qu'une fois.

Ensuite, chaque nouvelle valeur écrite dans aria-valuenow (par votre code, après une action de l'utilisateur) est suivie : un MutationObserver met à jour le texte et l'anneau glisse de l'ancienne valeur vers la nouvelle. Chaque anneau reçoit son propre id de dégradé, si bien que plusieurs anneaux dans une page, même un caché, gardent leurs couleurs ; rien n'est ajouté sur window.

Accessibilité

  • Rôle : role="progressbar" avec aria-valuemin, aria-valuemax, aria-valuenow et aria-valuetext tenus à jour. Donnez un nom juste avec aria-label (« Profil complété », « Leçon 3 ») : sans lui, l'annonce se limite à « Progression, 75 % ».
  • Dessin masqué : le SVG porte aria-hidden="true" ; le lecteur d'écran n'annonce que la valeur, pas les cercles.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, la transition est coupée et l'anneau affiche sa valeur dès qu'il apparaît ; les nouvelles valeurs s'appliquent aussi sans glissement.
  • Changement annoncé ? Un rôle progressbar n'est pas une zone live : une nouvelle valeur est lue quand l'utilisateur revient sur l'anneau. Pour l'annoncer tout de suite, ajoutez votre propre message dans une zone aria-live.

Compatibilité navigateur

SVG, variables CSS et JavaScript sans dépendance (environ 2 Ko). Mesuré le 08/11/2026 dans Chromium 151, Firefox 153 et WebKit 26.5 (Playwright) : remplissage à l'apparition, anneau placé plus bas qui attend le défilement, nouvelle valeur sur la 2e copie sans toucher la 1re, 390 px, mouvement réduit, aucune erreur. Versions tirées de @mdn/browser-compat-data : IntersectionObserver fixe le minimum.

Chrome 51+✓ Complet (mesuré)
Firefox 55+✓ Complet (mesuré)
Safari 12.1+✓ Complet (mesuré dans WebKit)
Edge 79+✓ Complet (moteur Chromium)
iOS Safari 12.2+✓ Non vérifié sur appareil réel
Android Chrome 51+✓ Complet (moteur Chromium)

Sans IntersectionObserver, l'anneau prend sa valeur au chargement. Sans JavaScript, l'anneau reste vide mais le texte du HTML (« 75 % ») reste lisible.

Le code

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

index.html — structure
<div class="fx-0224-root">
  <div class="prng-ring" role="progressbar" aria-label="Progression" aria-valuemin="0" aria-valuemax="100" aria-valuenow="75">
    <svg class="prng-svg" viewBox="0 0 120 120" aria-hidden="true">
      <defs><linearGradient id="prng-grad">…</linearGradient></defs>
      <circle class="prng-track"></circle>
      <circle class="prng-fill"></circle>
    </svg>
    <span class="prng-text">75 %</span>
  </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
Valeur (HTML — aria-valuenow sur .prng-ring) 75 Modifiez l'attribut, au départ ou plus tard en JavaScript (anneau.setAttribute('aria-valuenow', 90)) : texte et anneau suivent.
Bornes (HTML — aria-valuemin et aria-valuemax) 0 et 100 Pour 3 leçons sur 8 : aria-valuemin="0" aria-valuemax="8" aria-valuenow="3" ; le centre affiche alors 38 %.
Nom pour les lecteurs d'écran (HTML — aria-label) Progression Décrivez ce qui progresse : « Profil complété », « Objectif de collecte ».
Couleurs (CSS — --prng-from, --prng-to, --prng-track) #6366f1 → #d946ef · indigo à 20 % Les deux teintes du dégradé et la couleur de la partie vide.
Taille et épaisseur (CSS — --prng-size, --prng-stroke) 120px · 8 Le texte central fait 20 % de la taille. L'épaisseur est en unités du dessin (120 de large) : montez-la sous 50 px pour que l'anneau reste visible.
Durée (CSS — --prng-duration) 2s Durée du remplissage et des glissements suivants.
Fond, texte et hauteur (CSS — --prng-bg, --prng-text, --prng-height) #0a0a0f · #fff · 300px Sur une page claire : --prng-bg:transparent; --prng-text:#0f172a; --prng-height:0px.

FAQ

Écrivez la nouvelle valeur dans aria-valuenow à chaque étape (fichier envoyé, leçon terminée, champ rempli). Le script surveille cet attribut : pas de fonction à appeler, pas de variable globale.
Oui : masquez .prng-text par CSS et placez votre élément par-dessus l'anneau (position absolue sur un parent commun), comme l'avatar de l'exemple. La valeur reste annoncée grâce à aria-valuetext.
Il attend d'être visible à moitié avant de se remplir. Placé tout en haut, il se remplit dès l'ouverture ; plus bas, il le fait quand on y arrive en défilant.