Selector CSS :empty: dar estilo a los elementos vacíos

Selector CSS :empty: dar estilo a los elementos vacíos

Casi siempre damos estilo a elementos que tienen contenido. ¿Y cuándo un elemento no tiene ni hijos ni texto? Fácil: para eso está el selector :empty.

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;
}

¿Qué se considera vacío?

La primera vez que me encontré con esto, no tenía nada claro qué considera esta pseudoclase realmente vacío. Quedémonos con la definición de MDN:

La pseudoclase CSS :empty representa cualquier elemento que no tiene hijos. Los hijos pueden ser nodos de elemento o texto (incluidos los espacios en blanco). Los comentarios, las instrucciones de procesamiento y el contenido generado por CSS no influyen en que un elemento se considere vacío.

:empty

Mientras no haya ni un espacio, el elemento está vacío.

html
<p></p>

Un comentario entre las dos etiquetas también cuenta como elemento vacío. Siempre que no haya ningún espacio.

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

No :empty

Los espacios en blanco cuentan como contenido. Incluso un salto de línea es un espacio en blanco, así que el elemento ya no está vacío. Insisto en esto porque yo mismo caí en la trampa.

html
<p> </p>

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

Tener un elemento hijo también cuenta como no vacío

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

Los espacios en blanco en la futura especificación

La buena noticia es que en Selectors Level 4 los espacios en blanco pasarán a considerarse vacío. Se comportará igual que :-moz-only-whitespace. Dicho de otro modo, esto se considerará vacío:

html
<p> </p>

PERO no lo uses todavía. Ahora mismo ningún navegador lo soporta.

Ejemplos de uso de :empty

Veamos algunos casos concretos en los que :empty resulta útil.

Usar :empty en el mensaje de error de un formulario

Este es el caso que me hizo descubrir :empty. Quería poner un icono delante del mensaje de error, pero el icono aparecía incluso cuando no había ningún mensaje. Con :empty el problema desaparece: el icono solo se añade cuando hay mensaje de error.

CSS

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

HTML

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

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

Resultado

Sin :empty

❌ Falta el email

Con :empty

❌ Falta el email

Usar :empty en las alertas

Otro ejemplo con :empty, esta vez para ocultar el estado vacío.

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

HTML

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

Resultado

Sin :empty

Mensaje de alerta

Con :empty

Mensaje de alerta

Compatibilidad con los navegadores

El soporte es excelente. Funciona en todos los navegadores hasta Internet Explorer 9

CSS

Damien Flandrin Desarrollador web desde 2010, creador de Gekkode y de Email Impact. Cada artículo se prueba en un proyecto real antes de publicarse. Contacto
Newsletter

Las nuevas pruebas, tutoriales y proyectos, por correo.

Pruebas reproducibles, código versionado, resultados fechados. Nunca spam.