Texte✨ Premium

Breathing Text

Animation CSS pure — chaque mot pulse entre scale(1) et scale(1.08) sur 3 secondes, décalé par une variable --delay individuelle pour créer une respiration vivante sans JavaScript.

CSSAnimationScale

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. Texte comprend 56 effets, dont 4 gratuits. Découvrir la catégorie →

3 exemples d'usage

Hero de lancement — Tagline vivante en trois mots — Breathing Text exemple 1

① Hero de lancement — Tagline vivante en trois mots

QuandLa page d'accueil d'un SaaS ou d'une app affiche sa promesse en 3 mots clés qui respirent chacun à leur rythme, créant une présence animée sans requête réseau ni vidéo.
PourquoiLe scale de 1 à 1,08 donne du poids visuel à chaque mot sans provoquer de reflux de mise en page — les mots voisins restent stables. La vague de gauche à droite guide le regard naturellement sur le message.
Réglages3 mots, --delay: 0s / 0.4s / 0.8s, animation-duration: 4s (plus solennel), font-size: clamp(3rem, 8vw, 6rem), font-weight: 900.
Guide de méditation — Instruction de respiration 4-7-8 — Breathing Text exemple 2

② Guide de méditation — Instruction de respiration 4-7-8

QuandDans une app de méditation ou de bien-être, les mots INSPIRE, RETIENS, EXPIRE s'animent pour accompagner visuellement un exercice de respiration guidée.
PourquoiLa sémantique des mots correspond exactement à l'animation : le texte respire littéralement. Chaque mot peut avoir sa propre durée de cycle via animation-duration en inline, calée sur les temps physiologiques 4-7-8.
Réglagesanimation-duration par span : 4s (INSPIRE), 7s (RETIENS), 8s (EXPIRE) ; scale(1.05) dans le keyframe pour une amplitude douce ; color: #a5f3fc.
Mode focus — Indicateur d'activité subliminale — Breathing Text exemple 3

③ Mode focus — Indicateur d'activité subliminale

QuandDans un tableau de bord ou un outil de productivité en mode focus, un indicateur vivant remplace un label statique « En cours… » sans distraire l'utilisateur.
PourquoiLa faible amplitude (scale 1 → 1,05) et le cycle lent (5 s) rendent l'animation quasiment subliminal — l'utilisateur perçoit que la page est vivante sans être dérangé. Fonctionne bien à côté d'un timer ou d'une barre de progression.
Réglages2 mots, --delay: 0s / 1.5s, animation-duration: 5s, scale(1.05) dans le keyframe, font-size: 0.85rem, color: rgba(255,255,255,0.55).

Comment ça marche

Le cœur de l'effet est @keyframes ktBreathe : à 0 % et 100 %, chaque mot est à transform: scale(1) et opacity: 0.85 ; au pic à 50 %, il atteint scale(1.08) et opacity: 1. La courbe ease-in-out sur 3 secondes donne l'impression d'une inspiration et d'une expiration douces. L'animation est déclarée infinie sur le sélecteur .kt-breathing .word, qui requiert display: inline-block — les transformations CSS n'ont aucun effet sur les éléments purement inline.

Le décalage mot par mot repose sur une variable CSS --delay posée dans l'attribut style de chaque <span class="word">. La règle animation-delay: var(--delay) lit cette valeur individuellement par élément, sans JavaScript. Ajouter un mot revient à insérer un <span class="word" style="--delay: Xs"> — le pas entre mots est entièrement libre.

Le fichier JS présent dans le code définit une fonction splitChars(el) (découpage de data-text en spans .char) et sélectionne un élément via getElementById('fadeInText'), mais ni la fonction ni la variable ne sont appelées à l'exécution — c'est du code utilitaire hérité d'un autre effet. L'animation de respiration fonctionne entièrement sans JS : le bloc <script> peut être supprimé ou remplacé sans rien casser.

Chaque .word se dilate depuis son centre grâce au transform-origin par défaut (50% 50%) — aucun décalage de mise en page, les mots voisins ne bougent pas. L'absence de will-change évite la réservation d'une couche GPU au repos, limitant l'empreinte mémoire quand plusieurs instances coexistent sur la page.

Accessibilité

  • prefers-reduced-motion : absent. Aucun bloc @media (prefers-reduced-motion: reduce) n'est présent dans le CSS. L'animation tourne en boucle infinie même si l'OS signale une préférence pour réduire le mouvement. Ajout recommandé : @media (prefers-reduced-motion: reduce) { .kt-breathing .word { animation: none; } }.
  • Aucun attribut aria-* ni role dans le HTML fourni. Pour un titre purement décoratif, c'est acceptable ; si le texte porte du sens pour les lecteurs d'écran, enveloppez le container dans un <p aria-label="texte complet"> et ajoutez aria-hidden="true" sur chaque <span class="word">.
  • Contraste : blanc (#fff) sur fond sombre (#0a0a0f) → ratio > 20:1, largement au-dessus du seuil WCAG AA (4,5:1).
  • Aucun élément interactif dans l'effet — navigation clavier sans impact, aucun gestionnaire d'événement clavier n'est attaché.
  • L'animation n'implique ni flash, ni clignotement rapide, ni déplacement de grande amplitude (scale 1 → 1,08 sur 3 s) — aucun risque de déclenchement de crise photo-épileptique.

Compatibilité navigateur

Requiert CSS Custom Properties et CSS Animations — supportés dans tous les navigateurs modernes. Zéro dépendance externe.

Chrome 65+✓ Complet
Firefox 55+✓ Complet
Safari 12+✓ Complet
Edge 79+✓ Complet
Mobile iOS✓ Complet
Android Chrome✓ Complet

Sans support des custom properties CSS (navigateurs très anciens), <code>animation-delay</code> tombe à 0 s (valeur initiale) — tous les mots respirent à l'unisson au lieu de se décaler. L'effet de respiration reste présent, simplement non décalé.

Le code

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

index.html — structure
<div class="kt-text kt-breathing" data-text="BREATHE IN OUT">
  <span class="word" style="--delay: 0s;">BREATHE</span>
  <span class="word" style="--delay: 0.5s;">IN</span>
  <span class="word" style="--delay: 1s;">OUT</span>
</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
--delay (inline sur chaque .word) 0s, 0.5s, 1s… Décalage d'animation par mot. Augmentez le pas pour une vague plus prononcée, réduisez-le pour une respiration quasi-simultanée.
animation-duration (règle CSS .kt-breathing .word) 3s Durée d'un cycle complet. 2 s = nerveux, 5–6 s = méditatif. Peut être surchargé mot par mot via style en inline.
scale() à 50% dans @keyframes ktBreathe scale(1.08) Amplitude maximale de la respiration. scale(1.04) = subtil, scale(1.15) = dramatique. Au-delà de scale(1.2), les mots adjacents commencent à se chevaucher.
opacity à 0%/100% dans @keyframes ktBreathe 0.85 Opacité au repos (creux de la respiration). Passez à 0.6 pour un effet plus marqué, 1 pour supprimer l'oscillation d'opacité.
font-size dans .kt-text 2.2rem Taille du texte. L'effet est perceptible à partir de 1.5 rem — en dessous, le scale de 1.08 est imperceptible.
color dans .kt-text #fff Couleur du texte. Tout hex ou rgba fonctionne ; une teinte légère (ex. #a5f3fc bleu glacé) accentue un registre spirituel ou organique.
letter-spacing dans .kt-text 0.02em Espacement entre lettres. Augmentez à 0.08em ou plus pour un rendu monumental adapté aux affiches ou slides plein écran.
margin dans .kt-breathing .word 0 0.15em Espace entre mots. Augmentez pour que chaque mot dispose de son propre halo et n'empiète pas sur ses voisins lors du scale.
animation-timing-function dans .kt-breathing .word ease-in-out Courbe d'accélération. linear = mécanique, ease-in-out = naturel/respiratoire. cubic-bezier(0.45,0,0.55,1) produit un souffle encore plus doux.

FAQ

Non. Le fichier JS définit une fonction splitChars() et sélectionne un élément, mais aucun des deux n'est appelé à l'exécution. L'animation de respiration est entièrement pilotée par le CSS — le keyframe ktBreathe et la variable --delay suffisent. Le bloc <script> peut être supprimé sans rien casser.
Ajoutez style="animation-duration: 4s" sur le span « INSPIRE », 7s sur « RETIENS » et 8s sur « EXPIRE ». Chaque mot peut avoir sa propre durée : la propriété animation-duration est héritée mais se surcharge via l'attribut style, et le cycle de chaque mot est indépendant.
Oui. La fonction splitChars(el) déjà présente dans le JS découpe data-text en <span class="char">. Appelez-la, remplacez .word par .char dans la règle CSS .kt-breathing et assignez --delay de façon incrémentale (ex. 0.08s par lettre) pour obtenir un effet lettre par lettre avec le même keyframe.