Calcolatore di specificità dei selettori CSS
La specificità CSS stabilisce quale dichiarazione concorrente può prevalere prima dell’ordine nel sorgente e delle altre regole della cascata.
Esegui gratis nel browser
Questo calcolatore accetta un selettore, ne convalida la struttura e restituisce il consueto conteggio in quattro parti: stili inline, ID, classi o attributi o pseudoclassi, e tipi di elemento o pseudoelementi. Applica inoltre le regole speciali dei selettori moderni come :is(), :not(), :has(), :where() e :nth-child(). Lei può usarlo per spiegare una sovrascrittura inattesa, confrontare selettori durante un refactoring o aggiungere un controllo affidabile ai Suoi strumenti di sviluppo.
Come leggere il risultato in quattro parti
Il risultato è espresso come (inline, ID, classe, tipo). La prima posizione rappresenta le dichiarazioni di stile inline; poiché lo strumento riceve un selettore e non un attributo style HTML, questo valore è sempre zero. La seconda posizione conta i selettori ID come <code>#checkout</code>. La terza riunisce selettori di classe, selettori di attributo e pseudoclassi, quindi <code>.button</code>, <code>[disabled]</code> e <code>:hover</code> aggiungono un’unità ciascuno. La quarta conta i selettori del tipo di elemento e gli pseudoelementi: <code>button</code> e <code>::before</code> aggiungono entrambi un’unità. I selettori universali e i combinatori non aggiungono nulla. Confronti la tupla da sinistra a destra, senza sommarla come numero decimale: un ID supera qualsiasi quantità di classi e una classe supera qualsiasi quantità di tipi. I campi denominati facilitano l’uso nel codice, mentre l’array di specificità conserva la forma visiva convenzionale. Ricordi che la specificità è soltanto una parte della cascata. Origine, importanza, livelli, prossimità dell’ambito e ordine nel sorgente possono ancora determinare quale dichiarazione prevale in una pagina reale.
Le regole delle pseudoclassi funzionali
Le pseudoclassi funzionali moderne richiedono più del semplice conteggio di ogni token. <code>:is()</code>, <code>:not()</code> e <code>:has()</code> contribuiscono con la specificità del selettore più specifico nella lista degli argomenti; l’involucro non aggiunge peso di classe. Al contrario, <code>:where()</code> contribuisce sempre con zero, anche se l’argomento contiene un ID. Ciò rende <code>:where()</code> utile per le impostazioni predefinite delle librerie che devono restare facili da sovrascrivere. Le pseudoclassi strutturali <code>:nth-child()</code> e <code>:nth-last-child()</code> aggiungono una pseudoclasse e, quando è presente una lista facoltativa dopo <code>of</code>, aggiungono anche il suo membro più specifico. Le altre pseudoclassi funzionali contano a livello di classe, mentre gli pseudoelementi contano a livello di tipo. Il parser riconosce inoltre selettori relativi dentro <code>:has()</code>, caratteri di identificatore con escape, valori di attributo con punteggiatura, namespace e le forme storiche con un solo due punti <code>:before</code>, <code>:after</code>, <code>:first-line</code> e <code>:first-letter</code>. Queste distinzioni rispecchiano il modo in cui gli autori ragionano sul CSS attuale, anziché trattare le parentesi come testo opaco.
Individuare gli errori con la convalida
Un valore di specificità è utile solo quando l’input è un selettore plausibile. Il calcolatore rifiuta quindi campi mancanti, testo vuoto, stringhe incomplete, parentesi tonde o quadre non chiuse, combinatori malformati, identificatori mancanti dopo un punto o un cancelletto e altri errori strutturali. Accetta un selettore alla volta. Una virgola al livello superiore crea una lista i cui membri possono avere specificità diverse; tale input viene rifiutato chiedendo un solo selettore. Calcoli separatamente ogni membro quando confronta una lista di regole. La lunghezza è limitata per mantenere prevedibile l’esecuzione e l’algoritmo non usa sessioni del browser, rete, valori casuali né orologio. Input identici producono così lo stesso JSON nel widget locale, in una chiamata API, in una suite di test o in un controllo di build. Usi il risultato come diagnosi mirata: confronti i selettori coinvolti, quindi esamini i livelli della cascata, <code>!important</code>, l’ereditarietà e l’ordine nel sorgente se la sola specificità non spiega lo stile visualizzato.
Casi d'uso
Analizzare una sovrascrittura ostinata
Confronti selettori concorrenti e individui quale componente consente a una regola di superarne un’altra.
Verificare un refactoring dei fogli di stile
Controlli che un selettore semplificato riduca la specificità senza introdurre accidentalmente un ID o una pseudoclasse aggiuntiva.
Potenziare gli strumenti di sviluppo
Aggiunga convalida deterministica e conteggi strutturati a un linter, un editor o un rapporto di integrazione continua.
Domande frequenti
Che cosa indica il valore inline?
Rappresenta le dichiarazioni di stile inline. Qui è sempre zero perché l’input è un selettore CSS, non un attributo style HTML.
:where() aumenta la specificità?
No. :where() e tutto il suo argomento contribuiscono sempre con zero, anche se la struttura del selettore viene comunque convalidata.
Come vengono conteggiati :is(), :not() e :has()?
Contribuiscono con la specificità del selettore più specifico nella lista degli argomenti; la pseudoclasse funzionale non aggiunge peso proprio.
Posso inviare una lista separata da virgole?
No. Invii separatamente ogni selettore di livello superiore, perché i membri di una lista possono avere specificità diverse.
La specificità più alta vince sempre?
No. Origine, importanza, livelli, prossimità dell’ambito e ordine nel sorgente possono avere precedenza o risolvere i pareggi.
Quanto costa una richiesta API?
Ogni richiesta API costa $0.002. La versione nel browser può essere eseguita localmente senza inviare il selettore a un server.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo stack
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)Esempio di richiesta
{
"selector": "article#main.card[data-state='open']:hover > h2::before"
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_specificity_calc",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_chars | 10000 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |