CSS-selector :empty: elementen zonder inhoud stylen

CSS-selector :empty: elementen zonder inhoud stylen

Meestal stylen we elementen die iets bevatten. Maar wat doe je met een element zonder kinderen of tekst? Simpel: daar gebruik je de selector :empty voor.

html
<p> </p>
<!-- Pas à cause de l'espace blanc -->

<p></p>
<!-- Vide car pas d'espace blanc -->
css
p::before {
font-family: 'FontAwesome';
content: 'f240';
}

p:empty::before {
content: 'f244';
}

p {
color: silver;
}

p:empty {
color: red;
}

Wat geldt als leeg?

Toen ik hier voor het eerst tegenaan liep, was me niet meteen duidelijk wat deze pseudo-klasse precies als leeg beschouwt. Ik houd daarom de definitie van MDN aan:

De CSS-pseudo-klasse :empty selecteert elk element dat geen kinderen heeft. Kinderen kunnen elementknopen of tekst zijn, inclusief witruimte. Commentaar, processing instructions en CSS-content tellen niet mee bij de vraag of een element leeg is.

:empty

Zolang er geen spatie in staat, is het element leeg.

html
<p></p>

Ook een element met alleen commentaar ertussen telt als leeg. Zolang er maar geen spatie staat.

html
<p><!-- comment --></p>

Niet :empty

Witruimte telt als inhoud. Ook een regeleinde is witruimte, dus dat element is niet leeg. Ik hamer erop, want ik maakte precies dezelfde fout.

html
<p> </p>

<p>
<!-- comment -->
</p>

Een kindelement telt eveneens als inhoud

html
<p><span></span></p>

Witruimte in de komende specificatie

Het goede nieuws: in Selectors Level 4 gaat witruimte wél als leeg tellen. De selector werkt dan net als :-moz-only-whitespace. Met andere woorden, dit geldt straks als leeg:

html
<p> </p>

MAAR gebruik het nog niet. Op dit moment ondersteunt geen enkele browser dit.

Voorbeelden met :empty

Hieronder een paar concrete gevallen waarin :empty zijn werk doet.

:empty gebruiken voor een foutmelding in een formulier

Dit is het voorbeeld waardoor ik :empty leerde kennen. Ik wilde een icoon voor mijn foutmelding zetten, maar dat icoon verscheen ook wanneer er helemaal geen foutmelding was. Geen probleem: met :empty zet ik het icoon er alleen bij als er echt een melding staat.

CSS

css
.error:before {
color: red;
content: '274c '; /* ❌ icoon */
}

HTML

html
<!-- Pas de message d'erreur -->
<div class="error"></div>

<!-- Oui, un message d'erreur -->
<div class="error">Email manquant</div>

Resultaat

Zonder empty

❌ Email manquant

Met :empty

❌ Email manquant

:empty gebruiken bij meldingen

Nog een voorbeeld waarin :empty de lege toestand verbergt.

css
.alert {
background: pink;
padding: 10px;
}
.alert:empty {
display: none;
}

HTML

html
<div class="alert"></div>
<div class="alert">Message d'alerte</div>

Resultaat

Zonder :empty

Message d’alerte

Met :empty

Message d’alerte

Browserondersteuning

De ondersteuning is eigenlijk uitstekend: alle browsers doen mee, tot en met Internet Explorer 9

CSS

Damien Flandrin Webdeveloper sinds 2010, maker van Gekkode en Email Impact. Elk artikel wordt vóór publicatie getest op een echt project. Contact
Nieuwsbrief

Nieuwe tests, tutorials en projecten, per e-mail.

Reproduceerbare tests, geversioneerde code, gedateerde resultaten. Nooit spam.