それは特異性によって決定されます。この場合、どちらも同じように特定されているため、ファイルの最後にある宣言が優先されます。
特異度の計算
特異性は、セレクターのさまざまな部分をランク付けすることによって計算されます。
最も具体的なものから最も低いものへのランク付け:
- スタイル属性-ルールがスタイル属性で見つかった場合、このランクは1になります。
- ID-セレクターで見つかったIDごとに、このランクはさらに1を取得します。
- クラス、疑似クラス、属性セレクター-セレクターで見つかったものごとに、このランクはさらに1を取得します。
- 要素-セレクターで見つかった要素ごとに、このランクはさらに1を取得します。
ここrank n > rank n+1
で、各ランクのポイント数に関係なく。
例
ul#nav li.active a
ポイントは次のとおりです。
- 0-スタイル属性ではありません。
- 1〜1個のIDが見つかりました。
- 1-1クラス名が見つかりました。
- 3〜3個の要素が見つかりました。
したがって、そのセレクターの各プロパティの特異性の値は[0,0,1,1,3]
(1分でその余分なゼロに到達します)です。その値は、たとえばIDがない限り、どのセレクターよりも具体的です。
比較アルゴリズム:
- ランクを左から右に移動します。
- 両方のセレクターのランクを比較します。
- ポイントの多いランクが勝ちです。
- ランクが等しい場合は、次の(具体性の低い)ランクに進みます。
- すべてのランクが等しい場合は、CSSドキュメントの後半にあるランクが優先されます。
より重要な注意事項:
- ユニバーサルセレクターには特異性の値がありません(
0,0,0,0
(*)
)疑似要素(例:first-line
)0,0,0,1
は、
0,0,1,0
- 疑似クラス
:not()
は、それ自体では特異性を追加せず、括弧内にあるものだけを追加します。
- ディレクティブは単一の宣言
!important
に適用でき、他の何よりも具体的な「0番目」のランクにポイントを追加し
ます。したがって、上記の例では、ルールを追加すると、そのルール
の特異性の値がにのみ増加し、 。
がない他のルールよりもすぐに勝ちます。
!important
[1,0,1,1,2]
!important
追加のリファレンス
このテーマに関するこの素晴らしい記事を参照してください
どのスタイルがどの要素に行くかを決定する方法
ブラウザーがそれを行う方法は、セレクターを右から左に移動し、要素が移動するときにDOMから要素をフィルター処理することです。
前の例に戻ります。
ul#nav li.active a
ブラウザは次のことを行います。
- 要素を取り
a
ます。
li
次に、クラスを持つ要素である祖先があるかどうかを確認します.active
(これは子孫コンビネータを介して行われます:) ancestor descendant
。
- ここで、IDがのより高い祖先があるかどうかを確認します(ここでも、子孫コンビネータが使用されます)。
ul
#nav
特定の要素についてこれらすべての条件が満たされている場合、スタイルがその要素に適用されます。
あなたはそれを読むことができます:
クラスが、である祖先を持つa
要素を選択します。これは、で
あり、IDがである祖先もあります。
.active
li
#nav
ul
どの要素がどのCSSスタイルを持っているかを正しく判断できるようにするには、完全に機能し、完全なDOMツリーが必要です。