CSS-Selektor-Spezifität berechnen
Die CSS-Spezifität bestimmt, welche konkurrierende Deklaration sich durchsetzen kann, bevor Quellreihenfolge und weitere Kaskadenregeln berücksichtigt werden.
Im Browser ausführen – kostenlos
Dieser Rechner nimmt einen Selektor entgegen, prüft seine Struktur und liefert die vertraute vierteilige Wertung: Inline-Stile, IDs, Klassen beziehungsweise Attribute oder Pseudoklassen sowie Elementtypen oder Pseudoelemente. Auch die Sonderregeln moderner Selektoren wie :is(), :not(), :has(), :where() und :nth-child() werden angewendet. Nutzen Sie das Werkzeug, um unerwartetes Überschreiben zu erklären, Selektoren bei einer Überarbeitung zu vergleichen oder Entwicklungswerkzeuge um eine zuverlässige Spezifitätsprüfung zu ergänzen.
Das vierteilige Spezifitätsergebnis lesen
Das Ergebnis wird als (Inline, ID, Klasse, Typ) ausgegeben. Die erste Position steht für Inline-Stildeklarationen. Da dieses Werkzeug einen Selektor und kein HTML-style-Attribut erhält, ist dieser Wert stets null. Die zweite Position zählt ID-Selektoren wie <code>#checkout</code>. Die dritte fasst Klassen- und Attributselektoren sowie Pseudoklassen zusammen; <code>.button</code>, <code>[disabled]</code> und <code>:hover</code> erhöhen sie jeweils um eins. Die vierte zählt Elementtypselektoren und Pseudoelemente, sodass <code>button</code> und <code>::before</code> ebenfalls je einen Punkt beitragen. Universalselektoren und Kombinatoren zählen nicht. Vergleichen Sie das Tupel von links nach rechts, statt seine Werte zu einer Dezimalzahl zu addieren: Eine ID übertrifft beliebig viele Klassen, eine Klasse beliebig viele Typen. Benannte Felder erleichtern die Verarbeitung im Code, während das Spezifitätsarray die übliche Darstellung bewahrt. Beachten Sie, dass Spezifität nur ein Teil der Kaskade ist. Ursprung, Wichtigkeit, Kaskadenebenen, Gültigkeitsnähe und Quellreihenfolge können auf einer echten Seite weiterhin bestimmen, welche Deklaration gewinnt.
Regeln funktionaler Pseudoklassen verstehen
Moderne funktionale Pseudoklassen lassen sich nicht durch bloßes Zählen aller Tokens bewerten. <code>:is()</code>, <code>:not()</code> und <code>:has()</code> übernehmen die Spezifität des stärksten Selektors ihrer Argumentliste; die umschließende Pseudoklasse fügt keinen Klassenwert hinzu. <code>:where()</code> liefert dagegen immer null, selbst wenn das Argument eine ID enthält. Dadurch eignet sich <code>:where()</code> für Bibliotheksvorgaben, die leicht überschreibbar bleiben sollen. Die strukturellen Pseudoklassen <code>:nth-child()</code> und <code>:nth-last-child()</code> zählen einmal auf Klassenebene. Eine optionale Selektorliste nach <code>of</code> steuert zusätzlich ihr stärkstes Mitglied bei. Andere funktionale Pseudoklassen zählen auf Klassenebene, Pseudoelemente auf Typebene. Der Parser erkennt außerdem relative Selektoren in <code>:has()</code>, maskierte Zeichen in Bezeichnern, Attributwerte mit Satzzeichen, Namensräume und die historischen Schreibweisen mit einem Doppelpunkt: <code>:before</code>, <code>:after</code>, <code>:first-line</code> und <code>:first-letter</code>. Diese Unterschiede entsprechen dem Umgang mit aktuellem CSS und behandeln Klammerinhalte nicht einfach als undurchsichtigen Text.
Selektorfehler durch Validierung erkennen
Ein Spezifitätswert ist nur sinnvoll, wenn die Eingabe ein plausibler Selektor ist. Der Rechner weist deshalb fehlende Felder, leeren Text, nicht abgeschlossene Zeichenketten, offene eckige oder runde Klammern, fehlerhafte Kombinatoren, fehlende Bezeichner nach Punkt oder Raute und weitere Strukturfehler zurück. Pro Aufruf wird ein Selektor akzeptiert. Ein Komma auf oberster Ebene erzeugt eine Selektorliste, deren Mitglieder unterschiedliche Spezifitäten besitzen können. Eine solche Eingabe wird mit dem Hinweis abgelehnt, jeweils einen Selektor zu übermitteln; berechnen Sie beim Vergleich einer Regelliste jedes Mitglied einzeln. Die Eingabelänge ist begrenzt, damit die Ausführung vorhersehbar bleibt. Der Algorithmus verwendet weder Browsersitzung noch Netzwerk, Zufallswert oder Uhrzeit. Identische Eingaben erzeugen daher im lokalen Widget, bei einem API-Aufruf, in Tests oder bei einer Build-Prüfung dasselbe JSON. Verwenden Sie das Ergebnis als gezielte Diagnose. Prüfen Sie anschließend Kaskadenebenen, <code>!important</code>, Vererbung und Quellreihenfolge, falls die Spezifität allein den dargestellten Stil nicht erklärt.
Anwendungsfälle
Hartnäckiges Überschreiben untersuchen
Vergleichen Sie konkurrierende Selektoren und erkennen Sie, welche Komponente einer Regel den Vorrang gibt.
Stylesheet-Überarbeitungen prüfen
Stellen Sie sicher, dass ein vereinfachter Selektor die Spezifität senkt, ohne versehentlich eine ID oder zusätzliches Pseudoklassengewicht einzuführen.
Entwicklungswerkzeuge erweitern
Ergänzen Sie Linter, Editor oder CI-Bericht um deterministische Validierung und strukturierte Spezifitätswerte.
Häufige Fragen
Was bedeutet der Inline-Wert?
Er steht für Inline-Stildeklarationen. Hier ist er immer null, weil die Eingabe ein CSS-Selektor und kein HTML-style-Attribut ist.
Erhöht :where() die Spezifität?
Nein. :where() und sein gesamtes Argument tragen stets null bei; die Selektorstruktur des Arguments wird dennoch geprüft.
Wie werden :is(), :not() und :has() gezählt?
Sie übernehmen die Spezifität des stärksten Selektors ihrer Argumentliste; die funktionale Pseudoklasse selbst fügt kein Gewicht hinzu.
Kann ich eine kommagetrennte Selektorliste senden?
Nein. Senden Sie jeden Selektor der obersten Ebene einzeln, da Listenmitglieder unterschiedliche Spezifitäten haben können.
Gewinnt die höhere Spezifität immer?
Nein. Ursprung, Wichtigkeit, Ebenen, Gültigkeitsnähe und Quellreihenfolge können Vorrang haben oder Gleichstände auflösen.
Was kostet ein API-Aufruf?
Jeder API-Aufruf kostet $0.002. Die Browserversion kann lokal ausgeführt werden, ohne den Selektor an einen Server zu senden.
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem 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)Beispiel-Anfrage
{
"selector": "article#main.card[data-state='open']:hover > h2::before"
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_specificity_calc",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Limits
max_chars | 10000 |
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |