Texte✨ Premium

Typewriter Delete

Un setTimeout récursif tape et efface des mots en boucle — curseur clignotant CSS, vitesses de frappe et suppression indépendantes, cycle infini.

JSTypewriterLoop

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 landing — Slogan rotatif à identité forte — Typewriter Delete exemple 1

① Hero de landing — Slogan rotatif à identité forte

QuandLa page d'accueil présente plusieurs axes de valeur (créer, concevoir, bâtir…) et on veut les cycler sans surcharger l'écran d'une liste statique.
PourquoiL'effet concentre l'attention sur un seul mot à la fois, renforce la lisibilité et crée un sentiment de dynamisme sans distraire du CTA principal en dessous.
RéglagesMots : ['CRÉEZ', 'CONCEVEZ', 'BÂTISSEZ', 'INSPIREZ'] ; font-size 3rem ; delay frappe 120 ms, pause mot 2 000 ms ; couleur = teinte primaire de la brand.
Barre de recherche — Suggestions de requêtes animées — Typewriter Delete exemple 2

② Barre de recherche — Suggestions de requêtes animées

QuandUn moteur de recherche interne ou une barre de documentation affiche des exemples de requêtes populaires pour orienter l'utilisateur quand le champ est vide.
PourquoiLe texte clignotant imite une vraie saisie, attire naturellement l'œil vers la barre et réduit la friction « je ne sais pas quoi chercher ».
RéglagesMots : ['React hooks', 'CSS Grid', 'Tailwind v4', 'TypeScript'] ; font-size 1rem ; couleur #a5b4fc ; delay frappe 80 ms, suppression 40 ms, pause 2 000 ms.
Terminal de commandes — CLI développeur rotatif — Typewriter Delete exemple 3

③ Terminal de commandes — CLI développeur rotatif

QuandUne landing de CLI, une page de doc ou un README interactif veut montrer les commandes phares de l'outil pour donner une idée rapide de l'usage.
PourquoiL'esthétique monospace + curseur clignotant renforce l'identité terminal — les commandes qui s'affichent et s'effacent donnent envie de les taper soi-même.
RéglagesMots : ['npm install mylib', 'git commit -m feat', 'yarn build', 'npx deploy --prod'] ; couleur #4ade80 (vert terminal) ; delay frappe 60 ms, suppression 30 ms.

Comment ça marche

L'animation repose sur un setTimeout récursif — sans requestAnimationFrame. À chaque appel, une seule propriété textContent du <span> est mise à jour avec un substring(0, n) du mot courant : n augmente d'un lors de la frappe, diminue d'un lors de la suppression. Deux délais coexistent : 100 ms par caractère ajouté, 50 ms par caractère supprimé (2× plus rapide).

Le curseur clignotant est entièrement CSS : une border-right: 3px solid #22d3ee posée sur le <span> lui-même, animée par @keyframes blinkCursor qui bascule border-color: transparent à 50 % avec une timing-function step-end — le clignotement est une bascule franche, sans fondu progressif.

Quand charIndex atteint la longueur du mot, une pause de 1 500 ms s'écoule avant le déclenchement de la suppression (isDeleting = true). Quand l'index revient à 0, une pause de 300 ms précède le mot suivant — obtenu par typewriterIndex = (typewriterIndex + 1) % typewriterWords.length. Le tableau défile en boucle infinie.

La fonction replayTypewriterDelete() vide le textContent, remet tous les compteurs à zéro et relance le cycle depuis le premier mot — prévue pour se brancher sur un bouton ou un événement métier. Elle doit être exposée sur window si elle est appelée via un attribut onclick inline (hors IIFE).

Accessibilité

  • Pas de prefers-reduced-motion : ni le CSS ni le JS ne vérifient cette préférence — le curseur clignote et les mots cyclent indéfiniment même si l'OS signale de réduire le mouvement. À ajouter manuellement si votre audience y est sensible.
  • Contraste couleur : le texte #22d3ee sur fond #0a0a0f atteint un ratio > 8:1 — largement au-dessus du seuil WCAG AA (4,5:1).
  • Le texte est du vrai textContent DOM, pas une image : les lecteurs d'écran lisent les mots affichés, mais l'absence de aria-live ou role="status" signifie que les changements de contenu ne sont pas annoncés automatiquement.
  • Le bouton Replay est un <button> natif — focusable au clavier (Tab + Entrée), dans le flux de tabulation normal.
  • Le curseur CSS (border-right clignotant) est purement décoratif et ne nécessite pas d'équivalent texte ou aria.

Compatibilité navigateur

Utilise setTimeout, textContent et des animations CSS — disponibles dans tous les navigateurs depuis plus de 10 ans. Zéro dépendance externe.

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

Si JavaScript est désactivé, le <code>&lt;span&gt;</code> reste vide — aucune erreur fatale, la page reste fonctionnelle. Le curseur CSS clignote seul.

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-typewriter-delete" id="typewriterDeleteText"></span>
  <!-- Le bouton appelle replayTypewriterDelete() — exposez-la sur window si nécessaire -->
  <button class="replay-btn" onclick="replayTypewriterDelete()">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
typewriterWords (JS, ligne 3) ['CREATE', 'DESIGN', 'BUILD', 'INSPIRE'] Tableau des mots à cycler — remplacez par vos propres chaînes. Longueur illimitée, le défilement est modulaire.
.text-typewriter-delete { color } #22d3ee Couleur du texte ET du curseur clignotant — un seul changement suffit car border-color hérite de color si non surchargé.
.text-typewriter-delete { border-right-width } 3px Épaisseur du curseur. 2px pour un curseur fin, 4–5px pour un curseur épais à la façon terminal.
delay = 100 (frappe, JS) 100 ms Délai entre chaque caractère ajouté. 60–80 ms = frappe rapide, 150–200 ms = rendu « humain » avec hésitations.
delay = 50 (suppression, JS) 50 ms Délai entre chaque caractère effacé. La suppression est 2× plus rapide que la frappe par défaut — ajustez le ratio à votre goût.
delay = 1500 (pause après mot, JS) 1 500 ms Temps d'affichage du mot complet avant que la suppression ne commence. 800 ms = rythme vif, 2 500 ms = lecture confortable.
delay = 300 (pause entre mots, JS) 300 ms Attente entre la fin de la suppression et le début du mot suivant. 0–100 ms donne un rendu mécanique, 500 ms un rythme posé.
.demo-text { font-size } 2.5rem Taille du texte. L'effet fonctionne de 0.9rem (placeholder d'input) à 5rem (hero plein écran) sans modification de la logique JS.

FAQ

Oui — le code ne vérifie pas prefers-reduced-motion. Pour respecter cette préférence, ajoutez au début de la fonction de démarrage : if (window.matchMedia('(prefers-reduced-motion:reduce)').matches) return; — l'effet ne se lancera pas sur les systèmes concernés.
Exposez la fonction globalement en ajoutant window.replayTypewriterDelete = replayTypewriterDelete; à l'intérieur de l'IIFE (avant la fermeture), puis appelez window.replayTypewriterDelete() depuis n'importe quel événement — rechargement de section, fin de vidéo, scroll trigger, etc.
Pas directement — le code cible un seul id="typewriterDeleteText". Pour plusieurs instances, transformez la logique en fonction d'usine : function makeTypewriter(el, words, opts) { … } avec son propre état local (index, charIndex, isDeleting, timer), et appelez-la sur chaque élément cible.