CSS ::before Pseudo-Elemento
Use o pseudo-elemento CSS ::before para adicionar conteúdo antes de um elemento. Leia sobre o pseudo-elemento e veja exemplos práticos.
O pseudo-elemento CSS ::before cria um elemento gerado que é inserido como o primeiro filho do elemento-alvo, antes do seu conteúdo real. É um dos dois pseudo-elementos de "conteúdo gerado" (o seu espelho é ::after), e é mais frequentemente utilizado para adicionar ícones decorativos, rótulos, contadores, aspas ou ornamentos visuais sem modificar o HTML.
Esta página aborda o que o ::before faz, a propriedade sem a qual ele não existe, exemplos executáveis, os padrões mais comuns no mundo real e os problemas de acessibilidade que você precisa conhecer.
Como funciona o ::before
Um pseudo-elemento ::before só é renderizado quando você também declara a propriedade content — esse valor é o que será inserido. Sem content, nada aparece (nem mesmo uma caixa vazia).
Comportamentos principais:
- Inline por padrão. Como um
<span>, ele fica inline com o texto ao redor até que você altere seudisplay(por exemplo, parainline-blockoublock). - É uma caixa real. Você pode estilizá-lo, animá-lo, posicioná-lo ou flutuá-lo como qualquer outro elemento, e ele herda os estilos do elemento ao qual pertence.
- Vem primeiro. O
::beforeé inserido antes do conteúdo do elemento; o::afteré inserido depois. Ambos ficam dentro do elemento, entre suas tags. - A sintaxe de dois pontos ainda funciona. A sintaxe legada
:before(um dois-pontos) é equivalente e era o que os navegadores muito antigos entendiam. O::beforecom dois pontos duplos é o padrão moderno que distingue pseudo-elementos de pseudo-classes — prefira-o.
Sintaxe
selector::before {
content: "value"; /* required */
/* other declarations */
}O valor de content pode ser uma string literal, uma imagem (url(...)), um valor de atributo (attr(...)) ou um contador (usado em conjunto com counter-increment). Para uma caixa puramente decorativa sem texto, use uma string vazia: content: "".
Exemplos
Inserir um rótulo de texto antes do conteúdo
Aqui o ::before adiciona uma string fixa antes de cada parágrafo:
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
p::before {
content: " William Shakespeare -";
}
</style>
</head>
<body>
<h2>::before selector example</h2>
<p>"Be or not to be".</p>
</body>
</html>O texto inserido "William Shakespeare -" aparece diretamente antes da citação, mesmo não existindo em nenhum lugar do HTML.
Estilizar a caixa gerada
Como o pseudo-elemento é uma caixa, você pode atribuir a ele um fundo, borda e valor de display assim como faria com um elemento normal:
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
p::before {
content: "William Shakespeare-";
display: inline-block;
background-color: #ccc;
color: #666;
border: 2px dotted #000;
}
</style>
</head>
<body>
<h2>::before selector example</h2>
<p>"Be or not to be".</p>
</body>
</html>Casos de uso comuns
O ::before se destaca sempre que você precisa de decoração que não pertence à marcação:
- Ícones e marcadores — adicione um símbolo (
content: "★") ou uma imagemurl()antes de links, itens de lista ou botões. - Marcadores de campo obrigatório — adicione um asterisco vermelho a rótulos:
label.required::before { content: "*"; color: red; }. - Aspas de abertura — envolva blockquotes com aspas tipográficas.
- Contadores — combine com
counter-incrementpara numerar seções automaticamente. - Extrair valores de atributos — exiba o atributo do próprio elemento com
attr():
abbr[title]::before {
content: attr(title) ": ";
font-weight: bold;
}Acessibilidade e pontos de atenção
contenté obrigatório. Se você esquecê-lo, o pseudo-elemento não será gerado.- Caixas decorativas precisam de
content: "". Para um elemento puramente visual (um divisor, um fundo de ícone) defina uma string vazia para que a caixa ainda seja renderizada. - O texto gerado não é selecionável e a maioria dos leitores de tela o ignora ou o lê de forma inconsistente. Nunca coloque informações que o usuário precisa ter (como instruções críticas) somente no
::before. - Não se aplica a elementos substituídos (
<img>,<input>,<br>, etc.). - O ponto de inserção importa. O
::beforeé o primeiro filho dentro do elemento — não antes da tag de abertura do elemento.
Para pseudo-elementos puramente decorativos, sempre defina content: '' para garantir que sejam renderizados corretamente em todos os navegadores.
Suporte a navegadores
O ::before é suportado em todos os navegadores modernos. A forma de um único dois-pontos (:before) também é amplamente suportada e era a sintaxe usada antes do CSS3, portanto, use-a apenas se precisar suportar navegadores muito antigos.
Referências relacionadas
::after— insere conteúdo após um elemento.content— a propriedade que define o que o::beforeinsere.counter-increment— cria numeração automática com conteúdo gerado.position— posiciona um elemento gerado com precisão.