Data✨ Premium

Heatmap Cell Animation

Calendrier de chaleur jour par jour : chaque case prend l'une des cinq intensités selon sa valeur et les cases se colorent une à une, en vague.

CSSGridHeatmap

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

Affluence d'une bibliothèque universitaire sur quatre semaines — Heatmap Cell Animation exemple 1

① Affluence d'une bibliothèque universitaire sur quatre semaines

QuandLa page « Venir à la BU » : la grande grille de mars à gauche, à droite un panneau qui affiche le jour survolé et son nombre de visiteurs, un conseil et les horaires. La case survolée grossit ; la scène lit sa valeur dans l'attribut data-value posé par l'effet.
PourquoiLes étudiants cherchent le bon moment pour venir : la grille montre d'un coup d'œil les week-ends calmes et la montée vers les partiels, le survol donne le chiffre exact.
Réglagesdata-unit="visiteurs", 28 valeurs du lundi 2 au dimanche 29, --hmp-color:129,140,248 (indigo clair), --hmp-gap:5px, --hmp-max-width:none, légende « Calme / Bondé ».
Régularité d'arrosage dans la carte d'une appli de potager — Heatmap Cell Animation exemple 2

② Régularité d'arrosage dans la carte d'une appli de potager

QuandUne appli de potager : la carte « Arrosage » montre les litres versés chaque jour sur quatre semaines, à côté de la série en cours et du rappel du soir. Les cases se remplissent en vague quand la carte apparaît.
PourquoiLes trous de la grille (jours à sec) sautent aux yeux ; le jardinier voit ses habitudes sans ouvrir d'historique.
Réglagesdata-unit="L", --hmp-color:34,160,90 (vert), --hmp-stagger:35ms pour une vague plus lente, légende « Sec / Copieux », fond transparent dans une carte blanche.
Journal d'entraînement qui se recolore quand on change de sport — Heatmap Cell Animation exemple 3

③ Journal d'entraînement qui se recolore quand on change de sport

QuandUn journal sportif : trois filtres Course, Vélo, Natation au-dessus de la grille du mois, le total d'heures à côté. Un clic sur un filtre (ou ailleurs dans la scène) remplace data-values et la couleur : la nouvelle répartition se propage case par case.
PourquoiLa vague rend le changement de filtre lisible : on voit les séances apparaître là où elles ont eu lieu plutôt qu'une grille qui saute d'un état à l'autre.
Réglagesdata-unit="min", --hmp-color relié à la couleur du sport choisi (orange, bleu, turquoise), --hmp-gap:5px, légende « Repos / Long ».

Comment ça marche

Vous donnez une valeur par jour dans data-values (nombres séparés par des virgules) ; le script construit un vrai <table> de sept colonnes, une ligne par semaine. Les en-têtes de jours sont pris dans la langue de la page avec Intl.DateTimeFormat (« L M M J V S D » en français, « M T W T F S S » en anglais), à partir du lundi ou du jour choisi par data-week-start.

Chaque case .hmp-cell reçoit un niveau de 0 à 4 dans data-level : 0 pour une valeur nulle, puis 1 à 4 selon le quart de la valeur maximale où elle tombe (maximum des données, ou data-max). Le CSS peint les niveaux avec la même couleur à 5, 20, 40, 65 et 100 % d'opacité, avec un halo pour les deux plus forts ; la légende « Moins / Plus » utilise exactement ces cinq teintes.

À la première apparition puis à chaque changement de data-values (surveillé par un MutationObserver), les cases changent de teinte en 0,8 s avec 25 ms de décalage de l'une à la suivante : la couleur se propage comme une vague, de la première semaine à la dernière. Au survol, une case grossit de 20 %.

La dernière semaine peut être incomplète : les jours manquants restent des cases vides. Chaque racine construit sa propre grille, plusieurs calendriers cohabitent sans se gêner.

Accessibilité

  • Tableau lisible : un lecteur d'écran trouve un tableau nommé par data-label (dans un <caption>), avec le nom complet des jours en en-tête et, dans chaque case, un texte masqué « semaine 2 : 290 visiteurs ».
  • Valeurs exactes, pas seulement des teintes : les niveaux de couleur ne sont qu'un résumé ; la valeur précise (avec data-unit) est dans le texte de chaque case et dans son attribut data-value.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, la vague est coupée, toutes les cases prennent leur teinte d'un coup.
  • Survol sans information cachée : le grossissement au survol est un repère visuel ; il ne révèle rien qui ne soit déjà dans le tableau. Si vous affichez une infobulle, lisez la valeur dans data-value et prévoyez aussi un accès au clavier.

