SVG✨ Premium

Pulse / Heartbeat

Un cœur SVG qui bat en double battement, entouré de deux anneaux qui s'élargissent et s'effacent — en CSS pur, avec un réglage pour l'arrêter et le relancer.

CSSPulse

Mis à jour le

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

3 exemples d'usage

Bouton « Soutenir » qui se met à battre — cagnotte d'un club de foot — Pulse / Heartbeat exemple 1

① Bouton « Soutenir » qui se met à battre — cagnotte d'un club de foot

QuandLa page de collecte d'un club amateur pour acheter un minibus : jauge, nombre de soutiens, derniers donateurs. Le cœur blanc du bouton est immobile ; au clic, il se met à battre, le bouton devient « Merci pour votre soutien ! » et le compteur prend un soutien de plus.
PourquoiLe battement répond au geste : l'utilisateur voit tout de suite que son soutien est pris en compte, sans fenêtre de confirmation.
Réglages--hrtb-size:30px, --hrtb-color:#ffffff sur le bouton rouge, fond transparent ; data-hrtb-idle présent au départ, retiré par le clic (vrai <button aria-pressed>).
Pastille « Coup de cœur » sur une couverture — librairie en ligne — Pulse / Heartbeat exemple 2

② Pastille « Coup de cœur » sur une couverture — librairie en ligne

QuandLa fiche d'un roman dans une librairie indépendante : la pastille blanche posée sur le coin de la couverture contient un petit cœur qui bat en continu, à côté du mot du libraire, du prix et du bouton panier.
PourquoiUn battement discret attire l'œil vers la recommandation humaine sans clignoter ; c'est la seule chose qui bouge sur la page.
Réglages--hrtb-size:22px, --hrtb-color:#e11d48, fond transparent, rythme par défaut (1,2 s) ; la pastille est un simple bloc de la scène.
Grand cœur battant — appel d'une association de don du sang — Pulse / Heartbeat exemple 3

③ Grand cœur battant — appel d'une association de don du sang

QuandLe haut de page d'une association locale : un cœur de 200 px bat à gauche, ses anneaux s'élargissent sur le fond rosé ; à droite, la date de la prochaine collecte et le bouton « Prendre rendez-vous ».
PourquoiÀ grande taille, le battement devient le sujet : il dit « vie » avant qu'on lise le texte. Le texte est à côté, jamais sur les anneaux.
Réglages--hrtb-size:200px, --hrtb-color:#dc2626, fond transparent, vitesse par défaut.

Comment ça marche

Le dessin tient dans un SVG de 80 × 80 unités : un <path class="hrtb-heart"> rouge #ef4444 et deux cercles .hrtb-ring de rayon 20, sans remplissage, au trait de 2 unités, centrés au même point.

Le cœur suit @keyframes hrtbBeat : il grossit à 115 % au premier temps (15 % du cycle), revient, puis à 110 % au second temps (45 %), comme un « poum-poum », et reste au repos jusqu'à la fin du cycle de 1,2 s. Chaque anneau suit hrtbRing : il part de 80 % de sa taille à 80 % d'opacité et s'agrandit jusqu'à 180 % en disparaissant ; le second anneau part un quart de cycle après le premier. Les deux animations sont dérivées d'une seule variable, --hrtb-speed : changer le rythme garde cœur et anneaux synchrones.

Ajoutez l'attribut data-hrtb-idle sur .fx-0606-root pour arrêter le battement (cœur immobile, anneaux cachés) ; retirez-le pour le relancer, par exemple après un clic. Aucun JavaScript n'est livré : les noms d'animation et de classes sont préfixés hrtb, ils ne se mélangent pas avec un autre cœur battant de la page.

Accessibilité

  • Décoratif : le SVG porte aria-hidden="true" et focusable="false". Le sens (un soutien enregistré, un coup de cœur) doit être dans un texte visible, comme le libellé du bouton dans le premier exemple.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, le cœur ne bat plus et un seul anneau reste affiché, fixe et pâle (35 % d'opacité, 130 % de la taille) : le dessin garde son halo sans rien qui pulse.
  • Rythme sans danger : un battement par 1,2 s (50 par minute), loin des fréquences de clignotement à risque ; aucun changement brutal de luminosité.
  • Interaction à votre charge : l'effet ne capte ni clic ni clavier. Pour un « J'aime », placez-le dans un vrai <button aria-pressed> et basculez data-hrtb-idle au clic.

Compatibilité navigateur

Animations CSS (transform: scale sur des éléments SVG), variables CSS dans animation et calc() sur une durée, prefers-reduced-motion. Mesuré dans Chromium, Firefox et WebKit (Playwright) : 0 erreur, trois animations nommées hrtbBeat / hrtbRing, aucune animation avec data-hrtb-idle, rendu figé en mouvement réduit, deux copies indépendantes.

Chrome 74+✓ Complet (mesuré)
Firefox 63+✓ Complet (mesuré)
Safari 10.1+✓ Complet (mesuré dans WebKit)
Edge 79+✓ Complet (moteur Chromium)
Safari iOS 10.3+✓ Moteur WebKit, non vérifié sur appareil réel
Chrome Android 74+✓ Complet (moteur Chromium)

Sans animations CSS, le cœur rouge reste affiché, immobile, et les anneaux restent invisibles.

Le code

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

index.html — structure
<div class="fx-0606-root">
  <div class="hrtb-stage">
    <svg class="hrtb-svg" viewBox="0 0 80 80" aria-hidden="true" focusable="false">
      <circle class="hrtb-ring" cx="40" cy="40" r="20"/>
      <circle class="hrtb-ring" cx="40" cy="40" r="20"/>
      <path class="hrtb-heart" d="…"/>
    </svg>
  </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
Taille (CSS — --hrtb-size) 80px Côté du dessin ; 100% suit la largeur du parent. Les anneaux dépassent légèrement le cœur à leur plus grand : laissez un peu d'air autour.
Couleur (CSS — --hrtb-color) #ef4444 Cœur et anneaux ensemble (blanc sur un bouton coloré, par exemple).
Rythme (CSS — --hrtb-speed) 1.2s Durée d'un battement complet ; 60 / durée = battements par minute (0.8s ≈ 75 par minute). Le décalage du second anneau suit automatiquement.
Arrêt / relance (HTML — attribut data-hrtb-idle sur .fx-0606-root) absent (le cœur bat) Présent : cœur immobile, anneaux cachés. Basculez-le en JavaScript pour faire battre le cœur seulement après une action.
Fond et hauteur du bloc (CSS — --hrtb-page, --hrtb-root-h) #0a0a0f / 300px transparent et 0px pour glisser le cœur dans un bouton, une pastille ou un titre.

FAQ

Mettez data-hrtb-idle sur la racine dans le HTML, puis retirez-le au clic : root.removeAttribute('data-hrtb-idle'). Pour l'arrêter à nouveau, root.setAttribute('data-hrtb-idle', ''). Le CSS s'occupe du reste, aucun script n'est livré.
Oui : un cycle = un battement. Pour 90 battements par minute, --hrtb-speed: calc(60s / 90) (environ 0,67 s). Vous pouvez la changer en direct depuis vos données avec root.style.setProperty('--hrtb-speed', …).
Non. Les animations s'appellent hrtbBeat et hrtbRing, et toutes les classes sont préfixées hrtb : rien ne porte un nom générique comme heartbeat ou .heart qui pourrait entrer en conflit avec un autre effet.