Spesso, vorremmo poter individuare (e dargli uno stile, magari) gli elementi in base al loro contenuto e non in base ai selettori “classici” quali classi, id, attributi, etc. Ma come facciamo ad individuare uno o più elementi che, ad esempio, non hanno figli oppure non contengono testo? Semplice, utilizzando il selettore :empty.
Partiamo da una piccola introduzione, che è più facile a farsi che a dirsi:
<p> </p><!-- questo NON è vuoto perché c'è uno spazio --> <p></p><!-- questo è vuoto -->
Capito che il contenuto deve essere assolutamente assente, passiamo a scrivere del CSS utilizzando :empty:
/* Diamo un colore al <p> in base al contenuto */
p {
color: silver;
}
p:empty {
color: red;
}Cos’è considerato vuoto?
Anche se prima ho cercato di semplificare, sulle prime la definizione di “vuoto” può essere fuorviante o comunque non del tutto chiara. Su Mozilla Developer Network la definizione è questa:
La pseudo-classe :empty rappresenta ogni elemento che non possiede figli. Un figlio può essere un elemento o un testo (inclusi gli spazi). Commenti, istruzioni e CSS non influenzano il selettore :empty e vengono ignorati.
Quindi, questo <p> è considerato vuoto perché non ha figli, né testo, né spazi, come abbiamo visto all’inizio:
<p></p>
I commenti, come da definizione, vengono ignorati e non contano per definire un elemento come vuoto:
<p><!-- questo è un commento, che viene ignorato! --></p>
Non vuoto
Gli spazi nel codice verranno considerati quindi come “una presenza” e quindi gli elementi che li contengono non verranno considerati vuoti. Quindi nessun daccapo, né spazio: state attenti, c’è da impazzire.
<p> </p> <p> <!-- commento --> </p>
Naturalmente, se un elemento contiene uno o più altri elementi, non sarà considerato vuoto:
<p><span></span></p>
Alcuni esempi
Ok, vediamo alcuni esempi nella real-life che utilizzano :empty:
/* nascondiamo tutti gli elementi vuoti nella pagina */
*:empty {
display: none;
}
/* nascondiamo tutti i <p> vuoti */
p:empty {
display: none;
}
/* selezioniamo tutte le voci del menu vuote */
nav a:empty {
display: none;
}
/* selezioniamo le celle vuote (di qualsiasi tabella) e gli impostiamo un colore di sfondo */
td:empty {
background-color: #ff0;
}Supporto del browser
Come possiamo vedere da Can I use, questo selettore è pienamente supportato da tutte le ultime versioni di Chrome, Firefox, Safari e Edge.