CSS特異性のポイントはどのように計算されますか


124

このブログを偶然見つけました-http ://www.htmldog.com/guides/cssadvanced/specificity/

特異性はCSSのポイントスコアリングシステムであると述べています。要素は1ポイント、クラスは10ポイント、IDは100ポイントの価値があることを示しています。さらに、これらのポイントが合計され、全体の量はそのセレクターの特異性であるとも言えます。

例えば:

body = 1ポイント
body .wrapper = 11ポイント
body .wrapper #container = 111ポイント

したがって、これらのポイントを使用すると、次のCSSおよびHTMLによりテキストが青色になることが期待されます。

#a {
    color: red;
}

.a .b .c .d .e .f .g .h .i .j .k .l .m .n .o {
  color: blue;
}
<div class="a">
  <div class="b">
    <div class="c">
      <div class="d">
        <div class="e">
          <div class="f">
            <div class="g">
              <div class="h">
                <div class="i">
                  <div class="j">
                    <div class="k">
                      <div class="l">
                        <div class="m">
                          <div class="n">
                            <div class="o" id="a">
                              This should be blue.
                            </div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

15のクラスが150ポイントに等しいのに、1のIDが100ポイントに等しいのに比べて、テキストが赤くなるのはなぜですか?

どうやらポイントは合計されただけではないようです。それらは連結されています。詳しくはこちら-http://www.stuffandnonsense.co.uk/archives/css_specificity_wars.html

これは、セレクターのクラスが0,0,15,0OR であることを意味し0,1,5,0ますか?

(私たちは、このようにIDセレクタの特異性のルックスを知っているように、私の本能は、それが元だ教えてください:0,1,0,0


ここでは奇妙すぎるものです:stackoverflow.com/questions/25565928/...
タルメルLarcier

回答:


137

ペッカの答え実質的に正しく、おそらくこの問題について考える最良の方法です。

しかし、すでに多くの人が指摘しているように、W3C CSS勧告では、「3つの数値abc(大きな基数を持つ数値システム)を連結すると、特異性が得られる」と述べています。したがって、私のオタクは、このベースの大きさを把握する必要がありました。

この標準アルゴリズムを実装するために採用された(少なくとも4つの最も一般的に使用されるブラウザー*によって)「非常に大きなベース」が256または2 8であることがわかりました。

つまり、IDが0でクラス名 256で指定されたスタイルは、IDが1つだけで指定されたスタイルをオーバーライドします。私はいくつかのフィドルでこれをテストしました:

つまり、実質的には「ポイントシステム」がありますが、それは10を基数とするものではありません。256を基数としています。これがどのように機能するかを次に示します。

(2 82または65536、セレクターのID数の倍数
+(2 81または256、セレクターのクラス名の数倍
+(2 80または1、タグ数の倍数-セレクターの名前

これは、概念を伝えるための裏返しの演習ではあまり実用的ではありません。
そのため、このトピックに関する記事はbase 10を使用しています。

***** [Operaは2 16を使用します(karlcowのコメントを参照)。他のいくつかのセレクターエンジンは無限大を使用します —実際にはポイントシステムはありません(Simon Sapinのコメントを参照)。]

更新、2014年7月:
Blazemongerが年の初めに指摘したように、webkitブラウザー(chrome、safari)は256より高いベースを使用しているように見えます。おそらくOperaのように2 16でしょうか?IEとFirefoxはまだ256を使用しています。


34
重要:256という数値は仕様に含まれていません。したがって、この回答は、(確かに有用な)実装の詳細を説明しています。
Matt Fenwick、2012

6
@MattFenwickが言ったように256は仕様に含まれていないだけでなく、実装によっても異なります。Operaでは明らかに大きいです。WeasyPrintとcssselectでは、それは「無限大」です。単一の整数ではなく、整数のタプルを使用しています。
Simon Sapin 2012

3
@Faustオペラは8ビットではなく16ビットを使用します
karlcow

4
この答えは、正直に言うと、Pekkaの答えよりも実際的な説明です。基本的に@Matt Fenwickの言うこと:あなたが説明しているのは、仕様の実用的な実装です。その点で欠陥のあるものですが、著者や実装者によるものであっても、何もすべきではないものです。
BoltClock

7
現在のバージョンのWebkit(ChromeとSafari)では256は不十分であるように見え、@ MattFenwickのポイントをさらに強調します。
Blazemonger、2014

28

良い質問。

確かにわかりません-私が見つけたすべての記事は複数のクラスの例(ここなど)を避けていますが、クラスセレクターとIDの間の詳細を比較することになると、クラスは15どれだけ詳細でも、価値だけ。

これは、特異性の振る舞いに関する私の経験と一致します。

ただし、クラスのスタックが必要です。

.a .b .c .d .e .f .g .h .i .j .k .l .m .n .o

より具体的です

.o

私が持っている唯一の説明は、積み重ねられたクラスの特異性はお互いに対してのみ計算され、IDに対しては計算されないということです。

更新:途中で取得しました。これはポイントシステムではなく、15ポイントのクラスに関する情報は正しくありません。これは、ここで非常によく説明されている4部の番号付けシステムです

開始点は4桁です。

style  id   class element
0,     0,   0,    0

特異性に関するW3Cの説明によれば、上記のルールの特異性の値は次のとおりです。

#a            0,1,0,0    = 100
classes       0,0,15,0   = ... see the comments

これは非常に大きな(未定義?)基数を持つ番号付けシステムです。

私の理解では、底が非常に大きいため、列2の列1と同じように、列3の列4の数値が0を超えることはありません。これは正しいですか?

私よりも数学をよく理解している人が番号付けシステムと、個々の要素が9より大きい場合にそれを10進数に変換する方法を説明できるかどうかに興味があります。


それは.oと.a .bの間などなので、それらをまとめて考慮します。しかし、IDとクラスの間では、例:.aと#aは常にIDを圧倒します。それは(私が思うに)より強力なattrがない場合にのみクラス間でカウントされます。例えば、クラスは要素を越え、IDはクラスを越えます。
Sphvn

@尾崎も私が想定していることですが、OPがポイントシステムについて言っていることと矛盾しています。より多くのことが必要です。その背後にあるルールを見たいのですが。
ペッカ

両方が同じ結論に達したことに気づきました。素晴らしい仕事です!
サム

5
数学の側では、ここでは16を基数として作業できます(15を超える数値はないため)。したがって、0,1,0,0 = 0100h = 256 0,0,15,0 = 00f0h = 240 256> 240なので、IDセレクターが優先されます。
マシューウィルソン

1
はい、特異度の計算は、大きな基数を持つ数体系で行われていると考えることができます。「連結」という用語(仕様でも使用されています)の方がはるかに優れた説明だと思います。(これは、この
問題の真似で

9

現在のセレクターレベル4ワーキングドラフトは、CSSでの特異性を適切に説明しています。

特異性は、3つのコンポーネントを順番に比較することによって比較されます。A値が大きい特異性はより特異的です。2つのA値が関連付けられている場合、より大きなB値を持つ特異性はより具体的です。2つのB値も関連付けられている場合は、c値が大きい方がより具体的です。すべての値が関連付けられている場合、2つの仕様は等しくなります。

つまり、値A、B、Cは互いに完全に独立しています。

15クラスでは、セレクターに150の特異性スコアは与えられません。B値は15になります。単一のA値でこれを上回ることができます。

比喩として、祖父母1人、親1人、子供1人の家族を想像してみてください。これは1,1,1と表すことができます。親に15人の子供がいる場合、それが突然別の親になることはありません(1,2,0)。それは、子供が1人の場合(1,1,15)に比べて、親の責任が非常に大きいことを意味します。;)

同じドキュメンテーションも続けて言っています:

ストレージの制限により、実装ではAB、またはcのサイズに制限がある場合があります。その場合、制限よりも高い値は、オーバーフローせずにその制限にクランプする必要があります。

これは、ファウストの回答で示された問題に取り組むために追加されました。これにより、2012年のCSS実装では、特異度の値が互いにオーバーフローすることが可能になりました。

2012年に戻って、ほとんどのブラウザーは255の制限を実装しましたが、この制限はオーバーフローすることが許可されていました。255クラスのA、B、c特異度スコアは0,255,0でしたが、256クラスはオーバーフローし、A、B、cスコアは1,0,0でした。突然、私たちのB値がA値になりました。セレクターレベル4のドキュメントは、制限がオーバーフローすることは決して許されないと述べて、その問題を完全に明らかにしています。この実装では 255クラスと256クラスの両方が同じA、B、cスコア0,255,0を持ちます。

ファウストの回答で示された問題は、最近のほとんどのブラウザーで修正されています。


8

私は現在、CSS Mastery:Advanced Web Standards Solutionsという本を使用しています。

第1章、16ページは言う:

ルールの具体性を計算するために、各タイプのセレクターに数値が割り当てられます。次に、各セレクターの値を合計することにより、ルールの特異性が計算されます。残念ながら、特異度は10を基数として計算されていませんが、不特定の高い基数を計算しています。これは、IDセレクターなどの特定性の高いセレクターが、タイプセレクターなどの特定性の低い多くのセレクターによってオーバーライドされないようにするためです。

(強調鉱山)と

セレクターの特異性は、a、b、c、dの4つの構成レベルに分類されます。

  • スタイルがインラインスタイルの場合、a = 1
  • b = idセレクターの総数
  • c =クラス、疑似クラス、および属性セレクターの数
  • d =タイプセレクターと疑似要素セレクターの数

さらに、多くの場合、base-10で計算を実行できますが、すべての列の値が10未満の場合のみです。


あなたの例では、IDは100ポイントの価値はありません。それぞれ[0, 1, 0, 0]ポイントの価値があります。したがって、1のid は高基数システム[0, 1, 0, 0]よりも大きいため、15クラスに勝り[0, 0, 15, 0]ます。


4

私は特異度ランキングとオリンピックメダルの表を比較するのが好きです(最初に金メダル、次に銀メダル、次に銅メダルの数に基づく方法)。

それはあなたの質問(1つの特異性グループの膨大な数のセレクター)でも機能します。特異性は、各グループを個別に検討しました。現実の世界では、セレクターが12個を超えるケースはほとんどありません。

ここには、非常に優れた特異度計算機もあります。そこに例(#aおよび.a .b .c .d .e .f .g .h .i .j .k .l .m .n .o)を置いて結果を確認できます。

2016年リオオリンピックのメダル表の例 ここに画像の説明を入力してください


3

ブログの説明が正しいとは思いません。仕様はこちら:

http://www.w3.org/TR/CSS2/cascade.html#specificity

クラスセレクターからの「ポイント」は、「id」セレクターよりも重要になることはできません。それはちょうどそのように機能しません。


答えで言ったように。^^ただし、同じタイプ(要素、クラス、ID)が複数ある場合は違いがあります。しかし、5が赤、3が青と言った場合、それはよくわかります。
Sphvn

CSS2とCSS2.1の間では、具体性に関する表現はほとんど変わっていませんが、CSS2仕様は一般的にリリースの時点で完全に無効になっているため、今後の議論でCSS2.1仕様を指す必要があります。
ロビンウィットルトン

1

私はそれを言うでしょう:

Element < Class < ID

同じものの倍数である場合、それらはあなたが得るものに依存してスタックするだけだと思います。したがって、クラスは常に要素をオーバーライドし、IDは常にクラスをオーバーライドしますが、3が青で1が赤の場合、4つの要素のうちどれに下がるかは青になります。

例えば:

.a .b .c .d .e .f .g .h .i .j .k .l
{
color: red;
}

 .m .n .o
{
color blue;
}

赤くなります。

例http://jsfiddle.net/RWFWq/を参照してください

「5が赤、3が青だとしたら、今赤くなります」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.