Calculateur de spécificité des sélecteurs CSS
La spécificité CSS détermine quelle déclaration concurrente peut l’emporter avant l’ordre des sources et les autres règles de la cascade.
Lancer gratuitement
Ce calculateur accepte un sélecteur, valide sa structure et renvoie le décompte habituel en quatre parties : styles en ligne, ID, classes ou attributs ou pseudo-classes, puis types d’éléments ou pseudo-éléments. Il applique également les règles particulières des sélecteurs modernes tels que :is(), :not(), :has(), :where() et :nth-child(). Vous pouvez vous en servir pour expliquer une surcharge inattendue, comparer des sélecteurs lors d’une refactorisation ou intégrer un contrôle fiable à vos outils de développement.
Lire le résultat de spécificité en quatre parties
Le résultat est présenté sous la forme (en ligne, ID, classe, type). La première position représente les déclarations de style en ligne ; puisque cet outil reçoit un sélecteur et non un attribut style HTML, cette valeur reste toujours égale à zéro. La deuxième position compte les sélecteurs d’ID comme <code>#checkout</code>. La troisième regroupe les sélecteurs de classe, les sélecteurs d’attribut et les pseudo-classes : <code>.button</code>, <code>[disabled]</code> et <code>:hover</code> ajoutent donc chacun une unité. La quatrième compte les sélecteurs de type d’élément et les pseudo-éléments ; <code>button</code> et <code>::before</code> ajoutent chacun une unité. Les sélecteurs universels et les combinateurs n’ajoutent rien. Comparez le tuple de gauche à droite au lieu d’en faire une somme décimale : un ID dépasse n’importe quel nombre de classes, et une classe dépasse n’importe quel nombre de types. Les champs nommés facilitent l’exploitation dans du code, tandis que le tableau de spécificité conserve la représentation conventionnelle. La spécificité ne constitue toutefois qu’une partie de la cascade. L’origine, l’importance, les couches, la proximité de portée et l’ordre des sources peuvent encore désigner la déclaration gagnante sur une page réelle.
Comprendre les règles des pseudo-classes fonctionnelles
Les pseudo-classes fonctionnelles modernes ne se résument pas à compter chaque jeton. <code>:is()</code>, <code>:not()</code> et <code>:has()</code> apportent la spécificité du sélecteur le plus spécifique de leur liste d’arguments ; l’enveloppe elle-même n’ajoute aucun poids de classe. À l’inverse, <code>:where()</code> apporte toujours zéro, même si son argument contient un ID. Cette propriété rend <code>:where()</code> pratique pour les valeurs par défaut de bibliothèques qui doivent rester simples à surcharger. Les pseudo-classes structurelles <code>:nth-child()</code> et <code>:nth-last-child()</code> ajoutent une unité de pseudo-classe et, lorsqu’une liste facultative suit <code>of</code>, elles ajoutent aussi son membre le plus spécifique. Les autres pseudo-classes fonctionnelles comptent au niveau classe, tandis que les pseudo-éléments comptent au niveau type. L’analyseur reconnaît également les sélecteurs relatifs dans <code>:has()</code>, les caractères d’identifiant échappés, les valeurs d’attribut ponctuées, les espaces de noms et les anciennes formes à un seul deux-points <code>:before</code>, <code>:after</code>, <code>:first-line</code> et <code>:first-letter</code>. Ces distinctions correspondent au raisonnement des auteurs sur le CSS actuel, sans réduire les parenthèses à du texte opaque.
Détecter les erreurs grâce à la validation
Un indice de spécificité n’est utile que si l’entrée ressemble réellement à un sélecteur. Le calculateur refuse donc les champs manquants, le texte vide, les chaînes inachevées, les crochets ou parenthèses non fermés, les combinateurs mal formés, les identifiants absents après un point ou un croisillon et d’autres erreurs structurelles. Il accepte un seul sélecteur à la fois. Une virgule au niveau supérieur crée une liste dont les membres peuvent avoir des spécificités différentes ; cette entrée est donc rejetée avec une demande de sélecteur unique. Calculez chaque membre séparément lorsque vous comparez une liste de règles. La longueur d’entrée est bornée afin de garantir une exécution prévisible, et l’algorithme n’utilise ni session de navigateur, ni réseau, ni valeur aléatoire, ni horloge. Une entrée identique produit ainsi le même JSON dans le widget local, un appel API, une suite de tests ou un contrôle de build. Utilisez ce résultat comme diagnostic ciblé, puis examinez les couches de cascade, <code>!important</code>, l’héritage et l’ordre des sources si la spécificité n’explique pas à elle seule le style affiché.
Cas d’usage
Déboguer une surcharge tenace
Comparez des sélecteurs concurrents et repérez le composant qui permet à une règle d’en dépasser une autre.
Contrôler une refactorisation CSS
Vérifiez qu’un sélecteur simplifié réduit la spécificité sans introduire par mégarde un ID ou une pseudo-classe supplémentaire.
Enrichir les outils de développement
Ajoutez une validation déterministe et des décomptes structurés à un linter, un éditeur ou un rapport d’intégration continue.
Questions fréquentes
Que représente la valeur des styles en ligne ?
Elle représente les déclarations de style en ligne. Elle vaut toujours zéro ici, car l’entrée est un sélecteur CSS et non un attribut style HTML.
Est-ce que :where() augmente la spécificité ?
Non. :where() et la totalité de son argument apportent toujours zéro, même si la structure du sélecteur reste validée.
Comment :is(), :not() et :has() sont-ils comptés ?
Ils apportent la spécificité du sélecteur le plus spécifique de leur liste d’arguments ; la pseudo-classe fonctionnelle n’ajoute aucun poids propre.
Puis-je envoyer une liste séparée par des virgules ?
Non. Envoyez séparément chaque sélecteur de niveau supérieur, car les membres d’une liste peuvent avoir des spécificités différentes.
La spécificité la plus élevée gagne-t-elle toujours ?
Non. L’origine, l’importance, les couches, la proximité de portée et l’ordre des sources peuvent primer ou départager les règles.
Combien coûte une requête API ?
Chaque requête API coûte $0.002. La version pour navigateur peut fonctionner localement sans transmettre le sélecteur à un serveur.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre 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)Exemple de requête
{
"selector": "article#main.card[data-state='open']:hover > h2::before"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_specificity_calc",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_chars | 10000 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |