Seletor CSS :empty: dar estilo aos elementos vazios

Seletor CSS :empty: dar estilo aos elementos vazios

Na maior parte do tempo damos estilo a elementos que contêm alguma coisa. E quando um elemento não tem filhos nem texto? É simples, podes usar o seletor :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;
}

O que conta como vazio?

Quando dei de caras com isto pela primeira vez, havia alguma confusão sobre o que este seletor considera vazio. Fiquemos pela definição da MDN:

A pseudo-classe CSS :empty representa qualquer elemento que não tenha filhos. Os filhos podem ser nós de elementos ou texto (incluindo espaços em branco). Os comentários, as instruções de processamento e o conteúdo gerado por CSS não influenciam se um elemento é ou não considerado vazio.

:empty

Desde que não haja espaço em branco, o elemento está vazio.

html
<p></p>

Um comentário pelo meio continua a contar como elemento vazio. Desde que não haja espaço em branco.

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

Não :empty

O espaço em branco conta como não vazio. Até uma nova linha é espaço em branco, portanto: não vazio! Insisto neste ponto porque cometi o mesmo erro.

html
<p> </p>

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

Ter um elemento filho também conta como não vazio

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

O espaço em branco na futura especificação

A boa notícia é que nos Selectors Level 4 o espaço em branco vai contar como vazio. Isso fará com que se comporte como :-moz-only-whitespace. Por outras palavras, isto passará a ser considerado vazio:

html
<p> </p>

MAS ainda não contes com isso. Nenhum browser o suporta atualmente.

Exemplos de utilização do :empty

Vejamos alguns usos concretos do :empty.

Usar o :empty numa mensagem de erro de formulário

Foi este o exemplo que me fez descobrir o :empty. Queria um ícone antes da minha mensagem de erro. O problema é que o ícone aparecia mesmo quando não havia mensagem nenhuma. Sem problema: basta usar o :empty para acrescentar o ícone apenas quando há mesmo uma mensagem.

CSS

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

HTML

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

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

Resultado

Sem empty

❌ Email manquant

Com :empty

❌ Email manquant

Usar o :empty nos alertas

Aqui fica outro exemplo, com o :empty a esconder o estado vazio.

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

HTML

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

Resultado

Sem :empty

Message d’alerte

Com :empty

Message d’alerte

Suporte dos browsers

O suporte é na verdade muito bom. Funciona em todos os browsers até ao Internet Explorer 9

CSS

Damien Flandrin Programador web desde 2010, criador da Gekkode e do Email Impact. Cada artigo é testado num projeto real antes de ser publicado. Contacto
Newsletter

Os novos testes, tutoriais e projetos, por e-mail.

Testes reproduzíveis, código versionado, resultados datados. Nunca spam.