Texte✨ Premium

Bounce In Letters

Chaque lettre surgit du haut avec un rebond élastique — animation CSS pure en cascade à 80 ms d'intervalle, zéro dépendance, pour des titres mémorables.

JSCSSElastic

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

Landing page — Titre principal qui s'impose lettre par lettre — Bounce In Letters exemple 1

① Landing page — Titre principal qui s'impose lettre par lettre

QuandLe visiteur arrive sur la page d'accueil ou la section héro d'un portfolio, d'un outil ou d'une app — le titre principal (1 à 2 mots) entre en scène au chargement.
PourquoiL'entrée lettre par lettre avec rebond attire l'œil et crée une première impression mémorable sans perturber le layout — l'effet dure moins d'une seconde et laisse immédiatement la place au texte de support.
Réglagesfont-size 4–5rem, stagger 0,06 s (plus vif sur des mots courts), cubic-bezier (.68, -.55, .265, 1.55) conservé pour le rebond franc.
Mise en page éditoriale — Mot-clé en vedette dans un article — Bounce In Letters exemple 2

② Mise en page éditoriale — Mot-clé en vedette dans un article

QuandUne section « À la une », un chapô d'article, un label de catégorie ou un pull-quote qui doit sortir du lot dans un layout de contenu.
PourquoiL'effet est entièrement typographique — pas de canvas, pas de particules. Il s'insère dans n'importe quel flux de contenu sans CSS de positionnement supplémentaire et sans perturber le texte environnant.
Réglagesfont-size 2–3rem, stagger 0,08 s, couleur de texte en gradient CSS appliqué aux spans pour renforcer l'identité visuelle.
Écran d'intégration — Bienvenue en grand format — Bounce In Letters exemple 3

③ Écran d'intégration — Bienvenue en grand format

QuandL'utilisateur vient de créer son compte et arrive pour la première fois dans l'application — l'écran est vierge, l'interface principale n'est pas encore déployée.
PourquoiBIENVENUE compte 9 lettres : avec un stagger de 0,08 s la cascade dure plus de 700 ms et chaque rebond a le temps d'exister avant que le suivant démarre — c'est exactement la plage où l'élasticité du cubic-bezier est visible lettre par lettre.
Réglagesfont-size 3,2–4rem, stagger 0,08 s, fond uni ou très légèrement texturé pour que l'entrée de chaque lettre soit le seul mouvement à l'écran, cubic-bezier (.68, -.55, .265, 1.55) conservé.

Comment ça marche

L'animation repose sur un @keyframes CSS uniquebounceInLetter — qui fait passer chaque lettre de opacity:0, translateY(-50px) scale(.5) à opacity:1, translateY(0) scale(1) en 600 ms. L'easing cubic-bezier(.68, -.55, .265, 1.55) produit un dépassement élastique : le 4ᵉ paramètre dépasse 1, ce qui pousse la lettre légèrement au-delà de sa position finale avant qu'elle ne se stabilise — le rebond caractéristique.

La fonction utilitaire splitText(el, text, delayStep) décompose le texte caractère par caractère et injecte un <span style="animation-delay:Xs"> par lettre. Le délai croît de delayStep à chaque lettre (0 s, 0,08 s, 0,16 s…) — c'est ce qui produit l'entrée en cascade plutôt qu'une entrée simultanée. Le mode animation-fill-mode: forwards assure que chaque lettre reste visible après la fin de son animation, même si les suivantes sont encore en vol.

Le bouton Replay appelle replayBounceIn() : il vide le innerHTML du conteneur puis rappelle splitText après 50 ms — ce délai laisse au navigateur le temps de forcer un recalcul de style avant de réinjecter les spans, ce qui garantit un restart propre de l'animation CSS.

Point de vigilance : en l'état le CSS ne contient pas de règle @media (prefers-reduced-motion). Comme les spans démarrent à opacity:0, si les animations CSS sont désactivées (préférence OS ou très vieux navigateur) le texte reste invisible — pensez à ajouter le repli décrit dans la section A11y.

Accessibilité

  • prefers-reduced-motion absent du code : aucune règle @media n'est incluse. Ajoutez @media (prefers-reduced-motion: reduce) { .text-bounce-in span { animation: none; opacity: 1; transform: none; } } pour les utilisateurs sensibles aux animations.
  • Le texte est structuré en <span> inline — les lecteurs d'écran lisent le mot complet dans l'ordre du DOM, sans être perturbés par le découpage lettre par lettre.
  • Le bouton Replay est un <button> natif, focusable au clavier et atteignable par Tab — aucun rôle ARIA supplémentaire nécessaire.
  • Contraste du texte : blanc (#ffffff) sur fond sombre (#0a0a0f), ratio > 15:1 — largement au-delà de WCAG AA (4,5:1) et AAA (7:1).
  • En l'absence de support CSS animation (très anciens navigateurs), les spans restent à opacity:0 et le texte est invisible. Repli recommandé : @supports not (animation-name: a) { .text-bounce-in span { opacity:1; transform:none; } }.

Compatibilité navigateur

Repose sur CSS animations, cubic-bezier et animation-fill-mode — supportés dans tous les navigateurs modernes depuis 2015. Zéro dépendance externe.

Chrome 43+✓ Complet
Firefox 16+✓ Complet
Safari 9+✓ Complet
Edge 12+✓ Complet
Mobile iOS✓ Complet
Android Chrome✓ Complet

Sans support CSS animation, les lettres restent à <code>opacity:0</code> (texte invisible). Repli sûr : <code>@supports not (animation-name: a) { .text-bounce-in span { opacity:1; transform:none; } }</code>.

Le code

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

index.html — structure
<div class="demo-preview">
  <span class="demo-text text-bounce-in" id="bounceInText">
    <!-- spans générés par splitText(el, 'MOT', 0.08) -->
    <span style="animation-delay: 0s">M</span>
    <span style="animation-delay: 0.08s">O</span>
    <span style="animation-delay: 0.16s">T</span>
  </span>
  <button class="replay-btn" onclick="replayBounceIn()">Replay</button>
</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
0.08 (3ᵉ arg de splitText) 0.08 s Délai entre chaque lettre. Réduisez à 0,05 s pour un mot court et vif, montez à 0,12 s pour un long mot afin de garder la cascade visible.
animation: .6s … 0.6 s Durée de l'animation par lettre (CSS, ligne .text-bounce-in span). Augmentez à 0,9 s pour un effet plus lent et cinématique.
cubic-bezier(.68, -.55, .265, 1.55) 1.55 (4ᵉ param.) Amplitude du rebond élastique. Montez à 1.8 pour un rebond prononcé, descendez à 1.1 pour une entrée plus douce.
translateY(-50px) -50px Distance de chute initiale en CSS. -80px pour une entrée plus dramatique depuis le haut, -20px pour un glissement subtil.
scale(.5) 0.5 Échelle de départ de chaque lettre en CSS. 0.8 pour un léger zoom, 0.1 pour une apparition depuis presque zéro.
font-size: 2.5rem 2.5rem Taille du texte en CSS (classe .demo-text). L'effet fonctionne de 1rem à 8rem — adaptez librement selon le contexte.
'BOUNCE' (2ᵉ arg de splitText) "BOUNCE" Texte à animer. Modifiez la chaîne dans l'appel JS pour l'adapter à votre contenu — l'effet fonctionne avec n'importe quelle chaîne Unicode.

FAQ

Oui. La fonction splitText(el, texte, delay) prend un élément en premier paramètre — appelez-la sur autant d'éléments que nécessaire avec des id différents. Chaque conteneur doit porter la classe text-bounce-in pour hériter de la règle CSS d'animation.
Utilisez un IntersectionObserver : observez le conteneur, et dans le callback appelez splitText(el, texte, delay) dès que isIntersecting devient vrai. Appelez observer.unobserve(el) ensuite pour ne déclencher qu'une seule fois.
Non. Le JS est indispensable pour injecter les <span> avec leurs animation-delay individuels. Sans JS, vous pouvez pré-rendre les spans côté serveur ou directement dans le HTML source — c'est d'ailleurs la structure fournie dans l'exemple, qui s'anime dès le chargement sans aucun appel JS supplémentaire.