From 1fea74ef4b1136ccda5de9365510fa53ea890961 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Sun, 2 Jan 2022 22:44:55 +0900 Subject: 2021/08/13 時点の英語版に同期 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/web/css/specificity/index.md | 397 ++++++++++++++++------------------ 1 file changed, 188 insertions(+), 209 deletions(-) (limited to 'files') diff --git a/files/ja/web/css/specificity/index.md b/files/ja/web/css/specificity/index.md index 88b4080d96..2f450b5508 100644 --- a/files/ja/web/css/specificity/index.md +++ b/files/ja/web/css/specificity/index.md @@ -4,194 +4,195 @@ slug: Web/CSS/Specificity tags: - CSS - Example - - Reference - - Web - - ウェブ - ガイド + - リファレンス + - ウェブ translation_of: Web/CSS/Specificity --- -
{{CSSRef}}
+{{CSSRef}} -

詳細度 (Specificity) は、どの CSS プロパティが要素に最も関係があるか、すなわち適用されるかをブラウザーが決定する手段です。詳細度は様々な組み合わせの CSS セレクターで構成される一致規則に基づいています。

+**詳細度** (Specificity) は、どの CSS プロパティが要素に最も関係があるか、すなわち適用されるかをブラウザーが決定する手段です。詳細度は様々な組み合わせの [CSS セレクター](/ja/docs/Web/CSS/Reference#selectors)で構成される照合ルールに基づいています。 -

詳細度の計算方法

+## 詳細度の計算方法 -

詳細度は CSS 宣言が適用される際の重みであり、一致するセレクターそれぞれの種類の数によって特定されます。複数の宣言が同じ詳細度であれば、 CSS の中で最後に宣言されたものが要素に適用されます。詳細度は同じ要素に対して複数の宣言が行われている場合のみ適用されます。 CSS の規則として、直接対象となった要素は要素が祖先から継承した規則よりも常に優先されます。

+詳細度は CSS 宣言が適用される際の重みであり、一致するセレクターそれぞれの[種類](#セレクターの種類)の数によって特定されます。複数の宣言が同じ詳細度であれば、 CSS の中で最後に宣言されたものが要素に適用されます。詳細度は、同じ要素に対して複数の宣言が行われている場合のみ適用されます。 CSS のルールでは、[直接対象となった要素](#直接対象の要素と継承されたスタイル)は要素が祖先から継承したルールよりも常に優先されます。 -
-

メモ: 文書ツリー内における要素の近接性は、詳細度には影響を与えません。

-
+> **Note:** 文書ツリー内における[要素の近接性](#文書ツリー内の近接性の無視)は、詳細度には影響を与えません。 -

詳細度の序列(昇順)

+### セレクターの種類 -

以下のリストは、セレクターを詳細度の小さな順に並べたものです。

+以下のリストは、セレクターを詳細度の小さな順に並べたものです。 -
    -
  1. 要素型セレクター (例えば h1) と 擬似要素 (例えば ::before)
  2. -
  3. クラスセレクター (例えば .example)、属性セレクター (例えば [type="radio"])、擬似クラス (例えば :hover)
  4. -
  5. ID セレクター (例えば #example)
  6. -
+1. [要素型セレクター](/ja/docs/Web/CSS/Type_selectors)(`h1` など)と擬似要素(`::before` など) +2. [クラスセレクター](/ja/docs/Web/CSS/Class_selectors)(`.example` など)、属性セレクター(`[type="radio"]` など)、擬似クラス(`:hover` など) +3. [ID セレクター](/ja/docs/Web/CSS/ID_selectors)(`#example` など) -

全称セレクター ({{CSSxRef("Universal_selectors", "*")}}), 結合子 ({{CSSxRef("Adjacent_sibling_combinator", "+")}}, {{CSSxRef("Child_combinator", ">")}}, {{CSSxRef("General_sibling_combinator", "~")}}, ' ', {{CSSxRef("Column_combinator", "||")}}), 否定擬似クラス ({{CSSxRef(":not", ":not()")}}) は詳細度に影響を与えません。 (但し、 :not()中で宣言されたセレクターは影響を与えます。)

+全称セレクター({{CSSxRef("Universal_selectors", "*")}})、結合子({{CSSxRef("Adjacent_sibling_combinator", "+")}}、{{CSSxRef("Child_combinator", ">")}}, {{CSSxRef("General_sibling_combinator", "~")}}, ['` `'](/ja/docs/Web/CSS/Descendant_combinator), {{CSSxRef("Column_combinator", "||")}})、否定擬似クラス({{CSSxRef(":not", ":not()")}})は詳細度に影響を与えません。(但し、 `:not()` の*中で*宣言されたセレクターは影響を与えます。) -

詳しくは「カスケードと継承」の「詳細度」または https://specifishity.com をご覧ください。

+詳しくは[「カスケードと継承」の「詳細度」](/ja/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#specificity_2)または [https://specifishity.com](https://specifishity.com) をご覧ください。 -

要素に追加されたインラインスタイル (例えば style="font-weight: bold;") は、常に外部スタイルシートの中のスタイルを上書きしますので、最も高い詳細度を持っていると考えることもできます。

+要素に追加されたインラインスタイル (例えば `style="font-weight: bold;"`) は、常に外部スタイルシートの中のスタイルを上書きしますので、最も高い詳細度を持っていると考えることもできます。 -

!important の例外

+### !important の例外 -

!important 規則がスタイル宣言で使われたとき、それが宣言リストのどこであっても、この宣言は CSS 内で作られたその他の宣言を上書きします。技術的には !important は詳細度とは無関係ですが、直接作用します。しかし、スタイルの自然のカスケードを破壊するためデバッグが難しくなるので、 !important を使用することは悪い習慣であり、使用を避けるべきです。同じ要素に二つの競合する宣言が !important 規則付きで適用された場合、より高い詳細度の宣言が適用されます。

+`!important` ルールがスタイル宣言で使われたとき、それが宣言リストのどこであっても、この宣言は CSS 内で作られたその他の宣言を上書きします。技術的には `!important` は詳細度とは無関係ですが、直接作用します。しかし、スタイルの自然の[カスケード](/ja/docs/Web/CSS/Cascade)を破壊するためデバッグが難しくなるので、 `!important` を使用することは**悪い習慣**であり、使用を避けるべきです。同じ要素に二つの競合する宣言が `!important` ルール付きで適用された場合、より高い詳細度の宣言が適用されます。 -

いくつかの経験則

+**いくつかの経験則** - +- `!important` を考える前に、**常に**詳細度を使用する方法を探しましょう。 +- ページ固有の CSS が外部の CSS (ブートストラップや正規化 CSS などの外部ライブラリーなど) を上書きする場合**のみ**、 `!important` を使用しましょう。 +- **決して**プラグインやマッシュアップを書いている時に、 `!important` を使わないようにしましょう。 +- **決して**サイト全体の CSS で `!important` を使わないようにしましょう。 -

!important を使用する代わりに、以下のことを検討してください。

+**`!important` を使用する代わりに、以下のことを検討してください。** -
    -
  1. CSS のカスケードをもっと利用する
  2. -
  3. -

    もっと詳細な規則を使う。規則の選択時に要素の前に1つまたは複数の要素を示すと、詳細度が上がり、より優先度が高くなります。

    +1. CSS のカスケードをもっと利用する +2. もっと詳細なルールを使う。ルールの選択時に要素の前に1つまたは複数の要素を示すと、詳細度が上がり、より優先度が高くなります。 -
    <div id="test">
    -  <span>Text</span>
    -</div>
    -
    + ```html +
    + Text +
    + ``` -
    div#test span { color: green; }
    -div span { color: blue; }
    -span { color: red; }
    + ```css + div#test span { color: green; } + div span { color: blue; } + span { color: red; } + ``` -

    順番に関わらず、テキストは最も詳細度が高い規則である緑色になります。 (また、青の規則は規則の順番にかかわらず、赤の規則を上書きします)

    -
  4. -
  5. (2)のナンセンスの特殊なケースとして、何も指定する必要がない場合には、単純にセレクターを複製することで詳細度を高めることができます。 -
    #myId#myId span { color: yellow; }
    -.myClass.myClass span { color: orange; }
    -
  6. -
+ 順番に関わらず、テキストは最も詳細度が高いルールである緑色になります。 (また、青のルールはルールの順番にかかわらず、赤のルールを上書きします) -

!important の用途

+3. (2)のナンセンスの特殊なケースとして、何も指定する必要がない場合には、単純にセレクターを複製することで詳細度を高めることができます。 -
A) インラインスタイルの上書き
+ ```css + #myId#myId span { color: yellow; } + .myClass.myClass span { color: orange; } + ``` -

サイトの視覚的な側面をグローバルに設定するグローバル CSS ファイルは、それぞれの要素に直接定義されたインラインスタイルによって上書きされることがあります。インラインスタイルと !important はどちらもとても悪い習慣とみなされていますが、時には前者を上書きするために後者が必要とされることがあります。

+#### !important の用途 -

この場合、特定のスタイルをグローバル CSS ファイルの中で !important として設定することで、要素に直接設定されたインラインスタイルを上書きすることができます。

+##### A) インラインスタイルの上書き -
<div class="foo" style="color: red;">What color am I?</div>
-
+サイトの視覚的な側面をグローバルに設定するグローバル CSS ファイルは、それぞれの要素に直接定義されたインラインスタイルによって上書きされることがあります。インラインスタイルと !important はどちらもとても悪い習慣とみなされていますが、時には前者を上書きするために後者が必要とされることがあります。 -
.foo[style*="color: red"] {
+この場合、特定のスタイルをグローバル CSS ファイルの中で !important として設定することで、要素に直接設定されたインラインスタイルを上書きすることができます。
+
+```html
+
What color am I?
+``` + +```css +.foo[style*="color: red"] { color: firebrick !important; } -
+``` -

多くの JavaScript フレームワークやライブラリがインラインスタイルを追加します。 !important をとても限定的なセレクターで使用することは、これらのインラインスタイルを上書きする方法の一つです。

+多くの JavaScript フレームワークやライブラリがインラインスタイルを追加します。 `!important` をとても限定的なセレクターで使用することは、これらのインラインスタイルを上書きする方法の一つです。 -
B) 高い詳細度の上書き
+##### B) 高い詳細度の上書き -
#someElement p {
+```css
+#someElement p {
   color: blue;
 }
 
 p.awesome {
   color: red;
-}
+} +``` -

#someElement の中にある場合であっても、 awesome の段落を常に赤くするにはどうすればよいでしょうか。 !important がないと、第一の規則がより詳細度が高いので、第二の規則に勝ちます。

+`#someElement` の中にある場合であっても、 `awesome` の段落を常に赤くするにはどうすればよいでしょうか。 `!important` がないと、第一のルールがより詳細度が高いので、第二のルールに勝ちます。 -

!important を上書きする方法

+#### `!important` を上書きする方法 -

A) !important の付いた CSS 規則と、それにより高い詳細度のセレクターを与えるか (タグ、 id、 class のセレクターへの追加)、同じセレクターで既存の位置より後に CSS 規則を追加するかします。これが動作するのは、詳細度が同じであるとき、最後に定義された規則が勝つからです。

+A) `!important` の付いた CSS ルールと、それにより高い詳細度のセレクターを与えるか (タグ、 id、 class のセレクターへの追加)、同じセレクターで既存の位置より後に CSS ルールを追加するかします。これが動作するのは、詳細度が同じであるとき、最後に定義されたルールが勝つからです。 -

詳細度を高める例です。

+詳細度を高める例です。 -
table td    { height: 50px !important; }
+```css
+table td    { height: 50px !important; }
 .myTable td { height: 50px !important; }
 #myTable td { height: 50px !important; }
-
+``` -

B) または、既存の物の後に同じセレクターを追加します。

+B) または、既存のものの後に同じセレクターを追加します。 -
td { height: 50px !important; }
+```css +td { height: 50px !important; } +``` -

