Animazione di apertura e chiusura della modale
Animi l’entrata e l’uscita della modale usando le utility di transizione di Tailwind insieme all’attivazione delle classi JavaScript per un’esperienza utente fluida.
Animazione di apertura e chiusura della modale è una lezione Tailwind CSS Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Tailwind CSS Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Tailwind CSS Academy include 4 lezioni in totale.
Perché animare i modali
Animare l'apertura e la chiusura di una modale ha uno scopo funzionale che va oltre l'estetica. Un'apparizione improvvisa può spaventare gli utenti; una dissolvenza in entrata fluida contestualizza l'arrivo della modale e aiuta gli utenti a capire da dove proviene. Un'animazione in uscita segnala che l'interazione è completata e che l'utente sta tornando alla pagina.
Le utility di transizione di Tailwind rendono semplice animare insieme opacità e scala, creando un raffinato effetto di dissolvenza e ridimensionamento, in linea con la qualità dei pattern nativi delle interfacce utente mobili.
Animazione di dissolvenza in entrata dello sfondo
Lo sfondo dovrebbe eseguire una dissolvenza in entrata quando la modale si apre e una dissolvenza in uscita quando si chiude. Aggiunga transition-opacity duration-300 all'elemento dello sfondo. Attivi e disattivi opacity-0 (nascosto) e opacity-100 (visibile) tramite JavaScript.
Lo sfondo deve rimanere nel DOM (senza usare hidden) affinché la dissolvenza funzioni; lo inizializzi invece come opacity-0 pointer-events-none e lo trasformi in opacity-100 pointer-events-auto.
<!-- Backdrop with fade -->
<div
id="backdrop"
onclick="closeModal()"
class="fixed inset-0 bg-black/50 z-40
transition-opacity duration-300
opacity-0 pointer-events-none">
</div>
<script>
function openModal() {
document.getElementById('backdrop').classList.remove('opacity-0', 'pointer-events-none');
document.getElementById('backdrop').classList.add('opacity-100', 'pointer-events-auto');
}
function closeModal() {
document.getElementById('backdrop').classList.remove('opacity-100', 'pointer-events-auto');
document.getElementById('backdrop').classList.add('opacity-0', 'pointer-events-none');
}
</script>Apertura della finestra con scala e dissolvenza
L'animazione di apertura più comune per una modale è una crescita con dissolvenza: la finestra di dialogo inizia leggermente più piccola e trasparente, quindi raggiunge la dimensione completa diventando opaca. Questo effetto riproduce il modo in cui appaiono le modali in iOS e Android.
Aggiunga transition-all duration-300 al pannello della finestra di dialogo. Passi da scale-95 opacity-0 (stato iniziale nascosto) a scale-100 opacity-100 (stato visibile). La breve durata di 300 ms mantiene l'animazione reattiva.
<!-- Dialog panel -->
<div
id="dialog"
class="bg-white rounded-2xl shadow-2xl w-full max-w-md
transition-all duration-300
scale-95 opacity-0 pointer-events-none">
<!-- content -->
</div>
<script>
function openModal() {
const d = document.getElementById('dialog');
d.classList.remove('scale-95', 'opacity-0', 'pointer-events-none');
d.classList.add('scale-100', 'opacity-100', 'pointer-events-auto');
}
function closeModal() {
const d = document.getElementById('dialog');
d.classList.remove('scale-100', 'opacity-100', 'pointer-events-auto');
d.classList.add('scale-95', 'opacity-0', 'pointer-events-none');
}
</script>Animazione di scorrimento verso l'alto per i pannelli mobili
Sui dispositivi mobili, un bottom sheet scorre dal fondo dello schermo invece di apparire al centro. Questa soluzione è più ergonomica per l'interazione con il pollice. Utilizzi fixed bottom-0 inset-x-0 per ancorare il pannello in basso e translate-y-full come stato iniziale nascosto, da trasformare in translate-y-0.
Aggiunga una maniglia di trascinamento (w-10 h-1 rounded-full bg-gray-300 mx-auto mt-3) in alto per indicare che è possibile eseguire uno swipe.
<div
id="sheet"
class="fixed bottom-0 inset-x-0 z-50 bg-white rounded-t-2xl shadow-2xl
transition-transform duration-300 ease-out
translate-y-full">
<!-- Drag handle -->
<div class="w-10 h-1 rounded-full bg-gray-300 mx-auto mt-3"></div>
<div class="px-6 py-5">
<h2 class="text-lg font-semibold text-gray-900">Share</h2>
<p class="mt-2 text-sm text-gray-600">Choose how you want to share this item.</p>
</div>
<div class="flex justify-end gap-3 px-6 pb-6">
<button onclick="closeSheet()" class="px-4 py-2 text-sm font-semibold border border-gray-300 rounded-lg">Cancel</button>
<button class="px-4 py-2 text-sm font-semibold text-white bg-blue-600 rounded-lg">Share</button>
</div>
</div>Funzioni di easing per animazioni fluide
La funzione temporale determina in che modo un'animazione accelera e rallenta. Tailwind offre quattro utility di easing: ease-linear, ease-in, ease-out e ease-in-out.
Per l'apertura delle modali, utilizzi ease-out: l'elemento parte velocemente e rallenta mentre raggiunge la posizione finale, creando una sensazione naturale e soddisfacente. Per la chiusura, utilizzi ease-in: l'elemento accelera mentre scompare, dando una sensazione intenzionale. ease-in-out funziona bene per transizioni reversibili, come le azioni di attivazione e disattivazione.
<!-- Entrance: fast start, slow end -->
<div class="transition-all duration-300 ease-out
scale-95 opacity-0">
Modal entering
</div>
<!-- Exit: slow start, fast end -->
<div class="transition-all duration-200 ease-in
scale-95 opacity-0">
Modal exiting
</div>Attendere il completamento dell'animazione in uscita
Un errore comune consiste nel rimuovere la modale dal DOM (o nasconderla con hidden) immediatamente quando viene avviata la chiusura. In questo modo si interrompe l'animazione in uscita. Attenda invece il completamento dell'animazione utilizzando l'evento transitionend prima di nascondere l'elemento.
Ascolti l'evento con { once: true }, così il gestore viene eseguito una sola volta per transizione e non si accumula. Dopo la transizione, aggiunga hidden o pointer-events-none per impedire l'interazione dell'utente con l'elemento invisibile.
<script>
function closeModal() {
const dialog = document.getElementById('dialog');
const backdrop = document.getElementById('backdrop');
// Start exit animation
dialog.classList.remove('scale-100', 'opacity-100');
dialog.classList.add('scale-95', 'opacity-0');
backdrop.classList.remove('opacity-100');
backdrop.classList.add('opacity-0');
// Wait for animation to finish, then hide
dialog.addEventListener('transitionend', () => {
dialog.classList.add('pointer-events-none');
backdrop.classList.add('pointer-events-none');
document.body.classList.remove('overflow-hidden');
}, { once: true });
}
</script>Animazione a cascata per sfondo e finestra di dialogo
Aprire lo sfondo e la finestra di dialogo esattamente nello stesso momento può risultare brusco. Un'animazione a cascata apre prima lo sfondo e poi la finestra di dialogo una frazione di secondo più tardi, creando un effetto di rivelazione a livelli.
Ottenga questo risultato aggiungendo una classe delay-100 all'elemento della finestra di dialogo, in modo che la sua transizione inizi 100 ms dopo quella dello sfondo. Rimuova il ritardo durante la sequenza di chiusura per mantenerla rapida.
<!-- Backdrop: starts immediately -->
<div id="backdrop"
class="fixed inset-0 bg-black/50 z-40
transition-opacity duration-300
opacity-0 pointer-events-none">
</div>
<!-- Dialog: starts 100ms after backdrop -->
<div id="dialog"
class="bg-white rounded-2xl shadow-2xl w-full max-w-md
transition-all duration-300 delay-100
scale-90 opacity-0 pointer-events-none">
<!-- content -->
</div>
<!-- On open: add opacity-100 to backdrop, then scale-100/opacity-100 to dialog (delay-100 handles the stagger) -->
<!-- On close: remove delay-100 from dialog before starting the exit --></i>Modale di avviso con zoom in entrata
Per gli avvisi critici (errori e conferme di azioni distruttive), un effetto di zoom in entrata attira maggiormente l'attenzione rispetto a una crescita delicata. Inizi la finestra di dialogo con scale-50 e animi il passaggio a scale-100 con un rapido duration-150, per un ingresso scattante che catturi l'attenzione.
Utilizzi questo effetto con moderazione: esagerare con le animazioni spettacolari desensibilizza gli utenti. Riservi lo zoom in entrata ai messaggi realmente importanti, quando è necessaria la completa attenzione dell'utente.
<!-- Zoom-in alert -->
<div
id="alert-dialog"
class="bg-white rounded-2xl shadow-2xl w-full max-w-sm
transition-all duration-150 ease-out
scale-50 opacity-0">
<div class="p-6 text-center">
<div class="mx-auto w-14 h-14 rounded-full bg-red-100 flex items-center justify-center">
<svg class="w-7 h-7 text-red-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
</svg>
</div>
<h2 class="mt-4 text-lg font-bold text-gray-900">Critical Error</h2>
<p class="mt-2 text-sm text-gray-500">Your session has expired. Please log in again.</p>
<button class="mt-5 w-full py-2.5 bg-blue-600 text-white font-semibold rounded-lg">Sign In Again</button>
</div>
</div>Animare con classi CSS o stili inline
Per animare una modale in Tailwind esistono due approcci: il cambio delle classi (che abbiamo utilizzato finora) e la modifica degli stili inline tramite JavaScript. Il cambio delle classi è l'approccio tipico di Tailwind: mantiene chiaramente separati gli stili nelle classi HTML e il comportamento in JavaScript.
La modifica degli stili inline (element.style.opacity = '0') contraddice l'approccio utility-first e rende più difficile verificare gli stili. Si attenga al cambio delle classi, a meno che non siano necessari valori dinamici non predeterminabili, come posizioni animate basate sulle coordinate dell'interazione dell'utente.
// Class toggling (Tailwind approach) — preferred
function openModal() {
dialog.classList.remove('scale-95', 'opacity-0');
dialog.classList.add('scale-100', 'opacity-100');
}
// Inline style approach — avoid unless necessary
function openModalInline() {
dialog.style.transform = 'scale(1)';
dialog.style.opacity = '1';
// Hard to maintain, not visible in HTML
}Rispettare le preferenze per la riduzione del movimento
Alcuni utenti soffrono di cinetosi a causa delle animazioni dell'interfaccia. Sia CSS sia Tailwind rispettano la media query prefers-reduced-motion. Utilizzi motion-reduce:transition-none e motion-reduce:transform-none sugli elementi animati per disabilitare le transizioni per gli utenti che hanno richiesto la riduzione del movimento nelle impostazioni del sistema operativo.
Si tratta di un requisito di accessibilità spesso trascurato. L'aggiunta di queste utility garantisce che le modali animate non causino disagio né attivino problemi di sensibilità al movimento.
<div
id="dialog"
class="bg-white rounded-2xl shadow-2xl w-full max-w-md
transition-all duration-300 ease-out
motion-reduce:transition-none
scale-95 opacity-0">
<!-- dialog content -->
</div>Animazione delle notifiche toast
Una notifica toast è un messaggio temporaneo e non bloccante che scorre da un angolo superiore o inferiore dello schermo. Utilizzi fixed bottom-4 right-4 z-50 per il posizionamento e la animi inizialmente con translate-y-2 opacity-0, facendola passare a translate-y-0 opacity-100.
Chiuda automaticamente la toast dopo alcuni secondi utilizzando setTimeout. transition-all duration-300 di Tailwind gestisce in modo fluido sia l'ingresso sia la dissolvenza automatica in uscita.
<!-- Toast element -->
<div
id="toast"
class="fixed bottom-4 right-4 z-50
flex items-center gap-3 px-4 py-3 bg-gray-900 text-white text-sm rounded-xl shadow-xl
transition-all duration-300
translate-y-2 opacity-0 pointer-events-none">
<svg class="w-4 h-4 text-green-400" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
</svg>
Changes saved successfully!
</div>
<script>
function showToast() {
const t = document.getElementById('toast');
t.classList.remove('translate-y-2', 'opacity-0', 'pointer-events-none');
t.classList.add('translate-y-0', 'opacity-100');
setTimeout(() => {
t.classList.remove('translate-y-0', 'opacity-100');
t.classList.add('translate-y-2', 'opacity-0', 'pointer-events-none');
}, 3000);
}
</script>Verifica rapida
Verifichi la comprensione dei concetti di Tailwind CSS Mastery presentati in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato che: le animazioni delle modali funzionano alternando le classi utility di opacità e scala (scale-95 opacity-0 e scale-100 opacity-100) con transition-all duration-300; le animazioni in uscita richiedono di attendere transitionend prima di nascondere l'elemento; e l'accessibilità del movimento viene gestita con motion-reduce:transition-none per rispettare l'impostazione del sistema operativo prefers-reduced-motion. Ora passeremo ai menu a discesa.
Impara HTML con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Animazione di apertura e chiusura della modale» è gratuita?
Sì — il testo completo di «Animazione di apertura e chiusura della modale» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Tailwind CSS Academy, passa a CoddyKit PRO. Il corso Tailwind CSS Academy include 4 lezioni in totale.
Cosa imparerò in «Animazione di apertura e chiusura della modale»?
Animi l’entrata e l’uscita della modale usando le utility di transizione di Tailwind insieme all’attivazione delle classi JavaScript per un’esperienza utente fluida. Eserciti Tailwind CSS Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Tailwind CSS Academy?
Non è richiesta alcuna esperienza precedente. Tailwind CSS Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Animazione di apertura e chiusura della modale»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Tailwind CSS Academy?
Sì. Ogni lezione Tailwind CSS Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Struttura di una finestra modale
- Animazione di apertura e chiusura della modale
- Componente menu a discesa
- Modali e menu a discesa accessibili