Texte✨ Premium

Wave Animation

Chaque lettre oscille entre font-weight 300 et 900 via un keyframe CSS, le délai décalé de 0,15 s par caractère propageant une vague de graisse de gauche à droite.

CSSWaveStagger

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

Lecteur audio — Titre de piste en pulsation — Wave Animation exemple 1

① Lecteur audio — Titre de piste en pulsation

QuandDans un lecteur audio web ou sur le site d'un artiste, le titre du morceau en cours est affiché en grand format — chaque lettre oscille en graisse au rythme du tempo, transformant la typographie en visualisation sonore passive.
PourquoiL'ondulation de font-weight traduit le tempo musical sans canvas ni Web Audio API — la vague de graisse CSS seule suffit à donner l'impression que le texte répond à la musique, renforçant l'identité visuelle de la piste affichée.
Réglagesfont-size 3–4 rem, délai 0,08 s par lettre (onde rapide calée sur ~120 BPM), animation-duration 1 s pour simuler un temps fort, couleur de crête assortie à l'accent de la pochette (ex. #8b5cf6).
Revue en ligne — Heading de rubrique animé — Wave Animation exemple 2

② Revue en ligne — Heading de rubrique animé

QuandEn ouverture d'une rubrique ou d'un article dans un magazine numérique, pour marquer visuellement le changement de section sans scroll-trigger complexe.
PourquoiLa vague de graisse mime une mise en valeur progressive de la typographie — appropriée dans un contexte éditorial où l'animation reste dans le texte et ne déborde pas hors de la ligne.
Réglagesfont-size 2–2,5 rem, délai 0,2 s par lettre (onde lente et ample), couleur de crête adaptée à la charte éditoriale (ex. doré #f59e0b).
Motion design — Wordmark animé en boucle — Wave Animation exemple 3

③ Motion design — Wordmark animé en boucle

QuandDans un show-reel, un portfolio ou une page « À propos » où le nom de la marque est présenté seul sur fond neutre comme pièce de motion design.
PourquoiL'animation CSS native évite tout SVG ou librairie externe — le wordmark palpite en autonomie, suffisamment discret pour rester en arrière-plan d'un écran de présentation ou d'un loader de marque.
Réglagesfont-size 3–3,5 rem, délai 0,08 s par lettre (onde très rapide et fluide), couleur de crête blanc pur (#fff) pour que la graisse seule porte l'impact.

Comment ça marche

L'animation repose sur un unique @keyframes vfWave CSS qui pilote trois propriétés à la fois : font-weight passe de 300 (light) à 900 (black) au creux et au pic de la courbe, transform: translateY lève la lettre de 10 px au moment du poids maximal, et color bascule de blanc à 60 % d'opacité vers le violet #8b5cf6. La synchronisation de ces trois axes sur une seule animation donne à l'oscillation son caractère sculptural.

Chaque lettre est un <span class="vf-wave-char"> indépendant dont le décalage de départ est injecté en style inline (animation-delay: N × 0,15 s). C'est ce décalage progressif qui crée l'effet de vague : toutes les lettres font le même cycle de 2 s, mais elles démarrent à des instants échelonnés. Un mot de 8 lettres produit une fenêtre de déphasage totale de 1,05 s.

L'interpolation de font-weight entre 300 et 900 n'est fluide que si la police utilisée est une police variable supportant l'axe wght (ex. Inter Variable, Roboto Flex, Plus Jakarta Sans). Avec une police statique, le navigateur saute entre les graisses disponibles (400, 700…) : l'effet reste lisible mais moins lissé. La police déclarée est Inter, sans-serif — sans chargement explicite d'Inter Variable, le résultat dépend de l'installation locale.

Le JS est vide : l'effet est 100 % CSS. Il n'y a ni requestAnimationFrame, ni IntersectionObserver, ni API publique — l'animation démarre dès que les classes sont présentes dans le DOM et tourne indéfiniment. Pour la stopper, il suffit d'ajouter animation-play-state: paused sur .vf-wave-char via JS ou de retirer la classe.

Accessibilité

  • prefers-reduced-motion absent du code : aucune règle @media (prefers-reduced-motion: reduce) n'est définie — l'animation boucle indéfiniment quelle que soit la préférence système. À ajouter manuellement : @media (prefers-reduced-motion: reduce) { .vf-wave-char { animation: none; font-weight: 400; color: #fff; } }
  • Le texte est du contenu HTML natif (spans dans le flux normal) — les lecteurs d'écran lisent les lettres dans l'ordre ; aucun canvas ni aria-label nécessaire.
  • La couleur de repos rgba(255,255,255,0.6) sur fond #0a0a0f passe le ratio WCAG AA pour les grands textes (≥ 18 pt) ; la couleur de crête #8b5cf6 atteint un ratio ≈ 4,6 : 1 sur fond noir, passant AA pour les grands textes.
  • Aucun élément interactif dans la structure par défaut — pas de gestion de focus ou de clavier requise.
  • Par défaut, aucun role ni aria-label n'est posé. Si le texte animé est un titre de page, enveloppez .vf-wave-text dans un <h1> ou <h2> pour rester dans la hiérarchie sémantique.

Compatibilité navigateur

Nécessite CSS @keyframes et animation — supportés dans tous les navigateurs modernes depuis des années. L'interpolation fluide de font-weight exige une police variable (axe wght) ; sans elle, les poids snappent aux valeurs disponibles.

Chrome 103+✓ Complet (variable fonts natif)
Firefox 62+✓ Complet
Safari 11+✓ Complet
Edge 79+✓ Complet
Mobile iOS 11+✓ Complet
Android Chrome✓ Complet

Si la police n'est pas variable, <code>font-weight</code> saute entre les graisses disponibles au lieu de s'interpoler — l'effet de couleur et le <code>translateY</code> restent actifs. Aucune erreur JS ; la page reste fonctionnelle.

Le code

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

index.html — structure
<div class="vf-wave-scene">
  <div class="vf-wave-text" id="vfWaveText">
    <span class="vf-wave-char" style="animation-delay:0s;">V</span>
    <span class="vf-wave-char" style="animation-delay:0.15s;">O</span>
    <span class="vf-wave-char" style="animation-delay:0.30s;">T</span>
    <span class="vf-wave-char" style="animation-delay:0.45s;">R</span>
    <span class="vf-wave-char" style="animation-delay:0.60s;">E</span>
    <!-- un .vf-wave-char par lettre — animation-delay +0.15 s par caractère -->
  </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
animation-delay (inline style HTML) 0,15 s × index Décalage de départ de chaque lettre. Réduire à 0,08 s pour une onde rapide, augmenter à 0,25 s pour une vague lente et dramatique.
animation-duration (.vf-wave-char) 2s Durée d'un cycle complet par lettre. De 1 s (dynamique) à 4 s (lent et cinématique).
font-weight 0%/100% (@keyframes vfWave) 300 Graisse au repos. 100 = ultralight, 400 = regular. Réduire pour accentuer le contraste avec le pic.
font-weight 50% (@keyframes vfWave) 900 Graisse au pic. 700 = bold subtil, 900 = black maximal. N'a d'effet fluide qu'avec une police variable.
translateY 50% (@keyframes vfWave) -10px Montée verticale au pic de graisse. 0px = poids pur sans déplacement, 20px = rebond marqué.
color 50% (@keyframes vfWave) #8b5cf6 Couleur accent à plein poids. Remplacer par la couleur primaire de votre marque.
color 0%/100% (@keyframes vfWave) rgba(255,255,255,.6) Couleur et opacité au repos. rgba(255,255,255,1) pour des lettres toujours pleinement visibles.
font-size (.vf-wave-char) 2.5rem Taille des caractères. De 1,5 rem (titre de carte) à 8 rem (hero pleine largeur). La police variable doit disposer des instances à cette taille.
font-family (.vf-wave-char) Inter, sans-serif Doit être une police variable avec axe wght pour une interpolation fluide. Alternatives : Roboto Flex, Plus Jakarta Sans, Nunito Variable.

FAQ

L'interpolation fluide de font-weight nécessite une police variable disposant de l'axe wght. Sans elle (ex. Inter statique ou Arial), le navigateur saute entre les graisses disponibles (400 → 700) au lieu de les interpoler. Chargez Inter Variable via Google Fonts (@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap')) pour obtenir le dégradé continu.
Créez un <span class="vf-wave-char"> par lettre dans votre .vf-wave-text, en partant de animation-delay: 0s pour la première lettre et en ajoutant 0,15 s par caractère. Les espaces peuvent rester du texte HTML normal sans la classe — ils ne seront pas animés.
Oui : inversez simplement les délais — donnez animation-delay: 0s à la dernière lettre et augmentez vers la première. Pour une vague depuis le centre : délai 0 s sur les lettres centrales, croissant vers les extrémités. Aucun changement CSS global n'est nécessaire.