LiquidGratuit

AI Typo Morph

Toutes les 3 s, le mot affiché se brouille en caractères tirés au hasard puis se recompose de gauche à droite, une lettre fixée toutes les 100 ms, jusqu'au mot suivant : un décodage façon « déchiffrement », en dégradé indigo-rose. CSS et 1,9 Ko de JavaScript, sans modèle d'IA, liste de mots dans le HTML, changement direct si l'utilisateur réduit les animations.

JSTypoMorph

Mis à jour le

DESIGN
Survolez ou cliquez la scène pour interagir

Cet effet est gratuit — la catégorie Liquid en contient 31 au total, dont 6 gratuits. Effect.Labs regroupe 840 effets vanilla. Découvrir la catégorie →

Exemples d'usage

Dégustation à l'aveugle · jeudi soir

Le vin n° 4 était…

VIN N° 4
23 votes61 % ont trouvé la Loire4 ont trouvé le millésime

① Le vin mystère révélé — soirée dégustation à l'aveugle chez un caviste

QuandAprès les votes, l'écran au comptoir affiche « Le vin n° 4 était… » ; le nom se décode lettre par lettre jusqu'à « CHINON 2019 », sous le résultat des votes.
PourquoiLes lettres qui se fixent une à une créent un suspense court ; le fondu de Text Morph révélerait tout d'un coup.
Réglagesdata-words="VIN N° 4, CHINON 2019" ; mot en serif de 50 px, dégradé champagne (#f7e3b0 → #d4a24c) sur fond lie-de-vin ; pour une révélation unique, remplacez la liste par le seul nom du vin après le premier décodage.
La Fabrique · tiers-lieuBienvenue

Réseau Wi-Fi TIERS-LIEU · code du jour :

????-????

Le code change chaque matin à 8 h · demandez au comptoir au besoin

② Code Wi-Fi du jour — écran d'accueil d'un tiers-lieu

QuandSur l'écran près de l'entrée, « Réseau Wi-Fi TIERS-LIEU · code du jour : » ; le code passe de « ????-???? » à « CAFE-7432 » en se décodant.
PourquoiLes lettres qui se fixent une à une attirent l'œil sur le nouveau code sans clignoter ; une suite sans sens se prête au brouillage, un mot lisible (Text Morph) non.
RéglagesPolice à chasse fixe de 46 px (la ligne ne bouge pas pendant le brouillage), dégradé d'origine dans un cartouche sombre sur fond crème ; data-words="????-????, CAFE-7432".
Dernier contact
F4KXY

14,074 MHz · FT8
−12 dB · JN18
14:32 UTC

HeureIndicatifBandeSignal
14:27OZ1QRV20 m−18 dB
14:19I2WXQ20 m−09 dB
14:06LA9ZQK40 m−21 dB

③ Indicatif de la station captée — journal de trafic d'un radio-club

QuandDans le bandeau « Dernier contact », l'indicatif de la station se décode lettre par lettre à chaque nouvelle station captée, au-dessus du journal des contacts précédents.
PourquoiUn indicatif est une suite de lettres et de chiffres sans sens : le brouillage qui se fixe évoque le décodage d'un signal.
RéglagesPolice à chasse fixe de 44 px, dégradé ciel vers rose (#7dd3fc → #f0abfc) ; trois indicatifs dans data-words ; fréquence, mode et heure à droite, tableau des contacts dessous.

Comment ça marche

Le mot est un <div class="ai-typo-word"> centré dans .ai-typo-morph : 2,5rem, graisse 800, 2 px d'espace entre les lettres, peint d'un dégradé indigo, violet, rose (#6366f1 → #a855f7 → #ec4899) découpé à la forme des lettres (background-clip: text). La liste des mots est dans son attribut data-words, séparés par des virgules ; le premier est écrit dans le HTML, donc visible sans script.

Toutes les 3 s, le script relit data-words, prend le mot suivant et lance le décodage : toutes les 50 ms, il réécrit le texte en entier. La lettre de rang i est fixée dès que le compteur de passages dépasse 2 × i : une lettre de plus devient juste toutes les 100 ms, de gauche à droite ; les autres sont tirées au hasard parmi 66 caractères (A à Z, a à z, 0 à 9, @ # $ %), les espaces restent des espaces. Au bout de longueur × 2 + 5 passages, le mot exact est posé : 0,85 s pour un mot de 6 lettres, 1,35 s pour « CHINON 2019 ». Le seul hasard est ce tirage de caractères (Math.random) : le nom « AI » du catalogue ne recouvre aucun modèle ni aucune intelligence artificielle.

Le script traite chaque .ai-typo-word de la page, chacun avec sa liste et son minuteur, et ne fait rien quand le mot est hors de l'écran (IntersectionObserver) ou l'onglet masqué. Comme la liste est relue à chaque changement, on peut la modifier depuis la page : une liste d'un seul mot arrête le défilement sur ce mot. Les caractères tirés n'ont pas la même largeur que les lettres finales : dans une police proportionnelle, le mot respire un peu pendant le décodage ; une police à chasse fixe (monospace) garde la ligne immobile, utile pour un code ou un indicatif. Mesuré dans Chromium 151, Firefox 153 et WebKit 26 : DESIGN, CRÉER, FORMER, RÊVER, dans l'ordre, chaque décodage terminé avant le suivant.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, le mot change d'un coup toutes les 3 s, sans aucun caractère brouillé. Mesuré dans les trois moteurs : sur 7 s, seuls les mots complets apparaissent (DESIGN, CRÉER, FORMER, RÊVER).
  • Lecteurs d'écran : pendant le décodage, le texte réel de l'élément est une suite de caractères au hasard, réécrite toutes les 50 ms. L'élément n'est pas une zone aria-live, donc rien n'est annoncé ; mais un lecteur d'écran qui le lit à cet instant entend du charabia. Si le mot porte une information (un code, un nom à révéler), mettez aria-hidden="true" sur l'élément animé et écrivez le mot final dans un texte masqué visuellement, mis à jour une fois le décodage fini.
  • Clignotement : les caractères changent vite mais sans éclair ni alternance de luminosité, et le brouillage dure moins de 1,5 s par mot.

Compatibilité navigateur

CSS (background-clip: text) + 1,9 Ko de JavaScript (setInterval, IntersectionObserver, matchMedia), aucune dépendance. Mesuré dans Chromium 151, Firefox 153 et WebKit 26 : même ordre des mots, même rythme d'une lettre toutes les 100 ms, même changement direct sous mouvement réduit ; pause hors écran vérifiée dans Chromium et Firefox.

Chrome 58+✓ Complet
Firefox 55+✓ Complet
Safari 12.1+✓ Complet
Edge 79+✓ Complet
Mobile iOS 12.2+✓ Complet
Android Chrome 58+✓ Complet

Sans JavaScript, le premier mot écrit dans le HTML reste affiché, en dégradé. Sans IntersectionObserver, le défilement continue hors écran. Sans background-clip: text (cas rare), le mot s'affiche sur un pavé de dégradé : retirez alors -webkit-text-fill-color et donnez une couleur au texte.

Le code

Copiez les trois blocs dans votre page. Aucune dépendance.

HTML
<div class="fx-0419-root">
  <div class="ai-typo-morph">
    <div class="ai-typo-word" data-words="DESIGN, CRÉER, FORMER, RÊVER, BÂTIR">DESIGN</div>
  </div>
</div>
CSS
.fx-0419-root,
.fx-0419-root *,
.fx-0419-root *::before,
.fx-0419-root *::after {
  box-sizing: border-box
}

.fx-0419-root {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 250px;
  overflow: hidden;
  position: relative;
  background: rgb(26, 26, 36);
  color: rgb(255, 255, 255);
  font-family: sans-serif;
}

.ai-typo-morph {
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

.ai-typo-word {
  font-size: 2.5rem;
  font-weight: 800;
  background: linear-gradient(135deg, #6366f1, #a855f7, #ec4899);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  letter-spacing: 2px;
}
JavaScript (fx-0419)
(function() {
  // AI Typo Morph : le mot se brouille puis se recompose lettre par lettre
  // Mots : attribut data-words, séparés par des virgules (relu à chaque changement)
  var reduce = window.matchMedia('(prefers-reduced-motion: reduce)');
  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#$%';

  document.querySelectorAll('.ai-typo-word').forEach(function(wordEl) {
    function readWords() {
      return (wordEl.getAttribute('data-words') || '').split(',')
        .map(function(w) { return w.trim(); })
        .filter(Boolean);
    }
    var currentWord = 0;
    var scramble = 0;
    var onScreen = true;
    if (!wordEl.textContent.trim()) wordEl.textContent = readWords()[0] || '';

    function morphTo(target) {
      clearInterval(scramble);
      // Mouvement réduit : le mot change d'un coup, sans brouillage
      if (reduce.matches) {
        wordEl.textContent = target;
        return;
      }
      var iterations = 0;
      scramble = setInterval(function() {
        var result = '';
        for (var i = 0; i < target.length; i++) {
          if (iterations > i * 2 || target[i] === ' ') {
            result += target[i];
          } else {
            result += chars[Math.floor(Math.random() * chars.length)];
          }
        }
        wordEl.textContent = result;
        iterations++;
        if (iterations > target.length * 2 + 5) {
          clearInterval(scramble);
          wordEl.textContent = target;
        }
      }, 50);
    }

    // Pause quand le bloc est hors écran
    if ('IntersectionObserver' in window) {
      new IntersectionObserver(function(entries) {
        onScreen = entries[0].isIntersecting;
      }).observe(wordEl);
    }

    setInterval(function() {
      var words = readWords();
      if (!onScreen || document.hidden || words.length < 2) return;
      currentWord = (currentWord + 1) % words.length;
      morphTo(words[currentWord]);
    }, 3000);
  });
})();

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Mots (HTML — data-words sur .ai-typo-word) DESIGN, CRÉER, FORMER, RÊVER, BÂTIR Mots, codes ou groupes de mots séparés par des virgules ; écrivez le premier dans l'élément. Relue à chaque changement : une liste d'un seul mot fige l'affichage sur ce mot.
Cadence (JS — 3000 dans setInterval) 3 s entre deux mots Gardez-la au-dessus de la durée du décodage (longueur × 100 ms + 250 ms) : 2 s suffit pour des mots de 6 lettres, 5 s laisse le temps de lire un code.
Vitesse du décodage (JS — 50 ms et i * 2) une lettre fixée toutes les 100 ms i * 4 fixe une lettre toutes les 200 ms, pour un suspense plus long ; i * 1 toutes les 50 ms, pour un décodage éclair.
Caractères tirés (JS — chars) A–Z, a–z, 0–9, @ # $ % '0123456789' pour un compteur ou un code chiffré, '01' pour un effet binaire, des symboles ('░▒▓█') pour un brouillage plus graphique.
Police et dégradé (CSS — .ai-typo-word) police du site, 2,5rem, graisse 800, dégradé indigo-violet-rose font-family: monospace évite que le mot change de largeur pendant le brouillage ; le dégradé se remplace par n'importe quelle couleur ou dégradé.

FAQ

Y a-t-il de l'intelligence artificielle dans cet effet ?

Non. Le nom vient du catalogue, mais le script ne fait que tirer des caractères au hasard (Math.random) puis fixer les lettres du mot visé une à une, de gauche à droite. Aucun modèle, aucun appel réseau : le mot final est toujours celui écrit dans data-words.

Comment révéler un mot une seule fois, sans boucle ?

Écrivez deux mots dans la liste, le texte d'attente puis le mot à révéler (data-words="VIN N° 4, CHINON 2019"). Après le premier décodage, remplacez la liste par le seul mot révélé (el.dataset.words = 'CHINON 2019') : avec un seul mot, le script ne change plus rien. Pour déclencher la révélation au clic plutôt qu'au bout de 3 s, laissez au départ un seul mot dans la liste et ajoutez le second au clic.

Quelle différence avec Text Morph (fx-0405) ?

Text Morph passe d'un mot à l'autre par un fondu flou : on ne voit jamais que des mots entiers, lisibles à tout instant. AI Typo Morph montre le passage : le mot se brouille en caractères au hasard puis se reconstruit lettre par lettre. Choisissez AI Typo Morph pour un code, un nom à révéler ou une ambiance « signal » ; Text Morph pour des mots qui doivent rester lisibles (langues, métiers, produits).