Texte✨ Premium

Blur Reveal

Animation CSS pure qui fait passer un texte de flou et invisible à net et lisible — durée, intensité du flou et easing entièrement réglables.

CSSBlurReveal

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

Portfolio / Landing — Nom ou titre d'identité révélé au chargement — Blur Reveal exemple 1

① Portfolio / Landing — Nom ou titre d'identité révélé au chargement

QuandÀ l'arrivée sur une page portfolio ou une landing page, quand le nom ou le titre principal est le premier élément que l'œil doit rencontrer.
PourquoiLe défloutage crée une entrée cinématique sans librairie d'animation — le nom semble se matérialiser devant le visiteur, renforçant l'impact de la première impression sans animation gadget.
RéglagesFlou initial : blur(16px), durée : 1.4s, timing : ease-out, délai : 0.3s. Pour plusieurs lignes, décaler le délai de 0.2s par élément.
Titre d'article — Entrée scénarisée sur scroll ou transition de scène — Blur Reveal exemple 2

② Titre d'article — Entrée scénarisée sur scroll ou transition de scène

QuandQuand une illustration plein écran laisse place au titre de l'article, ou quand l'utilisateur déroule jusqu'à une section clé d'un long-form.
PourquoiLe passage flou-à-net reproduit l'effet d'un objectif photo qui fait la mise au point — esthétique répandu en motion design éditorial pour conférer de l'autorité au titre.
RéglagesFlou initial : blur(24px), durée : 1.8s, timing : ease-out, police 4–6 rem, letter-spacing: -0.04em. Déclencher via IntersectionObserver en ajoutant la classe à l'entrée dans le viewport.
Révélation de KPI — Résultat calculé dans un dashboard — Blur Reveal exemple 3

③ Révélation de KPI — Résultat calculé dans un dashboard

QuandQuand un chiffre clé (chiffre d'affaires, score, nombre d'unités) vient d'être reçu de l'API et s'affiche pour la première fois dans l'interface.
PourquoiL'effet de défloutage sur un nombre signale visuellement que la valeur vient d'être calculée — l'utilisateur perçoit le chiffre comme frais et exact, ce qui réduit le doute sur sa fraîcheur.
RéglagesFlou initial : blur(8px), durée : 0.6s, timing : ease, délai de 200ms après réception des données. Appliquer uniquement au chiffre (<span> enfant), pas à toute la carte.

Comment ça marche

L'animation est pilotée intégralement par CSS via @keyframes blurReveal. L'état initial de .text-blur-reveal combine filter: blur(10px) et opacity: 0 — le texte est flou et invisible. Le keyframe to ramène ces deux valeurs à filter: blur(0) et opacity: 1. L'interpolation simultanée des deux propriétés produit l'impression d'un texte qui émerge progressivement du brouillard.

Le mot-clé forwards dans le raccourci animation est essentiel : il conserve l'état du dernier keyframe (blur(0), opacity: 1) une fois la durée écoulée. Sans lui, le navigateur remettrait instantanément le texte à son état de départ (blur(10px), opacity: 0) à la fin de l'animation.

Pour rejouer l'animation au clic, la technique standard en JS vanilla consiste à retirer la classe .text-blur-reveal, lire element.offsetWidth (force un reflow du navigateur), puis réappliquer la classe : le cycle recommence proprement depuis le keyframe 0. Aucune librairie n'est nécessaire — deux lignes suffisent.

Accessibilité

  • prefers-reduced-motion absent : la version de base ne détecte pas la préférence système. Ajouter @media (prefers-reduced-motion: reduce) { .text-blur-reveal { animation: none; filter: none; opacity: 1; } } pour afficher directement le texte net sans animation.
  • Le texte reste dans le DOM et dans l'arbre d'accessibilité pendant toute l'animation — filter et opacity n'affectent pas la lecture par les lecteurs d'écran.
  • opacity: 0 en état initial masque le texte visuellement mais n'équivaut pas à visibility: hidden ni display: none : le contenu est déjà accessible aux AT dès le chargement.
  • À l'état final (filter: blur(0), opacity: 1), l'effet n'altère aucun ratio de contraste — WCAG AA dépend uniquement des couleurs choisies.
  • Si le bouton « Rejouer » est exposé à l'utilisateur, le câbler sur un <button> natif focusable, pas sur un div cliquable — le clavier doit pouvoir déclencher la répétition.

Compatibilité navigateur

CSS filter: blur() et @keyframes supportés dans tous les navigateurs modernes. Zéro dépendance JS pour l'animation de base.

Chrome 88+✓ Complet
Firefox 87+✓ Complet
Safari 15.4+✓ Complet
Edge 88+✓ Complet
Mobile iOS✓ Complet
Android Chrome✓ Complet

Sans support de <code>filter</code> (IE 11), l'animation conserve uniquement la transition d'opacité (0 → 1) — le texte fait un fondu entrant sans effet de flou. Sans <code>@keyframes</code> du tout, le texte reste invisible (<code>opacity: 0</code>) : ajouter <code>.text-blur-reveal { opacity: 1; animation: none; }</code> comme règle de repli pour protéger ce cas.

Le code

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

index.html — structure
<div class="demo-preview">
  <!-- Texte unique -->
  <span class="demo-text text-blur-reveal">Votre texte</span>
</div>

<!-- Plusieurs lignes avec décalage échelonné -->
<div class="demo-preview">
  <span class="demo-text text-blur-reveal">Titre</span>
  <span class="demo-text text-blur-reveal"
        style="animation-delay: 0.3s">Sous-titre</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
blur(10px) dans .text-blur-reveal 10px Intensité du flou de départ. 4px = subtil, 10px = standard, 24px = dramatique. Modifier la valeur dans l'état initial du sélecteur (pas dans le keyframe, qui cible déjà blur(0)).
animation: 1s ease dans .text-blur-reveal 1s ease Durée et timing. Remplacer 1s par la valeur voulue (0.5s = vif, 1.8s = cinématique) ; ease-out pour une décélération élégante, linear pour un défloutage constant.
0s (délai) dans le raccourci animation 0s Délai avant déclenchement. Passer à 0.3s pour laisser la page s'afficher avant l'animation, ou surcharger par élément via style="animation-delay: Xs" pour des staggered reveals.
opacity: 0 dans .text-blur-reveal 0 Opacité de départ. Passer à 0.3 pour un départ semi-visible (texte légèrement perceptible dès le premier frame — effet plus doux, moins de saut visuel).
font-size: 2.5rem dans .demo-text 2.5rem Taille du texte — l'animation s'adapte à toutes les tailles. 1rem pour un label, 6rem pour un titre héro.
letter-spacing: -.02em dans .demo-text -0.02em Espacement entre les lettres. Valeur négative pour les gros titres (look condensé), 0 ou légèrement positif pour du corps de texte.

FAQ

Retirer la classe .text-blur-reveal de l'élément, lire element.offsetWidth (force un reflow du navigateur), puis réappliquer la classe : el.classList.remove('text-blur-reveal'); void el.offsetWidth; el.classList.add('text-blur-reveal');. Le navigateur repart du keyframe 0 proprement — deux lignes JS, zéro dépendance.
Oui. Ne pas ajouter la classe .text-blur-reveal en HTML (ou la retirer via JS au chargement), puis l'appliquer dans le callback d'un IntersectionObserver quand isIntersecting passe à true : l'animation se déclenche au moment précis où l'élément devient visible, sans polling.
Envelopper chaque ligne dans un <span class="text-blur-reveal"> et surcharger le délai en ligne : style="animation-delay: 0.2s", style="animation-delay: 0.4s", etc. Les éléments se défloutent en cascade sans JS supplémentaire.