Navigation✨ Premium

Chart Data Labels

Graphique à barres CSS-only : les labels de données surgissent au survol, ancrés au sommet de chaque barre et connectés par une flèche CSS. Zéro JavaScript.

CSSHoverDataViz

Vous aurez accès à la démo interactive avec un compte gratuit.

Cet effet fait partie d'Effect.Labs — 811 effets vanilla, une partie gratuite, une partie premium. Navigation comprend 36 effets, dont 4 gratuits. Découvrir la catégorie →

3 exemples d'usage

Dashboard SaaS — Taux de complétion hebdomadaire — Chart Data Labels exemple 1

① Dashboard SaaS — Taux de complétion hebdomadaire

QuandUn tableau de bord interne affiche les KPI quotidiens : taux de complétion des tâches, sessions actives ou conversions par jour de la semaine.
PourquoiLes barres livrent la tendance en un coup d'œil ; les labels apparaissent au survol pour donner la valeur exacte sans surcharger le tableau de bord. L'interaction reste discrète dans un contexte dense.
RéglagesHauteur max 140 px (valeur 100 %), gradient indigo par défaut, gap: 14px entre groupes, label en font-size: .72rem pour s'adapter aux écrans denses.
Résultats sportifs — Performances par joueur sur la saison — Chart Data Labels exemple 2

② Résultats sportifs — Performances par joueur sur la saison

