Ordenar seletores CSS por especificidade
A especificidade CSS define qual declaração concorrente pode prevalecer antes que a ordem no código e a importância sejam consideradas, mas comparar uma lista extensa de seletores visualmente é demorado e sujeito a erros.
Executar grátis
Esta ferramenta recebe seletores CSS individuais, valida a sintaxe, calcula o valor de especificidade em três partes e devolve toda a lista em ordem crescente. Ela entende pseudoclasses funcionais modernas, como :is(), :not(), :has(), :where() e :nth-child(), e preserva a ordem original quando dois seletores têm o mesmo peso.
Entenda a pontuação de especificidade em três partes
Cada resultado usa a estrutura conhecida de ID, classes e tipos. O primeiro número conta seletores de ID, como <code>#checkout</code>. O segundo conta classes, seletores de atributo e pseudoclasses, como <code>.active</code>, <code>[disabled]</code> e <code>:hover</code>. O terceiro conta seletores de tipo e pseudoelementos, como <code>button</code> e <code>::before</code>. Seletores universais e combinadores não acrescentam pontos. A comparação é lexicográfica: um ID supera qualquer quantidade de itens nas outras colunas, e uma classe supera qualquer quantidade de seletores de tipo quando as contagens de ID são iguais. O array <code>specificity</code> é conveniente para software, enquanto <code>specificity_text</code> mostra o mesmo valor em um formato compacto e legível. Os resultados ficam em ordem crescente, colocando primeiro as regras amplamente reutilizáveis e por último os seletores mais difíceis de sobrescrever. Se duas pontuações forem idênticas, a ferramenta mantém a ordem de entrada em vez de criar um desempate alfabético. Esse comportamento estável torna execuções repetidas previsíveis e preserva o contexto útil de uma folha de estilos ou lista de revisão.
Trate corretamente as pseudoclasses modernas
Pseudoclasses funcionais são o ponto em que cálculos manuais mais costumam falhar. <code>:where()</code> sempre contribui com especificidade zero, inclusive para os seletores internos, permitindo detalhar a estrutura sem tornar uma regra mais difícil de sobrescrever. Já <code>:is()</code>, <code>:not()</code> e <code>:has()</code> contribuem com a especificidade do argumento mais específico, sem acrescentar um ponto próprio de pseudoclasse. As formas <code>:nth-child()</code> e <code>:nth-last-child()</code> somam um ponto de pseudoclasse e a maior especificidade de uma lista opcional após <code>of</code>. Formas da árvore de sombra, como <code>:host()</code> e <code>::slotted()</code>, também são consideradas. O analisador percorre parênteses aninhados, colchetes, strings entre aspas e escapes; assim, vírgulas dentro de uma função não são confundidas com separadores no nível superior. Envie cada item da lista como um único seletor. Uma vírgula no nível superior representaria vários seletores com pontuações possivelmente diferentes e, portanto, é rejeitada em vez de ser reduzida a um valor único enganoso. Essa regra explícita mantém a correspondência exata entre cada entrada e uma pontuação de saída.
Use a lista ordenada para simplificar a cascata
Um relatório de especificidade é mais útil para orientar uma refatoração do que para incentivar seletores mais fortes. Cole seletores representativos de um componente, design system ou arquivo legado e examine o final da lista. Saltos grandes geralmente revelam IDs, estados excessivamente qualificados ou um argumento poderoso escondido em <code>:is()</code> ou <code>:not()</code>. Esses seletores podem obrigar o código posterior a repetir detalhes estruturais apenas para sobrescrever uma declaração. Considere substituí-los por uma classe com finalidade única, reduzir contexto opcional com <code>:where()</code> ou organizar camadas para que a precedência não dependa de pontuações cada vez maiores. O início da lista também é útil: regras de elementos e utilitários leves são mais fáceis de reutilizar quando sua função está clara. Processos automatizados podem chamar a API por US$ 0,002 para sinalizar seletores novos acima do limite definido pela equipe, registrar a especificidade junto ao CSS gerado ou apresentar diagnósticos ordenados durante a revisão. Uma entrada inválida interrompe toda a solicitação, garantindo que um relatório parcial não esconda um seletor malformado. O cálculo é determinístico e não acessa a rede; entradas idênticas sempre geram os mesmos valores e a mesma ordem.
Casos de uso
Auditar uma folha de estilos legada
Ordene os seletores por peso para encontrar IDs e regras muito qualificadas que dificultam sobrescritas comuns.
Revisar o CSS de componentes
Compare seletores novos com as convenções existentes antes de incorporar uma alteração ao design system compartilhado.
Aplicar um orçamento de especificidade
Calcule pontuações em uma verificação automática e sinalize seletores acima do máximo escolhido pela sua equipe.
Perguntas frequentes
O que significa cada número de especificidade?
Os três valores contam seletores de ID, seletores semelhantes a classes e seletores semelhantes a tipos, respectivamente, e são comparados da esquerda para a direita.
Como :where() é contabilizada?
:where() e tudo dentro do seu argumento contribuem com especificidade zero, embora a sintaxe do seletor continue sendo validada.
Como :is(), :not() e :has() são contabilizadas?
Cada uma contribui com a especificidade do seletor mais específico da lista de argumentos, sem um ponto adicional de pseudoclasse.
Um item de entrada pode conter vírgulas?
Não no nível superior. Envie cada seletor separadamente, pois os membros de uma lista podem ter especificidades diferentes. Vírgulas dentro de pseudoclasses funcionais compatíveis são aceitas.
O que acontece quando dois seletores têm a mesma especificidade?
A ordem original de entrada é mantida, tornando a classificação estável e determinística.
Quanto custa a solicitação pela API?
Cada solicitação custa US$ 0,002. A versão para navegador é executada localmente sem cobrança.
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-sort \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"selectors":["button",".toolbar button:hover","#app .toolbar button"]}'const res = await fetch("https://api.kit.forhosting.com/web/css-specificity-sort", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"selectors": [
"button",
".toolbar button:hover",
"#app .toolbar button"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/css-specificity-sort",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"selectors": [
"button",
".toolbar button:hover",
"#app .toolbar button"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/css-specificity-sort", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"selectors":["button",".toolbar button:hover","#app .toolbar button"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"selectors":["button",".toolbar button:hover","#app .toolbar button"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/css-specificity-sort", 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
{
"selectors": [
"button",
".toolbar button:hover",
"#app .toolbar button"
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_specificity_sort",
"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_items | 1000 |
max_selector_length | 4096 |
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. |