Menu

CSS transition: proprietà, durata, easing e ritardo

Una transition CSS anima una proprietà dal vecchio al nuovo valore quando cambia, per esempio in hover. Impara la forma abbreviata di transition, tutte le funzioni di timing fianco a fianco, cosa si può animare e cosa no, il trucco per height: auto e il movimento ridotto.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Una transition in un esempio

Una transition dice al browser: quando questa proprietà cambia, animala per questo tempo invece di cambiarla di colpo. Mettila nella regola normale dell'elemento, non solo in :hover:

Passa sopra il primo pulsante: il colore sfuma verso il verde e il pulsante sale di 4px in 0,4 secondi, e quando sposti il puntatore la stessa transizione si riproduce al contrario. Il secondo pulsante ha transition: none e cambia all'istante. Chi usa la tastiera ottiene lo stesso effetto tramite :focus-visible.

La forma abbreviata di transition

transition: background-color 0.3s ease-in-out 0.1s;
/*          property         duration timing    delay */
Proprietà estesaCosa impostaPredefinito
transition-propertyquali proprietà si animano (all, o un elenco)all
transition-durationquanto dura, in s o ms0s
transition-timing-functionla curva di velocitàease
transition-delayl'attesa prima di iniziare (può essere negativa)0s

La durata predefinita è 0s, ed è per questo che niente si anima finché non ne imposti una. Nella forma abbreviata, il primo tempo è sempre la durata e il secondo il ritardo. Per impostazioni diverse per ogni proprietà, separale con virgole:

.card {
  transition: transform 0.2s ease-out, box-shadow 0.4s ease-out;
}

Funzioni di timing fianco a fianco

La funzione di timing decide come cambia la velocità durante la transizione. Premi Play e tutte e sette le barre percorrono la stessa distanza negli stessi 1,5 secondi:

Funzione di timingSensazione
linearvelocità costante, meccanica
ease (predefinita)partenza rapida, arresto dolce
ease-inpartenza lenta, fine veloce: adatta a ciò che esce
ease-outpartenza veloce, fine lenta: adatta a ciò che arriva
ease-in-outlenta a entrambe le estremità
cubic-bezier(x1, y1, x2, y2)la tua curva; una y sopra 1 va oltre e poi torna indietro
steps(n)salta in n passi uguali, senza fotogrammi intermedi

Per effetti hover e menu, ease-out con una durata tra 150ms e 300ms dà una sensazione reattiva.

Cosa si può animare

Si possono animare le proprietà che hanno valori intermedi: colori, lunghezze (width, padding, margin), opacity, transform, box-shadow, border-radius, filter, background-color. Le proprietà che saltano tra parole chiave, come display o font-family, cambiano di colpo.

height: auto è il caso in cui si inciampa di più: un pannello che si apre da height: 0 a height: auto per impostazione predefinita non si anima, perché il browser non calcola i valori tra 0 e "auto". Una soluzione affidabile è un contenitore grid la cui unica riga va da 0fr a 1fr:

aria-expanded dice a chi usa uno screen reader se il pannello è aperto, cosa che l'animazione da sola non fa.

Eseguire codice quando una transition finisce

L'evento transitionend scatta quando una transizione finisce, una volta per ogni proprietà. Usalo per fare qualcosa dopo il movimento, come spostare il focus o rimuovere un elemento:

Rispetta il movimento ridotto

Alcune persone attivano "riduci movimento" nelle impostazioni di sistema perché il movimento sullo schermo dà loro le vertigini o le distrae. Mantieni le dissolvenze di colore e opacità, ed elimina i movimenti ampi, con una media query:

@media (prefers-reduced-motion: reduce) {
  .btn { transition: background-color 0.2s ease; } /* no movement, only the color */
}

Mantieni le transition fluide

transform e opacity sono le proprietà più leggere da animare: il browser può spostare e sfumare un elemento senza ricalcolare il layout. Animare width, height, top o margin costringe il browser a reimpaginare la pagina a ogni fotogramma, e sui telefoni lenti può scattare. Per spostare qualcosa, preferisci transform: translate() a left o margin. La pagina su transform tratta le funzioni.

Errori comuni

  • transition solo nella regola :hover. L'effetto si anima all'entrata ma torna indietro di scatto quando finisce l'hover. Metti transition nella regola di base.
  • Una durata senza unità. transition: opacity 300 non è valido. Scrivi 300ms o 0.3s.
  • transition: all. Anima ogni proprietà che cambia, comprese quelle che non volevi animare, e può rendere lenti i cambiamenti di layout. Elenca le proprietà.
  • Aspettarsi che display: none sfumi. display cambia di colpo. Sfuma invece opacity (e imposta visibility: hidden quando la dissolvenza finisce).
  • Transition verso height: auto. Salta di colpo. Usa la tecnica con grid-template-rows vista sopra.
  • Durate lunghe per piccole interazioni. Oltre circa 400ms su un pulsante o un menu, tutto sembra lento.

Domande frequenti

Come funzionano le transition CSS?

Dichiari su un elemento quali proprietà devono animarsi e per quanto tempo, per esempio transition: background-color 0.3s ease;. Quando il valore di quella proprietà cambia (con :hover, una classe o JavaScript), il browser anima dal vecchio valore al nuovo invece di cambiare di colpo.

In che ordine vanno i valori nella forma abbreviata di transition?

transition: property duration timing-function delay;, per esempio transition: opacity 0.3s ease-in 0.1s;. L'unica regola rigida è che il primo valore di tempo è la durata e il secondo il ritardo. Separa più transizioni con virgole.

Perché la mia transition CSS non funziona?

Cause comuni: la transition è solo nella regola :hover (quindi l'animazione funziona all'entrata e torna indietro di scatto), la proprietà non si può animare (display, o height verso auto), la durata non ha unità (0.3 invece di 0.3s), oppure il valore cambia nello stesso momento in cui l'elemento viene aggiunto alla pagina.

Si può fare una transition di height: auto?

Non con una semplice transition di height in tutti i browser: interpolare verso auto richiede la proprietà più recente interpolate-size, che non è ancora supportata ovunque. Le soluzioni comuni sono animare grid-template-rows da 0fr a 1fr su un contenitore grid, oppure animare max-height fino a un valore più grande del contenuto.

Qual è la differenza tra transition e animation in CSS?

Una transition si esegue una volta, tra due valori, quando una proprietà cambia. Un'animation usa @keyframes, può avere molti passaggi, parte da sola quando la pagina si carica e può ripetersi o andare in loop.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA