Noi siamo
Typed.js è la libreria JavaScript più usata per creare l’effetto macchina da scrivere sul web: leggera, zero dipendenze, configurabile in pochi minuti. In questa guida trovi la configurazione completa, tutte le opzioni disponibili, e un confronto con le alternative moderne per aiutarti a scegliere lo strumento giusto.
Installazione
Via CDN (cdnjs)
<!-- Aggiungi prima della chiusura di </body> -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/typed.js/2.1.0/typed.umd.js"></script>Via npm (pacchetto ufficiale)
npm install typed.js
import Typed from 'typed.js';Configurazione base
Struttura HTML minima: un elemento target dove Typed.js scriverà il testo.
<h1>Sono <span id="typed"></span></h1>const typed = new Typed('#typed', {
strings: ['un developer', 'un freelance', 'un CyberAlchimista'],
typeSpeed: 80,
backSpeed: 50,
loop: true,
});Tutte le opzioni disponibili
| Opzione | Default | Descrizione |
|---|---|---|
strings | [] | Array di stringhe da scrivere |
stringsElement | null | ID di un elemento HTML da cui leggere le stringhe |
typeSpeed | 30 | Velocità di scrittura (ms per carattere) |
startDelay | 0 | Ritardo prima di iniziare (ms) |
backSpeed | 0 | Velocità di cancellazione (ms per carattere) |
smartBackspace | true | Cancella solo la parte che cambia tra due stringhe |
shuffle | false | Ordine casuale delle stringhe |
backDelay | 700 | Pausa prima di iniziare a cancellare (ms) |
fadeOut | false | Dissolvenza invece di cancellazione lettera per lettera |
fadeOutClass | ‘typed-fade-out’ | Classe CSS usata per il fadeOut |
fadeOutDelay | 500 | Durata dissolvenza (ms) |
loop | false | Ripete le stringhe all’infinito |
loopCount | Infinity | Numero di cicli se loop è true |
showCursor | true | Mostra il cursore lampeggiante |
cursorChar | ‘|’ | Carattere usato come cursore |
autoInsertCss | true | Inserisce automaticamente il CSS del cursore |
attr | null | Scrive nell’attributo specificato (es. ‘placeholder’, ‘value’) |
bindInputFocusEvents | false | Attiva/disattiva quando l’input ha focus |
contentType | ‘html’ | ‘html’ o ‘null’ per testo puro |
Esempio con opzioni avanzate
const typed = new Typed('#typed', {
strings: ['React Developer', 'Freelance', 'CyberAlchimista'],
typeSpeed: 60,
backSpeed: 40,
backDelay: 1500, // pausa di 1.5s prima di cancellare
startDelay: 500, // inizia dopo 500ms
smartBackspace: true, // cancella solo la parte che cambia
loop: true,
showCursor: true,
cursorChar: '_', // cursore personalizzato
});Scrivere in un placeholder
const typed = new Typed('#search-input', {
strings: ['Cerca un tutorial...', 'Cerca CSS animations...', 'Cerca JavaScript...'],
attr: 'placeholder',
loop: true,
typeSpeed: 50,
backSpeed: 30,
});Callbacks
Typed.js espone callback per reagire agli eventi dell’animazione.
const typed = new Typed('#typed', {
strings: ['Prima stringa', 'Seconda stringa'],
typeSpeed: 60,
loop: false,
onBegin: (arrayPos, self) => {
console.log('Animazione iniziata');
},
onComplete: (self) => {
console.log('Tutte le stringhe completate');
self.cursor.remove(); // rimuovi il cursore alla fine
},
onStringTyped: (arrayPos, self) => {
console.log(`Stringa ${arrayPos} completata`);
},
onLastStringBackspaced: (self) => {
console.log('Ultima stringa cancellata');
},
preStringTyped: (arrayPos, self) => {
console.log(`Sta per scrivere la stringa ${arrayPos}`);
},
});Accessibilità
L’effetto macchina da scrivere può creare problemi agli screen reader. Aggiungi aria-label sull’elemento contenitore per fornire un testo alternativo statico:
<h1 aria-label="Sono un developer freelance">
Sono <span id="typed" aria-hidden="true"></span>
</h1>L’aria-hidden="true" sull’elemento animato fa sì che lo screen reader legga solo il testo statico del contenitore, ignorando il testo che cambia continuamente.
Alternative a Typed.js — quando usarle
| Strumento | Peso | Quando usarlo |
|---|---|---|
| Typed.js | ~6KB | Hai bisogno di più stringhe, loop, callback, placeholder. Configurazione in 5 minuti. |
| CSS puro (@keyframes) | 0KB | Una sola stringa statica, nessuna dipendenza. Soluzione minima e performante. |
| Motion / Framer Motion | ~50KB | Sei già in un progetto React con animazioni complesse. Overkill per solo typewriter. |
| GSAP + TextPlugin | ~30KB | Hai già GSAP nel progetto e vuoi effetti avanzati (es. scramble, split text). |
| AutoAnimate | ~3KB | Vuoi animare inserimenti/rimozioni DOM, non testo che scorre. Use case diverso. |
Effetto macchina da scrivere con solo CSS (alternativa zero-JS)
Se hai una sola stringa e non hai bisogno di loop dinamico, questa è la soluzione più leggera:
.typewriter {
overflow: hidden;
white-space: nowrap;
border-right: 3px solid;
width: 0;
animation:
typing 2s steps(20) forwards,
cursor 0.6s step-end infinite;
}
@keyframes typing {
to { width: 100%; }
}
@keyframes cursor {
50% { border-color: transparent; }
}<p class="typewriter">CyberAlchimista.it</p>Controllo manuale — stop, start, destroy
const typed = new Typed('#typed', {
strings: ['Prima', 'Seconda'],
typeSpeed: 60,
loop: true,
});
// Ferma l'animazione
typed.stop();
// Riprendi
typed.start();
// Distruggi e rimuovi il cursore (utile nei componenti React/Vue)
typed.destroy();Hai trovato utile questo articolo? Seguimi su @cyberalchimista per altri tutorial e consigli sullo sviluppo web. Per domande o progetti, contattami.