QuandUn classement de buteurs dans une application sportive ou un widget live-score : 5 attaquants affichent des totaux très proches (13–15 buts), les hauteurs de barres se rapprochent presque jusqu'à l'égalité.
PourquoiQuand plusieurs joueurs ont des scores quasi-identiques, les barres adjacentes sont presque de même hauteur et leurs labels surgissent au même niveau au survol. C'est précisément cette situation que l'effet gère avec élégance : chaque label flotte indépendamment au sommet de sa barre, rendant la comparaison fine lisible sans encombrer la vue.
RéglagesHauteurs très rapprochées 91–105 px (13–15 buts, max 20) ; palette émeraude (linear-gradient(#4ade80, #16a34a)) ; labels affichant « 14 B » en font-size: .72rem ; gap: 14px entre groupes.
Infographique article — Taux d'engagement par canal — Chart Data Labels exemple 3

③ Infographique article — Taux d'engagement par canal

QuandUn graphique interactif embarqué dans un billet de blog, une page de rapport ou une landing page avec des statistiques produit — le lecteur survole pour obtenir les chiffres précis.
PourquoiLa mise en page éditoriale bénéficie d'un graphique propre sans chiffres à l'état repos : les valeurs restent disponibles à la demande, et l'œil lit d'abord la hiérarchie des barres.
RéglagesPalette chaude (#fb923c → #f97316 sur toutes les barres avec des nuances distinctes), hauteur max 160 px pour la hiérarchie visuelle, border-radius: 4px 4px 2px 2px pour un rendu plus sobre.

Comment ça marche

L'effet est entièrement en CSS — aucun JavaScript. Chaque .chart-bar-group est un flex-direction: column qui empile la barre au-dessus de son label d'axe. Le .chart-data-label est positionné en position: absolute avec bottom: calc(100% + 8px) : il flotte 8 px au-dessus du sommet de la barre, quelle que soit la hauteur de celle-ci, et se centre via translateX(-50%).

L'apparition du label repose sur le sélecteur descendant .chart-bar:hover .chart-data-label. À l'état repos, le label est invisible (opacity: 0) et légèrement décalé vers le bas (translateY(4px)). Au survol, opacity passe à 1 et translateY à 0 en 200 ms — un léger effet « float-up » qui ancre visuellement la valeur à la barre. La barre elle-même reçoit simultanément filter: brightness(1.2) et transform: scaleY(1.04) avec transform-origin: center bottom, ce qui la fait « gonfler » vers le haut sans déplacer sa base.

La flèche indicatrice du label est un pseudo-élément ::after utilisant l'astuce CSS des bordures : largeur 0, border-top-color coloré, les trois autres côtés transparents — ce qui dessine un triangle pointant vers le bas, visuellement relié au sommet de la barre. pointer-events: none sur le label empêche celui-ci de capter les événements souris sur l'espace entre la barre et le label, évitant tout scintillement au passage du curseur.

La « séparation automatique » des labels vient du fait que chaque label suit la hauteur de sa propre barre : deux barres de hauteurs différentes produisent mécaniquement des labels à des niveaux différents. Il n'y a pas d'algorithme de détection de collision — deux barres de hauteurs très proches produiraient des labels côte à côte sans correction.

Accessibilité

  • prefers-reduced-motion : absent du code — la transition: opacity .2s, transform .2s s'exécute sans condition. À ajouter manuellement : @media (prefers-reduced-motion: reduce) { .chart-data-label { transition: none } }.
  • Navigation clavier : l'effet repose exclusivement sur :hover. Aucun tabindex ni :focus-within n'est défini sur .chart-bar — un utilisateur clavier ne peut pas afficher les labels.
  • Contraste du texte : #fff sur rgba(15, 15, 30, .92) ≈ 16:1 — WCAG AAA. Les valeurs texte passent largement AA et AAA.
  • Lisibilité par les lecteurs d'écran : les valeurs (72%, 53%…) sont dans le DOM et lisibles par les assistants vocaux, même si elles ne sont pas visibles visuellement à l'état repos.
  • Aucun role ni aria-label sur le conteneur .chart-scene — à ajouter (role="img" aria-label="…") pour contextualiser le graphique dans un document accessible.

Compatibilité navigateur

CSS3 pur : flexbox, position absolue, transitions, gradients, pseudo-éléments — supportés dans tous les navigateurs modernes depuis 2016.

Chrome 49+✓ Complet
Firefox 45+✓ Complet
Safari 10+✓ Complet
Edge 16+✓ Complet
Mobile iOS✓ Tap active le label
Android Chrome✓ Tap active le label

Sans transitions CSS, les labels passent directement de caché à visible au survol sans animation — l'information reste accessible. Sur tactile, un tap active l'état <code>:hover</code> et affiche le label ; un tap ailleurs le masque.

Le code

Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :

index.html — structure
<div class="anchor-demo">
  <div class="chart-scene">
    <div class="chart-bar-group">
      <div class="chart-bar chart-bar-1">
        <span class="chart-data-label">72%</span>
      </div>
      <span class="chart-bar-label">Lun</span>
    </div>
    <div class="chart-bar-group">
      <div class="chart-bar chart-bar-2">
        <span class="chart-data-label">53%</span>
      </div>
      <span class="chart-bar-label">Mar</span>
    </div>
    <div class="chart-bar-group">
      <div class="chart-bar chart-bar-3">
        <span class="chart-data-label">91%</span>
      </div>
      <span class="chart-bar-label">Mer</span>
    </div>
    <div class="chart-bar-group">
      <div class="chart-bar chart-bar-4">
        <span class="chart-data-label">38%</span>
      </div>
      <span class="chart-bar-label">Jeu</span>
    </div>
    <div class="chart-bar-group">
      <div class="chart-bar chart-bar-5">
        <span class="chart-data-label">65%</span>
      </div>
      <span class="chart-bar-label">Ven</span>
    </div>
  </div>
</div>
🔒 Débloquer le code complet — à partir de 2,99 € le 1er mois

HTML + CSS + JS complet, prêt à coller — avec des centaines d'effets premium.

Personnaliser

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

Option / propriétéDéfautEffet
.chart-bar-N { height } 110px / 80px / 140px / 60px / 100px Hauteur de chaque barre — proportionnelle à la valeur de la donnée. Ajustez pour refléter vos vraies métriques.
.chart-bar-N { background } gradient indigo/rose/vert/ambre/orange Couleur brand par barre — remplacez le linear-gradient() de chaque .chart-bar-N par votre palette.
bottom: calc(100% + 8px) 8px Espace entre le label et le sommet de la barre. Augmentez à 12px si vous avez des décorations au-dessus des barres.
transition: opacity .2s, transform .2s 0,2s Durée de l'animation d'entrée/sortie. Réduisez à .12s pour un retour plus vif, augmentez à .35s pour plus de douceur.
translateY(4px) → translateY(0) 4px Amplitude de l'effet float-up au survol. Mettez 6px pour plus de théâtralité, 2px pour un déplacement quasi imperceptible.
background: rgba(15, 15, 30, .92) .92 Fond du tooltip — ajustez l'opacité (ex. .75) pour un label semi-transparent, ou changez la couleur pour votre thème clair.

FAQ

Oui, l'effet est 100 % CSS — aucune ligne de JavaScript. Le hover, l'animation, la flèche et le tooltip sont gérés uniquement par des sélecteurs CSS et des transitions. Copiez le HTML et le CSS dans n'importe quel projet : Angular, React, Vue, Svelte ou HTML brut — aucune initialisation requise.
Sur iOS et Android, un tap sur une barre active l'état :hover CSS et révèle le label ; un tap ailleurs le masque. Le comportement est fonctionnel mais non optimisé pour le tactile : aucun indicateur visuel ne suggère l'interactivité. Pour mobile, envisagez d'afficher les labels en permanence (opacity: 1) ou de les remplacer par des étiquettes statiques.
Le code n'inclut pas de media query prefers-reduced-motion. Ajoutez cette règle après le CSS de l'effet : @media (prefers-reduced-motion: reduce) { .chart-data-label { transition: none; } .chart-bar { transition: none; } }. Le label reste visible au survol (opacity: 1), l'animation disparaît simplement.