Menu

CSS opacity: trasparenza di elementi, sfondi e dissolvenze

opacity rende trasparente un intero elemento e tutto ciò che contiene, da 0 (invisibile) a 1 (pieno). Impara i valori, perché opacity sbiadisce anche il testo e come rendere trasparente solo lo sfondo, opacity: 0 contro visibility e display, e le dissolvenze in hover.

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

Cosa fa opacity

opacity imposta quanto è trasparente un elemento: 1 è pieno (il valore predefinito), 0 è invisibile, e qualsiasi valore intermedio lascia trasparire lo sfondo. I riquadri qui sotto stanno su uno sfondo a strisce, così puoi vederlo:

L'ultimo riquadro c'è ancora: occupa il suo spazio di 90px nella riga, semplicemente non disegna niente. Nota che i numeri bianchi sbiadiscono insieme ai riquadri. opacity si applica all'elemento e a tutto ciò che contiene.

Sfondo trasparente, testo pieno

Siccome opacity sbiadisce anche i figli, è lo strumento sbagliato per "uno sfondo trasparente dietro un testo leggibile". Usa invece un colore di sfondo con canale alfa:

Entrambi i pannelli bianchi lasciano vedere le strisce nella stessa misura. Nel primo, il testo sbiadisce insieme al pannello. Nel secondo è trasparente solo il colore di sfondo (rgb(255 255 255 / 0.6), uguale a rgba(255, 255, 255, 0.6)), quindi il testo resta pieno e facile da leggere. I colori con alfa sono trattati nella pagina sui colori.

Un figlio non può sfuggire all'opacità del genitore: opacity: 1 sul figlio non fa niente, perché il genitore viene disegnato come un unico livello sbiadito con il figlio già dentro.

Valori

ValoreRisultato
1 o 100%del tutto opaco (predefinito)
0.5 o 50%trasparente a metà
0 o 0%del tutto trasparente, ancora nel layout e cliccabile
1.5, -1riportati a 1 e 0

L'opacità si eredita visivamente ma non come proprietà: l'opacity calcolata di un figlio resta 1, mentre viene disegnato dentro un genitore sbiadito.

opacity: 0 contro visibility: hidden contro display: none

Tutti e tre fanno sparire un elemento, ma differiscono in tutto il resto:

opacity: 0visibility: hiddendisplay: none
Occupa spaziosìsìno
Riceve clic e focussìnono
Letto dagli screen readersìnono
Si può animare con transitionsì, in modo fluidocambia a un'estremità, senza dissolvenzano

La differenza che fa danni è la seconda riga. Un pulsante a opacity: 0 si può ancora cliccare e raggiungere con Tab:

Il riquadro chiede al browser quale elemento si trova sotto un punto dentro ogni pulsante nascosto. Il pulsante con opacity: 0 risponde "clickable"; quello con visibility: hidden no. Il pulsante Visible comincia dopo due spazi vuoti da 150px, perché il pulsante con display: none è l'unico che ha restituito il suo spazio. Per far sparire qualcosa in dissolvenza e poi toglierlo, anima opacity e imposta visibility: hidden alla fine.

Dissolvenza in hover

opacity è una delle proprietà più leggere da animare, quindi è il modo standard per far apparire e sparire le cose in dissolvenza. Una didascalia che compare sopra un'immagine:

:focus-within mostra la didascalia anche a chi usa la tastiera. Tieni presente la tabella sopra: mentre è invisibile, la didascalia viene comunque letta dagli screen reader, ed è proprio ciò che vuoi per una didascalia.

Accessibilità: il testo sbiadito perde contrasto

Abbassare l'opacità abbassa il contrasto. Un testo grigio su bianco a opacity: 0.5 può scendere molto sotto il rapporto 4.5:1 richiesto per il testo normale. Per il testo secondario, scegli un colore che superi il controllo del contrasto invece di sbiadirne uno scuro. Per i controlli disabilitati, l'opacità ridotta è un segnale comune, ma abbinala all'attributo disabled, così il controllo è anche irraggiungibile da tastiera e annunciato come disabilitato.

Effetto collaterale: contesto di impilamento

Qualsiasi opacity sotto 1 crea un nuovo contesto di impilamento, come fa transform. I figli con uno z-index alto si impilano allora solo dentro l'elemento sbiadito e non possono salire sopra gli elementi esterni. Se un menu a tendina dentro un pannello sbiadito finisce sotto un altro elemento, il motivo è questo (la pagina su z-index spiega l'impilamento).

Errori comuni

  • Sbiadire una card per renderne trasparente lo sfondo. Sbiadisce anche il testo. Usa rgb(... / 0.5) sullo sfondo.
  • Cercare di rendere di nuovo opaco un figlio. L'opacità del genitore limita ogni figlio.
  • Nascondere solo con opacity: 0. L'elemento riceve ancora clic e focus. Aggiungi visibility: hidden, oppure usa display: none (pointer-events: none blocca i clic ma non il focus da tastiera).
  • Scrivere opacity: 50. L'opacità va da 0 a 1; 50 viene riportato a 1. Scrivi 0.5 o 50%.
  • Testo a basso contrasto per colpa dell'opacità. Controlla il contrasto del risultato, non del colore originale.

Domande frequenti

Cosa fa opacity in CSS?

Imposta quanto è trasparente un elemento, da 0 (del tutto trasparente) a 1 (del tutto opaco). Si applica all'intero elemento, compresi testo, bordo, immagini e ogni figlio, come un unico livello.

Come rendo trasparente solo lo sfondo e non il testo?

Lascia stare opacity e dai allo sfondo un colore con canale alfa: background-color: rgb(37 99 235 / 0.5); oppure rgba(37, 99, 235, 0.5). Il testo e i figli restano del tutto opachi.

Un elemento figlio può essere più opaco del genitore?

No. L'opacità del genitore si applica all'intero gruppo, quindi opacity: 1 su un figlio non può annullarla. Il figlio di un genitore a 0.5 viene disegnato al massimo a metà opacità. Sposta invece la trasparenza sul colore di sfondo del genitore.

Qual è la differenza tra opacity: 0, visibility: hidden e display: none?

opacity: 0 nasconde l'elemento, ma questo occupa ancora spazio, si può cliccare e viene letto dagli screen reader. visibility: hidden mantiene lo spazio ma non è cliccabile né letto. display: none lo toglie del tutto dal layout.

opacity può essere una percentuale?

Sì. opacity: 50% equivale a opacity: 0.5 in tutti i browser attuali. I valori sotto 0 o sopra 1 vengono riportati in quell'intervallo.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA