1. O Que E Especificidade CSS
Especificidade CSS e o mecanismo que o navegador usa para decidir qual regra CSS se aplica a um elemento quando multiplas regras entram em conflito. Em vez de simplesmente aplicar a ultima regra encontrada, o CSS atribui um peso a cada seletor e aplica o de maior peso.
Entender especificidade e essencial para qualquer desenvolvedor front-end. Sem esse conhecimento, e facil se perder tentando sobrescrever estilos com !important ou adicionando seletores cada vez mais longos ate algo finalmente funcionar.
2. O Sistema de Pontuacao (a,b,c,d)
A especificidade e representada como quatro numeros separados por virgulas: (a, b, c, d). Cada posicao representa um tipo de seletor:
- a: 1 para estilos inline (style="..."), 0 caso contrario
- b: contagem de seletores de ID (#id)
- c: contagem de classes (.classe), atributos ([attr]) e pseudo-classes (:hover, :nth-child)
- d: contagem de elementos (div, p, a) e pseudo-elementos (::before, ::after)
A comparacao e feita da esquerda para direita. Um seletor com b=1 sempre vence sobre um seletor com b=0, independente de quantos elementos ou classes o segundo tenha.
3. Exemplos Praticos de Conflito
Considere estas duas regras:
#nav .item— especificidade (0,1,1,0)div ul li a.item— especificidade (0,0,1,4)
A primeira regra vence porque tem b=1 (um ID), enquanto a segunda tem b=0. Mesmo que a segunda tenha mais seletores de elemento, o ID sempre prevalece.
"Um ID sempre vence sobre qualquer quantidade de classes. Uma classe sempre vence sobre qualquer quantidade de elementos. Nunca misture IDs em seletores CSS reutilizaveis."
4. Especificidade e a Cascata CSS
A especificidade e apenas um dos fatores da cascata CSS. A ordem de resolucao e:
- Origem: estilos do user-agent, do usuario e do autor tem pesos diferentes
- Importancia: !important eleva qualquer regra acima das demais
- Especificidade: seletores mais especificos vencem
- Ordem de aparicao: em caso de empate, a ultima regra no CSS vence
5. Boas Praticas e Armadilhas Comuns
Para evitar problemas com especificidade em projetos maiores:
- Evite IDs em regras CSS — use-os apenas para JavaScript
- Mantenha seletores o mais simples e curtos possivel
- Evite !important — ele cria divida tecnica difcil de resolver
- Use metodologias como BEM para garantir baixa especificidade e previsibilidade
- Use :where() para aplicar estilos sem adicionar especificidade
6. Perguntas Frequentes
!important ignora a especificidade?
Sim. !important eleva a declaracao acima de toda a hierarquia de especificidade normal. Para sobrescrever um !important, voce precisa de outro !important com especificidade igual ou maior. Por isso e uma pratica a ser evitada.
:not() conta na especificidade?
O proprio :not() nao conta, mas o seletor dentro dele conta. Por exemplo, :not(.active) adiciona (0,0,1,0) pela classe .active — o mesmo que .active sozinho.
O seletor universal * tem especificidade?
Nao. O seletor universal * tem especificidade (0,0,0,0) e nao adiciona nenhum peso. Combinadores como >, +, ~ e espaco tambem nao adicionam especificidade.