Compatibilité navigateur

Tableau HTML, aspect-ratio, transitions de couleur, Intl.DateTimeFormat, MutationObserver, IntersectionObserver. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : case en cours de changement de teinte à 150 ms, deux calendriers indépendants (le second n'est plus vide), 390 px, fond blanc, aucune erreur JS.

Chrome 88+✓ Complet (mesuré)
Firefox 89+✓ Complet (mesuré)
Safari 15+✓ Moteur WebKit mesuré, non vérifié dans le vrai Safari
Edge 88+✓ Complet (moteur Chromium)
Safari iOS 15+✓ Non vérifié sur appareil réel
Chrome Android 88+✓ Complet (moteur Chromium)

Sans JavaScript, seule la légende s'affiche : la grille est créée par le script. Prévoyez un résumé chiffré à côté si le calendrier doit rester lisible sans script.

Le code

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

index.html — structure
<div class="fx-0250-root" data-values="3,1,0,4,2,0,1,2,4,3,1,0,2,0,4,4,2,3,1,1,0,1,3,4,2,0,3,2" data-label="Activité sur quatre semaines">
  <div class="hmp-wrap">
    <table class="hmp-grid"></table>
    <div class="hmp-scale" aria-hidden="true">
      <span class="hmp-less">Moins</span>
      <span class="hmp-swatch" data-level="0"></span>
      <span class="hmp-swatch" data-level="1"></span>
      <span class="hmp-swatch" data-level="2"></span>
      <span class="hmp-swatch" data-level="3"></span>
      <span class="hmp-swatch" data-level="4"></span>
      <span class="hmp-more">Plus</span>
    </div>
  </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-values (HTML, sur la racine) 28 valeurs de 0 à 4 Une valeur par jour, dans l'ordre, à partir du premier jour de la semaine. Le nombre de semaines suit le nombre de valeurs.
data-max (HTML) la plus grande valeur Valeur qui correspond au niveau le plus fort ; utile pour comparer plusieurs mois sur la même échelle.
data-week-start (HTML) 1 (lundi) Premier jour des lignes : 0 pour dimanche, 1 pour lundi… 6 pour samedi.
data-unit, data-decimals, data-label (HTML) aucune, 0, « Activité sur quatre semaines » Unité et décimales du texte lu dans chaque case, nom du tableau.
--hmp-color (CSS) 99, 102, 241 Couleur des cases et de la légende, en trois nombres R, G, B (les opacités des niveaux s'appliquent dessus).
--hmp-gap, --hmp-radius, --hmp-max-width (CSS) 4px, 4px, 320px Espace entre cases, arrondi, largeur maximale de la grille (les cases restent carrées).
--hmp-stagger, --hmp-speed (CSS) 25ms, .8s Décalage entre deux cases et durée du changement de teinte.
Libellés de la légende (HTML) « Moins », « Plus » Textes de .hmp-less et .hmp-more, à adapter à vos données.
--hmp-bg, --hmp-text, --hmp-min-height (CSS) #0a0a0f, blanc 40 %, 300px Fond, couleur des jours et de la légende, hauteur minimale.

FAQ

Remplacez la série : racine.setAttribute('data-values', valeursDuMois.join(',')). La grille se reconstruit si le nombre de valeurs change, puis la vague recolore les cases. Pour comparer deux mois, fixez data-max à la même valeur pour les deux.
La grille commence toujours par le premier jour de semaine (data-week-start). Deux possibilités : commencer la série au premier lundi du mois, comme dans l'exemple de la bibliothèque, ou mettre des 0 pour les jours d'avant ; ces cases prendront alors la teinte la plus pâle, celle d'une valeur nulle.
Chaque case porte sa valeur dans data-value. Écoutez pointerover sur la racine, retrouvez la case avec e.target.closest('.hmp-cell') et affichez sa valeur où vous voulez ; c'est ce que fait l'exemple de la bibliothèque. Le texte lu par les lecteurs d'écran est déjà dans la case.