Calculadora de especificidade de seletor CSS
A especificidade do CSS determina qual declaração concorrente pode prevalecer antes da ordem no código e de outras regras da cascata.
Executar grátis
Esta calculadora recebe um seletor, valida sua estrutura e retorna a contagem conhecida em quatro partes: estilos inline, IDs, classes ou atributos ou pseudoclasses, e tipos de elemento ou pseudoelementos. Ela também aplica as regras especiais de seletores modernos como :is(), :not(), :has(), :where() e :nth-child(). Você pode usá-la para explicar uma sobrescrita inesperada, comparar seletores durante uma refatoração ou acrescentar uma verificação confiável às suas ferramentas de desenvolvimento.
Como interpretar o resultado em quatro partes
O resultado aparece como (inline, ID, classe, tipo). A primeira posição representa declarações de estilo inline; como esta ferramenta recebe um seletor, e não um atributo style de HTML, esse valor é sempre zero. A segunda posição conta seletores de ID, como <code>#checkout</code>. A terceira reúne seletores de classe, seletores de atributo e pseudoclasses; assim, <code>.button</code>, <code>[disabled]</code> e <code>:hover</code> acrescentam uma unidade cada. A quarta conta seletores de tipo de elemento e pseudoelementos, portanto <code>button</code> e <code>::before</code> também acrescentam uma unidade. Seletores universais e combinadores não alteram a contagem. Compare a tupla da esquerda para a direita, sem somá-la como um número decimal: um ID supera qualquer quantidade de classes, e uma classe supera qualquer quantidade de tipos. Os campos nomeados facilitam o uso em código, enquanto o array de especificidade preserva a representação convencional. Lembre-se de que a especificidade é apenas uma parte da cascata. Origem, importância, camadas, proximidade de escopo e ordem no código ainda podem determinar qual declaração vence em uma página real.
Regras das pseudoclasses funcionais
As pseudoclasses funcionais modernas exigem mais do que uma simples contagem de tokens. <code>:is()</code>, <code>:not()</code> e <code>:has()</code> contribuem com a especificidade do seletor mais específico da lista de argumentos; o invólucro não acrescenta peso de classe. Já <code>:where()</code> sempre contribui com zero, mesmo quando o argumento contém um ID. Isso torna <code>:where()</code> útil em padrões de bibliotecas que devem continuar fáceis de sobrescrever. As pseudoclasses estruturais <code>:nth-child()</code> e <code>:nth-last-child()</code> acrescentam uma contagem de pseudoclasse e, quando há uma lista opcional após <code>of</code>, também incorporam o membro mais específico. Outras pseudoclasses funcionais contam no nível de classe, enquanto pseudoelementos contam no nível de tipo. O analisador também reconhece seletores relativos dentro de <code>:has()</code>, caracteres escapados em identificadores, valores de atributo com pontuação, namespaces e as formas antigas com um único sinal de dois-pontos: <code>:before</code>, <code>:after</code>, <code>:first-line</code> e <code>:first-letter</code>. Essas distinções acompanham o modo como autores trabalham com CSS atual, sem tratar os parênteses como texto opaco.
Validação para encontrar erros no seletor
Uma pontuação de especificidade só é útil quando a entrada é um seletor plausível. Por isso, a calculadora rejeita campos ausentes, texto vazio, strings incompletas, colchetes ou parênteses sem fechamento, combinadores malformados, identificadores ausentes depois de ponto ou cerquilha e outros erros estruturais. Ela aceita um seletor por vez. Uma vírgula no nível superior cria uma lista cujos membros podem ter especificidades diferentes; essa entrada é recusada com a orientação de fornecer um único seletor. Calcule cada membro separadamente ao comparar uma lista de regras. O comprimento da entrada é limitado para manter a execução previsível, e o algoritmo não usa sessão de navegador, rede, valor aleatório nem relógio. Assim, entradas idênticas geram o mesmo JSON no widget local, em uma chamada de API, em testes ou em uma verificação de build. Use o resultado como diagnóstico específico: compare os seletores envolvidos e depois confira camadas da cascata, <code>!important</code>, herança e ordem no código se a especificidade não explicar sozinha o estilo renderizado.
Casos de uso
Depurar uma sobrescrita persistente
Compare seletores concorrentes e descubra qual componente faz uma regra superar a outra.
Revisar refatorações de folhas de estilo
Confirme que um seletor simplificado reduz a especificidade sem introduzir por engano um ID ou peso extra de pseudoclasse.
Aprimorar ferramentas de desenvolvimento
Adicione validação determinística e contagens estruturadas a um linter, editor ou relatório de integração contínua.
Perguntas frequentes
O que significa o valor inline?
Ele representa declarações de estilo inline. Aqui é sempre zero porque a entrada é um seletor CSS, não um atributo style de HTML.
:where() aumenta a especificidade?
Não. :where() e todo o seu argumento sempre contribuem com zero, embora a estrutura do seletor ainda seja validada.
Como :is(), :not() e :has() são contados?
Eles contribuem com a especificidade do seletor mais específico da lista de argumentos; a pseudoclasse funcional não acrescenta peso próprio.
Posso enviar uma lista de seletores separada por vírgulas?
Não. Envie cada seletor de nível superior separadamente, pois os membros da lista podem ter especificidades diferentes.
A maior especificidade sempre vence?
Não. Origem, importância, camadas, proximidade de escopo e ordem no código podem ter prioridade ou desempatar.
Quanto custa uma chamada de API?
Cada chamada de API custa US$ 0,002. A versão no navegador pode ser executada localmente sem enviar o seletor a um servidor.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/web/css-specificity-calc \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"selector":"article#main.card[data-state='\''open'\'']:hover > h2::before"}'const res = await fetch("https://api.kit.forhosting.com/web/css-specificity-calc", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"selector": "article#main.card[data-state='open']:hover > h2::before"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/css-specificity-calc",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"selector": "article#main.card[data-state='open']:hover > h2::before"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/css-specificity-calc", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"selector":"article#main.card[data-state=\'open\']:hover > h2::before"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"selector":"article#main.card[data-state='open']:hover > h2::before"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/css-specificity-calc", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"selector": "article#main.card[data-state='open']:hover > h2::before"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_specificity_calc",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_chars | 10000 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |