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
| Valore | Risultato |
|---|---|
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, -1 | riportati 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: 0 | visibility: hidden | display: none | |
|---|---|---|---|
| Occupa spazio | sì | sì | no |
| Riceve clic e focus | sì | no | no |
| Letto dagli screen reader | sì | no | no |
| Si può animare con transition | sì, in modo fluido | cambia a un'estremità, senza dissolvenza | no |
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. Aggiungivisibility: hidden, oppure usadisplay: none(pointer-events: noneblocca i clic ma non il focus da tastiera). - Scrivere
opacity: 50. L'opacità va da 0 a 1;50viene riportato a1. Scrivi0.5o50%. - 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.