CSS-Selektoren nach Spezifität sortieren
Die CSS-Spezifität entscheidet, welche von mehreren konkurrierenden Deklarationen sich durchsetzen kann, bevor Quellreihenfolge und Wichtigkeit berücksichtigt werden.
Im Browser ausführen – kostenlos
Eine lange Selektorliste von Hand zu vergleichen, ist jedoch langsam und fehleranfällig. Dieses Werkzeug nimmt einzelne CSS-Selektoren entgegen, prüft deren Syntax, berechnet jeweils den dreiteiligen Spezifitätswert und gibt die gesamte Liste vom niedrigsten bis zum höchsten Wert sortiert zurück. Moderne funktionale Pseudoklassen wie :is(), :not(), :has(), :where() und :nth-child() werden berücksichtigt; bei gleichem Gewicht bleibt die ursprüngliche Reihenfolge erhalten.
Den dreiteiligen Spezifitätswert richtig lesen
Jedes Ergebnis verwendet die übliche Gliederung in IDs, Klassen und Typen. Die erste Zahl zählt ID-Selektoren wie <code>#checkout</code>. Die zweite Zahl umfasst Klassen, Attributselektoren und Pseudoklassen wie <code>.active</code>, <code>[disabled]</code> und <code>:hover</code>. Die dritte zählt Typselektoren und Pseudoelemente wie <code>button</code> und <code>::before</code>. Universalselektoren und Kombinatoren erhöhen den Wert nicht. Verglichen wird lexikografisch: Eine einzelne ID wiegt schwerer als beliebig viele Einträge in den anderen Spalten; bei gleicher ID-Anzahl überwiegt eine Klasse beliebig viele Typselektoren. Das Array <code>specificity</code> lässt sich bequem programmatisch verarbeiten, während <code>specificity_text</code> denselben Wert kompakt und lesbar darstellt. Die aufsteigende Ausgabe setzt breit wiederverwendbare Regeln an den Anfang und besonders schwer zu überschreibende Selektoren ans Ende. Stimmen zwei Werte vollständig überein, behält das Werkzeug ihre Eingabereihenfolge bei, statt eine zusätzliche alphabetische Sortierung zu erfinden. Dieses stabile Verhalten macht wiederholte Durchläufe vorhersehbar und erhält den nützlichen Zusammenhang aus einem Stylesheet oder einer Prüfliste.
Moderne Pseudoklassen korrekt berücksichtigen
Bei funktionalen Pseudoklassen passieren manuelle Rechenfehler besonders häufig. <code>:where()</code> trägt stets null zur Spezifität bei, einschließlich aller enthaltenen Selektoren. So können Sie eine Struktur genau beschreiben, ohne spätere Überschreibungen zu erschweren. Dagegen übernehmen <code>:is()</code>, <code>:not()</code> und <code>:has()</code> die Spezifität ihres stärksten Arguments, ohne selbst einen zusätzlichen Pseudoklassenpunkt hinzuzufügen. <code>:nth-child()</code> und <code>:nth-last-child()</code> liefern einen Pseudoklassenpunkt sowie den höchsten Wert einer optionalen, mit <code>of</code> eingeleiteten Selektorliste. Auch Shadow-Tree-Formen wie <code>:host()</code> und <code>::slotted()</code> werden einbezogen. Der Parser verfolgt verschachtelte Klammern, eckige Klammern, Zeichenketten in Anführungszeichen und Escape-Sequenzen. Deshalb verwechselt er Kommas innerhalb einer Funktion nicht mit Trennzeichen auf oberster Ebene. Übergeben Sie jedes Listenelement als genau einen Selektor. Ein Komma auf oberster Ebene würde mehrere Selektoren mit möglicherweise unterschiedlichen Werten darstellen und wird deshalb abgelehnt, anstatt irreführend zu einem einzigen Wert zusammengefasst zu werden. Somit gehört zu jeder Eingabe genau ein Ausgabewert.
Mit der sortierten Liste die Kaskade vereinfachen
Ein Spezifitätsbericht eignet sich vor allem als Hilfe beim Refactoring und nicht als Anreiz für immer stärkere Selektoren. Fügen Sie repräsentative Selektoren einer Komponente, eines Designsystems oder eines älteren Stylesheets ein und prüfen Sie das obere Ende der Ausgabe. Große Sprünge weisen oft auf IDs, stark qualifizierte Zustände oder ein mächtiges Argument innerhalb von <code>:is()</code> beziehungsweise <code>:not()</code> hin. Solche Selektoren können späteren Code zwingen, strukturelle Details nur zum Überschreiben einer Deklaration zu wiederholen. Ersetzen Sie sie gegebenenfalls durch eine Klasse mit klarer Einzelaufgabe, schwächen Sie optionalen Kontext mit <code>:where()</code> ab oder ordnen Sie Ebenen so, dass der Vorrang nicht von ständig steigenden Werten abhängt. Auch das untere Ende ist aufschlussreich: Elementregeln und leichte Hilfsklassen lassen sich besser wiederverwenden, wenn ihre Rolle klar ist. Automatisierte Abläufe können die API für $0.002 aufrufen, um neue Selektoren oberhalb einer Teamgrenze zu melden, Spezifitätswerte zusammen mit erzeugtem CSS zu speichern oder sortierte Hinweise in einer Prüfung anzuzeigen. Eine ungültige Eingabe lässt die gesamte Anfrage fehlschlagen, sodass ein Teilbericht keinen fehlerhaften Selektor verbirgt. Die Berechnung ist deterministisch und ohne Netzwerkzugriff; identische Eingaben erzeugen immer dieselben Werte in derselben Reihenfolge.
Anwendungsfälle
Ein älteres Stylesheet prüfen
Sortieren Sie Selektoren nach Gewicht, um IDs und stark qualifizierte Regeln zu finden, die gewöhnliche Überschreibungen erschweren.
Komponenten-CSS begutachten
Vergleichen Sie neue Selektoren vor dem Zusammenführen mit den Konventionen eines gemeinsam genutzten Designsystems.
Ein Spezifitätsbudget durchsetzen
Berechnen Sie Werte in einer automatisierten Prüfung und melden Sie Selektoren oberhalb des von Ihrem Team gewählten Maximums.
Häufige Fragen
Was bedeutet jede Zahl des Spezifitätswerts?
Die drei Werte zählen der Reihe nach ID-Selektoren, klassenähnliche Selektoren und typähnliche Selektoren; verglichen wird von links nach rechts.
Wie wird :where() gewertet?
:where() und der gesamte Inhalt ihres Arguments tragen null zur Spezifität bei, die Selektorsyntax wird dennoch geprüft.
Wie werden :is(), :not() und :has() gewertet?
Jede Funktion übernimmt die Spezifität des stärksten Selektors ihrer Argumentliste, ohne einen zusätzlichen Pseudoklassenpunkt.
Darf ein Eingabeelement Kommas enthalten?
Nicht auf oberster Ebene. Übergeben Sie jeden Selektor einzeln, weil Listenelemente unterschiedliche Werte haben können. Verschachtelte Kommas in unterstützten funktionalen Pseudoklassen sind zulässig.
Was geschieht bei zwei Selektoren mit gleicher Spezifität?
Ihre ursprüngliche Eingabereihenfolge bleibt erhalten; dadurch ist die Sortierung stabil und deterministisch.
Was kostet eine API-Anfrage?
Jede Anfrage kostet $0.002. Die Browserversion läuft kostenlos und lokal.
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-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)Beispiel-Anfrage
{
"selectors": [
"button",
".toolbar button:hover",
"#app .toolbar button"
]
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_specificity_sort",
"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_items | 1000 |
max_selector_length | 4096 |
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. |