Data✨ Premium

Comparison Bars

Barres horizontales fines, libellé à gauche et valeur à droite, qui s'allongent l'une après l'autre quand la liste entre à l'écran.

CSSProgress

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

Autonomie de trois vélos électriques dans le comparateur d'un vélociste — Comparison Bars exemple 1

① Autonomie de trois vélos électriques dans le comparateur d'un vélociste

QuandLa page « Comparer » d'une boutique de cycles : trois cartes de vélos (prix, type de cadre) puis, en descendant, le bloc « Autonomie annoncée » où les trois barres s'allongent en kilomètres. Dans la capture, la page défile seule jusqu'au bloc.
PourquoiL'autonomie est souvent le critère qui tranche entre deux modèles ; des barres sur la même échelle font voir l'écart (85 contre 140 km) mieux que trois chiffres côte à côte.
Réglagesdata-unit="km", data-max="150", valeurs 120, 85 et 140, --cmpb-thickness: 12px, --cmpb-max-width: none, un même dégradé vert anis pour les trois lignes, textes foncés.
Répartition des missions par domaine dans les cartes d'un annuaire de traducteurs — Comparison Bars exemple 2

② Répartition des missions par domaine dans les cartes d'un annuaire de traducteurs

QuandUn annuaire de traducteurs indépendants : deux cartes de profil côte à côte (initiales, spécialité, langues, tarif) avec, au milieu de chacune, trois barres de 6 px qui montrent la part de missions par domaine. Les deux listes jouent ensemble dès que les cartes s'affichent.
PourquoiLe client cherche d'abord quelqu'un d'habitué à son type de texte. Deux cartes comparables, avec le même petit graphique au même endroit, se parcourent vite.
RéglagesDeux racines indépendantes, data-unit="%", --cmpb-thickness: 6px, --cmpb-min-height: 0, dégradés violets, libellés traduits par data-en dans la page de démonstration.
Score par thème affiché après « Voir mon résultat » à la fin d'un quiz de musée — Comparison Bars exemple 3

③ Score par thème affiché après « Voir mon résultat » à la fin d'un quiz de musée

QuandLe quiz d'un parcours famille dans un musée : après la dixième question, un bouton « Voir mon résultat » remplace le message de fin par une carte « Votre score 7/10 » et trois barres, peinture, sculpture et archéologie, qui s'allongent selon le taux de bonnes réponses.
PourquoiLe score global dit si l'on a réussi, les barres disent où retourner. Elles s'allongent pendant que l'œil descend dans la carte, comme un résultat qu'on découvre.
Réglagesdata-unit="%", valeurs 100, 50 et 67, libellés « Peinture (3 sur 3) »…, --cmpb-thickness: 8px, dégradés or, corail et vert d'eau sur fond brun ; la carte est un hidden retiré au clic.

Comment ça marche

Chaque ligne est un li.cmpb-item de la liste ul.cmpb-list : sa valeur dans data-value, son libellé dans span.cmpb-label. Le script ajoute à droite du libellé le texte .cmpb-value et, en dessous, une piste .cmpb-track (décorative) avec son remplissage .cmpb-fill. La valeur affichée et la longueur viennent du même attribut : impossible d'écrire « 85 % » au-dessus d'une barre remplie à 62 %.

La longueur vaut valeur ÷ data-max (100 par défaut), plafonnée à la piste entière. Le texte est écrit avec Intl.NumberFormat dans la langue de la page : avec data-unit="%", « 85 % » en français et « 85% » en anglais ; avec une autre unité, par exemple km, « 120 km ». Les libellés trop longs sont coupés par des points de suspension plutôt que de pousser la valeur hors de la ligne.

L'animation attend le visiteur : un IntersectionObserver ajoute la classe cmpb-on quand 35 % de la liste est visible. Chaque remplissage passe alors de scaleX(0) à scaleX(1) depuis la gauche, en 1,5 s (ease-out), à 0,1 s puis 0,2 s d'intervalle d'une ligne à l'autre. Trois dégradés (indigo-violet, magenta-rose, rouge-rose clair) se répètent toutes les trois lignes.

