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.