コンテンツへスキップ

CSS 詳細度計算ツール

1 行に 1 つセレクターを入力して詳細度を比較します。カンマ区切りはセレクターごとに分割し、無効なセレクターは明示します。最終的な適用はレイヤーや !important が決めます。

ブラウザ内でローカルに実行
· :where() · :is() · :not() · :has() · A-B-C
セレクター入力
カスケードマップ
レポートをコピー

CSS セレクターの詳細度を比較する手順

各セレクターは仕様の 3 つのカウンターで採点されます。A は ID セレクター、B はクラス・属性・疑似クラス、C はタイプセレクターと疑似要素です。初期表示の 3 例が結果の形を示します。#app .card:hover > h2 は 1-2-1、:where(.theme) .card:is(.featured, #hero) は 1-1-0、main article[data-kind="docs"]::before は 0-1-3 です。

セレクターはブラウザー自身のパーサーで検証され、ページ内で採点されるため、どこにも送信されません。マップ上部の行に読み取ったセレクター数と最も強いセレクターが表示され、コピーブロックには各スコアがテキストで並びます。

  1. 入力欄にセレクターを 1 行に 1 つ入力または貼り付けます。カンマ区切りのリストが 1 行にある場合はセレクターごとに行が分かれ、貼り付けたリストが 1 つのスコアに合算されることはありません。
  2. 「セレクターを解析」を押すか、そのまま入力を続けます。マップはキー入力ごとに再計算されます。
  3. カスケードマップを読みます。各行に A-B-C スコア、最も強いセレクターを基準にしたバー、ラベル(最も強い/A-B-C/ブラウザーが構文を拒否した場合は無効なセレクター)が表示されます。
  4. 「強い順に並べる」をオンにすると行がスコアの高い順に並び替わります。同点のセレクターは入力順のままです。
  5. 「レポートをコピー」で A-B-C の行をテキストとして取り出し、「リセット」で 3 つの例と並び替えの状態に戻せます。

A-B-C の数字が数えるもの、数えないもの

3 つの数字が数えるもの

A は #app のような ID セレクターを数えます。B はクラス (.card)、属性セレクター ([data-kind="docs"])、疑似クラス (:hover、:focus-visible、:nth-child(2n+1)) を数えます。C はタイプセレクター (main、article、h2) と疑似要素 (::before、::selection) を数えます。全称セレクター * はどの列にも加算しません。

関数型の疑似クラスは仕様どおりに扱います。:where() は 0 を加算し、:is()、:not()、:has()、:nth-child() の of リストは最も重い引数の値になります。:is(.featured, #hero) が ID 1 相当になるのはそのためです。::part() と ::slotted() はそれぞれ疑似要素 1 として数え、引数は加算しません。

カンマ区切り・無効なセレクター・カスケード

1 行のカンマ区切りリストは、その実体どおり複数のセレクターとして扱います。a, b は 0-0-1 の 2 行になります。各行は先にブラウザーのパーサーで検証され、拒否された行(孤立した結合子、三重コロンなど)も一覧に残して「無効なセレクター」と表示し、最も強いセレクターの判定からは外します。無効なセレクターがカスケードに到達することはないためです。

スコアが答えるのは「同じ要素に 2 つのセレクターが一致したとき、どちらの宣言が重みで勝つか」という 1 点です。レイヤー、!important、インラインスタイル、記述順、スコープの近さは計算を覆すことがあり、前の @layer にある低いスコアが勝つこともあります。

ローカル処理と制限

比較はすべてタブ内で完結し、セレクターはどこにも送信されません。行数の上限はなく、入力のたびにマップ・判定行・コピーブロックがまとめて更新されます。

このツールはテキストを比較するだけで、スタイルシートを適用しません。文書に対して一致判定は行わず、表示される数字は仕様上の重みであり、計算後のスタイルの予測ではありません。見た目の確認は、実際のページでブラウザーのインスペクターからセレクターを実行してください。

最近使ったツール: