Data✨ Premium

Bar Chart Race

Classement en barres horizontales : quand une valeur change, les barres s'allongent et les lignes glissent jusqu'à leur nouveau rang.

CSSTransitionRace

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

Classement d'un concours de pétanque sur l'écran de la buvette — Bar Chart Race exemple 1

① Classement d'un concours de pétanque sur l'écran de la buvette

QuandLe grand écran d'un concours en doublettes de village : titre, numéro de la partie, et le classement des cinq équipes en barres épaisses. Après chaque partie (toutes les 1,3 s dans la scène), deux équipes marquent et les lignes se doublent sous les yeux du public.
PourquoiVu de loin, un dépassement se remarque parce que la ligne bouge ; un tableau de scores figé obligerait à relire tous les chiffres à chaque partie.
Réglagesdata-unit="pts", --rce-bar-height:34px, --rce-gap:10px, --rce-label-width:8.6em, --rce-max-width:none, valeurs en jaune pâle, --rce-speed:.9s, teintes par défaut.
Vote pour le nom de la mascotte d'une école — Bar Chart Race exemple 2

② Vote pour le nom de la mascotte d'une école

QuandSur le site d'une école, une carte demande quel nom donner au hérisson de la cour. Un clic sur « Voter Frisemouche » (ou ailleurs dans la carte, pour la capture) ajoute les quatre voix d'une classe ; la barre s'allonge et le nom remonte s'il dépasse un autre.
PourquoiLes enfants voient tout de suite l'effet de leur vote ; la remontée d'un nom rend le scrutin vivant sans afficher de pourcentages.
RéglagesCouleur posée ligne par ligne avec style="--rce-color:…", --rce-bar-height:20px, --rce-label-width:7.4em, texte brun sur carte crème, valeurs sans unité.
Top 5 des emprunts dans la colonne d'une médiathèque — Bar Chart Race exemple 3

③ Top 5 des emprunts dans la colonne d'une médiathèque

QuandÀ droite d'un article du site d'une médiathèque, un encadré « Les plus empruntés » avec deux onglets. Les barres poussent quand l'encadré apparaît ; la scène bascule ensuite seule entre « Semaine » et « Mois » et les titres se reclassent.
PourquoiDans une colonne de 214 px, des barres fines classées disent l'écart entre les titres mieux qu'une simple liste numérotée, sans voler l'attention de l'article.
RéglagesMême teinte pour toutes les lignes (--rce-color posé par une règle .colonne .rce-item du CSS de la page), --rce-bar-height:14px, --rce-label-width:6.6em, libellés alignés à gauche.

Comment ça marche

Le classement est une vraie liste ordonnée <ol class="rce-list"> : chaque <li class="rce-item" data-value="…"> contient son libellé. Le script ajoute à chaque ligne une piste .rce-track avec sa barre .rce-bar et la valeur chiffrée .rce-val. La plus grande valeur occupe toute la piste, les autres en proportion (ou par rapport à data-max si vous le fixez).

Quand un data-value change, le script relève la position de chaque ligne, les remet dans l'ordre décroissant dans le DOM, puis les fait partir de leur ancienne place avec un translateY qu'il ramène à zéro : c'est la technique FLIP. Les lignes glissent ainsi vers leur nouveau rang pendant que les largeurs de barres changent (transition de 0,8 s, courbe cubic-bezier(.23, 1, .32, 1)). Plusieurs valeurs changées d'un coup ne donnent qu'un seul réordonnancement.

Chaque ligne reçoit au démarrage une teinte parmi cinq dégradés (ambre, bleu, rouge, cyan, violet) selon sa place d'origine, et la garde quand elle monte ou descend. À la première apparition à l'écran, les barres poussent depuis zéro.

Le libellé est tronqué avec des points de suspension s'il dépasse sa colonne (--rce-label-width) ; la valeur est mise en forme dans la langue de la page avec data-unit.

Accessibilité

  • L'ordre lu est l'ordre affiché : les lignes sont réellement déplacées dans le DOM (pas de propriété order), un lecteur d'écran parcourt donc la liste du premier au dernier comme on la voit. Chaque ligne se lit « libellé, valeur ».
  • Nom de la liste : l'aria-label de .rce-list (« Classement ») dit ce qui est classé ; adaptez-le à vos données.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, barres et lignes prennent leur taille et leur place finales sans glisser, au premier affichage comme aux mises à jour.
  • Pas d'annonce automatique : un changement de rang n'est pas lu à voix haute. Si un dépassement compte (nouveau premier), annoncez-le dans une phrase à part.

Compatibilité navigateur

CSS Grid, transitions de width et transform, MutationObserver, IntersectionObserver et Intl.NumberFormat. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : à 150 ms après un changement, les lignes sont entre leur ancienne et leur nouvelle place dans les trois moteurs ; deux classements indépendants dans la même page, 390 px, fond blanc, aucune erreur JS.

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

Sans JavaScript, la liste ordonnée et ses libellés restent lisibles, sans barres ni valeurs : ajoutez la valeur dans le texte du libellé si elle doit rester visible sans script.

Le code

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

index.html — structure
<div class="fx-0245-root">
  <ol class="rce-list" aria-label="Classement">
    <li class="rce-item" data-value="70"><span class="rce-label">Ambre</span></li>
    <li class="rce-item" data-value="60"><span class="rce-label">Cobalt</span></li>
    <li class="rce-item" data-value="45"><span class="rce-label">Corail</span></li>
    <li class="rce-item" data-value="40"><span class="rce-label">Lagon</span></li>
    <li class="rce-item" data-value="35"><span class="rce-label">Lilas</span></li>
  </ol>
</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-value sur chaque .rce-item (HTML) 70, 60, 45, 40, 35 Valeur de la ligne. La changer relance l'allongement des barres et le reclassement.
data-max sur la racine (HTML) la plus grande valeur Valeur qui correspond à une barre pleine ; utile pour une échelle fixe (ex. 100).
data-unit, data-decimals (HTML) aucune, 0 Unité ajoutée après chaque valeur (« 42 pts ») et décimales.
--rce-color (CSS, sur une ligne ou pour tout le classement) 5 dégradés tournants Couleur d'une barre. Posée sur une ligne (style="--rce-color:…"), elle la suit dans tous ses déplacements. Pour tout le classement, utilisez une règle placée après le CSS de l'effet et plus précise que .rce-item seul, par exemple .mon-classement .rce-item : sinon les cinq teintes par défaut l'emportent.
--rce-bar-height, --rce-gap (CSS) 24px, 8px Épaisseur des barres et espace entre les lignes.
--rce-label-width, --rce-max-width (CSS) 4.5em, 420px Largeur de la colonne des libellés et largeur maximale du classement.
--rce-text, --rce-value (CSS) blanc 70 %, blanc 60 % Couleurs des libellés et des valeurs ; à foncer sur fond clair.
--rce-speed (CSS) .8s Durée des glissements de barres et de lignes.
--rce-bg, --rce-min-height (CSS) #0a0a0f, 300px Fond et hauteur minimale de la racine.

FAQ

Changez les attributs les uns après les autres dans le même bloc de code : lignes.forEach((li, i) => li.setAttribute('data-value', scores[i])). Le script attend la fin du bloc avant de reclasser, les lignes ne partent donc qu'une fois, toutes ensemble.
Autant que la liste en contient ; au-delà de cinq, les teintes reprennent au début. Pour un long classement, réduisez --rce-bar-height et --rce-gap, et pensez qu'un mouvement de dix lignes à la fois devient difficile à suivre.
Celle qui était déjà devant : à égalité, le script garde l'ordre actuel, ce qui évite qu'elles échangent leur place sans raison à chaque mise à jour.