Accessibilité

  • Texte réel : chaque ligne se lit « Atelier A 85 % » dans une liste nommée par son aria-label. La piste et son remplissage sont masqués aux lecteurs d'écran.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, les barres sont affichées pleines dès le départ.
  • Rien d'interactif : aucune ligne ne prend le focus et rien ne change au survol ou au toucher.
  • Contraste : sur fond clair, foncez --cmpb-label et --cmpb-value ; la valeur par défaut des chiffres (blanc à 50 %) est pensée pour le fond sombre d'origine.

Compatibilité navigateur

HTML et CSS (grille, variables, transform: scaleX) avec un court script (IntersectionObserver, Intl.NumberFormat). Mesuré le 08/11/2026 dans Chromium 151, Firefox 153 et WebKit 26.5 (Playwright) : deux copies indépendantes, la seconde attend d'être vue, mouvement réduit, 390 px de large, aucune erreur.

Chrome 74+✓ Complet (mesuré dans Chromium 151)
Firefox 63+✓ Complet (mesuré dans Firefox 153)
Safari 12.1+✓ Mesuré dans WebKit 26.5, pas en vrai Safari
Edge 79+✓ Complet (moteur Chromium)
Safari iOS 12.2+✓ Non vérifié sur appareil
Chrome Android 74+✓ Complet (moteur Chromium)

Sans IntersectionObserver, les barres s'allongent dès le chargement. Sans JavaScript, seuls les libellés apparaissent : ni valeur ni barre.

Le code

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

index.html — structure
<div class="fx-0230-root" data-unit="%">
  <ul class="cmpb-list" aria-label="Taux de remplissage des ateliers">
    <li class="cmpb-item" data-value="85"><span class="cmpb-label">Atelier A</span></li>
    <li class="cmpb-item" data-value="62"><span class="cmpb-label">Atelier B</span></li>
    <li class="cmpb-item" data-value="78"><span class="cmpb-label">Atelier C</span></li>
  </ul>
</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
Valeurs (HTML — data-value sur chaque li.cmpb-item) 85, 62, 78 Une valeur positive par ligne ; le texte affiché est calculé à partir d'elle.
Maximum (HTML — data-max sur la racine) 100 Valeur qui remplit la piste entière (ex. data-max="150" pour des kilomètres).
Unité (HTML — data-unit sur la racine) % % pour un pourcentage au format de la page, sinon n'importe quel mot court (km, h, pts) ajouté après le nombre ; vide pour un nombre seul.
Couleurs (CSS — --cmpb-c1, --cmpb-c2, --cmpb-c3) Dégradés indigo → violet, magenta → rose, rouge → rose clair Fond de chaque remplissage, répété toutes les trois lignes.
Piste (CSS — --cmpb-track, --cmpb-thickness) rgba(99, 102, 241, .2), 8 px Couleur du fond de piste et épaisseur des barres.
Textes (CSS — --cmpb-label, --cmpb-value) Blanc à 80 %, blanc à 50 % Couleur des libellés et des valeurs.
Taille et fond (CSS — --cmpb-max-width, --cmpb-min-height, --cmpb-bg) 420 px, 300 px, #0a0a0f Largeur maximale de la liste (none pour remplir), hauteur minimale de la racine, fond.

FAQ

Oui, si vous changez data-max : avec data-max="150", 140 remplit 93 % de la piste. Une valeur supérieure au maximum remplit la piste entière, sans déborder, et son texte reste exact.
Les trois variables --cmpb-c1 à --cmpb-c3 couvrent trois lignes puis se répètent. Pour plus de couleurs, ajoutez une règle .cmpb-item:nth-child(4) .cmpb-fill { background: … } dans votre CSS.
Non : l'IntersectionObserver est déconnecté après la première apparition. Le graphique reste ensuite affiché à son état final.