C) また、できれば、元の規則を書き換えて、どちらも !important を使用しないようにします。

+C) また、できれば、元のルールを書き換えて、どちらも `!important` を使用しないようにします。 -
[id="someElement"] p {
+```css
+[id="someElement"] p {
   color: blue;
 }
 
 p.awesome {
   color: red;
-}
+} +``` -

ID セレクターの代わりとして属性セレクターの一部に id を入れると、クラスと同じ詳細度になります。上記の両方のセレクターとも同じ重みをもつようになりました。詳細度が同等の場合、後に定義された規則が優先されます。

+ID セレクターの代わりとして属性セレクターの一部に id を入れると、クラスと同じ詳細度になります。上記の両方のセレクターとも同じ重みをもつようになりました。詳細度が同等の場合、後に定義されたルールが優先されます。 -

詳細情報

+#### 詳細情報 - +- +- +- +- +- -

:is() および :not() の例外

+### :is() および :not() の例外 -

全一致の擬似クラス {{CSSxRef(":is", ":is()")}} {{Experimental_Inline}} および否定擬似クラスの {{CSSxRef(":not", ":not()")}} は、詳細度の計算では擬似クラスとは見なされません。しかし、セレクターの種類の数を数える時には、これらの擬似クラスの中に置かれたセレクターは、通常のセレクターのように計算されます。

+全一致の擬似クラス {{CSSxRef(":is", ":is()")}} {{Experimental_Inline}} および否定擬似クラスの {{CSSxRef(":not", ":not()")}} は、詳細度の計算では擬似クラスとは見なされません。しかし、[セレクターの種類](#セレクターの種類)の数を数える時には、これらの擬似クラスの中に置かれたセレクターは、通常のセレクターのように計算されます。 -
-

以下の CSS を...

+以下の CSS を... -
div.outer p {
+```css
+div.outer p {
   color: orange;
 }
 
 div:not(.outer) p {
   color: blueviolet;
 }
-
- -

以下の HTML に適用した場合...

- -
<div class="outer">
-  <p>This is in the outer div.</p>
-  <div class="inner">
-    <p>This text is in the inner div.</p>
-  </div>
-</div>
-
+``` -

画面では、以下のように表示されるでしょう。

+以下の HTML に適用した場合... -

{{EmbedLiveSample("The_not_exception-example")}}

+```html +
+

これは outer の div の中にあります。

+
+

これは inner の div の中にあります。

+
+``` -

:where() の例外 {{Experimental_Inline}}

+画面では、以下のように表示されるでしょう。 -

{{SeeCompatTable}}

+{{EmbedLiveSample("The_is_and_not_exceptions")}} -

詳細度を調整する擬似クラス {{CSSxRef(":where", ":where()")}} {{Experimental_Inline}} は、自分自身の詳細度が常にゼロで置き換えられます。

+### :where() の例外 -

この一連の CSS で...

+詳細度を調整する擬似クラス {{CSSxRef(":where", ":where()")}} {{Experimental_Inline}} は、自分自身の詳細度が常にゼロで置き換えられます。 -
div:where(.outer) p {
+この一連の CSS で...
+
+```css
+div:where(.outer) p {
   color: orange;
 }
 
 div p {
   color: blueviolet;
 }
-
+``` - +``` -

... 以下の HTML と一緒に使用されたとき ...

+... 以下の HTML と一緒に使用されたとき ... -