CSS ポッドキャスト - 004: The Cascade

CSS はカスケーディング スタイルシートの略です。カスケードは、1 つの HTML 要素に複数の CSS ルールが適用される場合に、競合を解決するためのアルゴリズムです。そのため、次の CSS でスタイル設定されたボタンのテキストが青色になります。

button {
  color: red;
}

button {
  color: blue;
}

カスケード アルゴリズムを理解すると、ブラウザがこのような競合をどのように解決するかを理解するのに役立ちます。カスケード アルゴリズムは 4 つのステージに分割されます。

  1. 表示位置と表示順: CSS ルールが表示される順序
  2. 特異性: 最も一致度が高い CSS セレクタを決定するアルゴリズム
  3. 生成元: CSS が表示される順序と、その CSS の取得元(ブラウザのスタイル、ブラウザ拡張機能の CSS、独自の CSS など)
  4. 重要性: 特に !important ルールタイプで、一部の CSS ルールが他のルールよりも重み付けされています。

表示位置と順序

CSS ルールの表示順序と表示方法は、競合解決の計算中にカスケードによって考慮されます。

このレッスンの冒頭にあるデモは、最もわかりやすい例です。同じ特異性を持つセレクタを持つ 2 つのルールがあるため、宣言される最後のルールが優先されます。

スタイルは、<link> タグ、埋め込み <style> タグ、要素の style 属性で定義されたインライン CSS など、HTML ページのさまざまなソースから取得できます。

HTML ページの上部に CSS を含む <link> がある場合、ページの下部に CSS を含む別の <link> がある場合、最下位の <link> が最も限定的になります。埋め込み <style> 要素でも同じことが起きます。ページの下に位置するほど、対象が絞り込まれます。

<link /> 要素に含まれる CSS で定義されているように、ボタンの背景は青色になります。ダークカラーに設定する CSS ルールは、リンクされている 2 つ目のスタイルシートにあります。後者の位置によって適用されます。

この順序は、埋め込み <style> 要素にも適用されます。<link> の前に宣言されている場合、リンクされたスタイルシートの CSS が最も限定されます。

<style> 要素は <head> で宣言され、<link /> 要素は <body> で宣言されます。つまり、<style> 要素よりも限定的になります。

CSS 内でインラインの style 属性が宣言されている場合、宣言に !important が定義されていない限り、位置に関係なく、他のすべての CSS がオーバーライドされます。

掲載順位も、CSS ルールの順序で適用されます。 この例では、background: purple が最後に宣言されているため、要素の背景は紫色になります。緑の背景は紫色の背景の前に宣言されたため、ブラウザで無視されるようになりました。

.my-element {
  background: green;
  background: purple;
}

同じプロパティに 2 つの値を指定できれば、特定の値をサポートしていないブラウザ用の代替を簡単に作成できます。次の例では、font-size が 2 回宣言されています。clamp() がブラウザでサポートされている場合、以前の font-size 宣言は破棄されます。ブラウザで clamp() がサポートされていない場合、最初の宣言が有効になり、フォントサイズは 1.5rem になります。

.my-element {
  font-size: 1.5rem;
  font-size: clamp(1.5rem, 1rem + 3vw, 2rem);
}

理解度チェック

カスケードに関する知識をテストする

ページに次のような HTML があるとします。

<!DOCTYPE html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="/styles.css" />
  </head>
  <body>
    <button>I am a button</button>
    <style>
      button {
        background: pink;
      }
    </style>
  </body>
</html>

styles.css 内に、次の CSS ルールがあります。

button {
  background: yellow;
}

ボタンの背景は何色ですか?

ピンク
埋め込まれた <style> オリジンは、<link> タグよりもページの下側にあるため、button の特異性は同じですが、スタイルルールの位置が優先されます。
HTML ドキュメントでは、黄色のボタンの背景が最初に読み取られた可能性がありますが、同じ特異性を持つ新しいルールが後で発見されたため、このルールはボタンに適用されません。

詳細度

特異性とは、最も限定された CSS セレクタを決定するアルゴリズムであり、重み付けまたはスコアリング システムを使用して計算を行います。ルールをより限定的にすることで、セレクタに一致する他の CSS が CSS の後半に表示される場合でも、そのルールを適用することができます。

次のレッスンでは、特異性の計算方法について詳しく説明しますが、特異性の問題を多く回避するには、いくつかのことを念頭に置く必要があります。

CSS が特定の要素を対象とするクラスを設定すると、その要素のみを対象とする CSS よりもルールが限定されるため、適用される重要度が高くなります。つまり、次の CSS では、両方のルールが一致し、h1 セレクタのルールがスタイルシートの後半にある場合でも、h1 の色は赤になります。

<h1 class="my-element">Heading</h1>
.my-element {
  color: red;
}

h1 {
  color: blue;
}

id を使用すると、CSS がより限定的になるため、ID に適用されるスタイルは、他の多くの方法で適用されたスタイルをオーバーライドします。そのため、id にスタイルを適用することは通常おすすめしません。そのため、そのスタイルを他の要素で上書きすることが難しくなる場合があります。

特異性は累積的

次のレッスンでわかるように、セレクタのタイプごとにポイントが付与され、その具体性を示すポイントが付与され、要素のターゲットに使用したすべてのセレクタのポイントが加算されます。つまり、a.my-class.another-class[href]:hover などのセレクタ リストが含まれる要素をターゲットにすると、他の CSS で上書きするのが非常に困難になります。そのため、また、CSS の再利用性を高めるため、セレクタを可能な限りシンプルにすることをおすすめします。必要なときに要素を取得するためのツールとして特異性を使用しますが、可能な場合は常に、長くて特定のセレクタ リストをリファクタリングすることを検討してください。

原点

ページに適用する CSS は、自分で記述した CSS だけではありません。カスケードでは CSS の生成元が考慮されます。このオリジンには、ブラウザの内部スタイルシート、ブラウザの拡張機能またはオペレーティング システムによって追加されたスタイル、作成された CSS が含まれます。これらのオリジンの特異性の順序は、具体的でないものから最も具体的なものの順に、次のようになります。

  1. ユーザー エージェントの基本スタイル。これらは、ブラウザが HTML 要素にデフォルトで適用するスタイルです。
  2. ローカル ユーザー スタイル。これは、ベース フォントサイズやモーションの軽減設定など、オペレーティング システムのレベルに応じたものです。また、ユーザーがウェブページ用の独自のカスタム CSS を作成できるブラウザ拡張機能など、ブラウザ拡張機能から取得される場合もあります。
  3. 作成者の CSS:作成した CSS。
  4. 作成日: !important。作成した宣言に追加した !important
  5. ローカル ユーザー スタイル !important。オペレーティング システム レベルまたはブラウザ拡張機能レベルの CSS から取得された任意の !important
  6. ユーザー エージェント !important:ブラウザによって提供されるデフォルトの CSS で定義されているすべての !important
オリジンの順序を視覚的に示しています(リストでも説明しています)。

作成した CSS に !important ルールタイプがあり、ユーザーのカスタム CSS に !important ルールタイプがある場合、CSS はどの CSS が優先されますか。

理解度チェック

カスケード オリジンに関する知識をテストする

カスケードオリジンに関する知識をテストする。さまざまなオリジンの次のスタイルルールを検討してください。

ユーザー エージェント スタイル

h1 { margin-block-start: 0.83em; }

ブートストラップ

h1 { margin-block-start: 20px; }

ページ作成者のスタイル

h1 { margin-block-start: 2ch; }

@media (max-width: 480px) {
  h1 { margin-block-start: 1ch; }
}

ユーザーのカスタム スタイル

h1 { margin-block-start: 2rem !important; }

次に、次のような HTML があるとします。

<h1>Lorem ipsum</h1>

h1 の最後の margin-block-start はどれですか。

20px
ブートストラップはオーサリングされたオリジンの一部であるため、重要なローカル ユーザー スタイルに失われます。
0.83 万
ユーザー エージェント スタイルのオリジンは、重要なローカル ユーザー スタイルに失われます。
2 レム
この !important ユーザーのカスタム スタイルには、最も詳細なオリジンがあります。
2 チャンネル
この作成者のスタイルは作成済みのオリジンの一部であるため、重要なローカル ユーザー スタイルが失われます。
1 チャンネル
この作成者のスタイルは作成済みのオリジンの一部であるため、重要なローカル ユーザー スタイルが失われます。

重要度

すべての CSS ルールが互いに同じように計算されているわけではなく、また、互いに同じ特異性が付与されているわけでもありません。

以下に、重要度の優先順位(重要度が低い順)を示します。

  1. 通常のルールタイプ(font-sizebackgroundcolor など)
  2. animation 個のルールタイプ
  3. !important ルールタイプ(送信元と同じ順序)
  4. transition 個のルールタイプ

アクティブなアニメーションと遷移ルールは、通常のルールよりも重要度が高くなります。遷移が !important ルールタイプよりも重要度が高い場合。これは、アニメーションまたは遷移がアクティブになったときに、動作が視覚的な状態を変えることになるからです。

DevTools を使用して一部の CSS が適用されない理由を特定する

通常、ブラウザの DevTools には、要素に一致する可能性のあるすべての CSS が表示され、使用されていないものに取り消し線が引かれます。

上書きされた CSS に取り消し線が引かれたブラウザ DevTools の画像

適用したい CSS がまったく表示されない場合は、要素と一致していません。その場合は、クラス名や要素名のスペルミス、無効な CSS などがないか他の場所を調べる必要があります。

理解度チェック

カスケードに関する知識をテストする

カスケードの用途

1 つの要素に複数のスタイルを適用する際の競合を解決する。
これは、紛争解決の主要な目標の一つです。
描画時に、各宿泊施設に 1 つのスタイル値のみが存在するようにする。
テキストは 1 色のみにすることができます。カスケードはどの色にするべきかを判断するための方法です。
スコアリングと重み付けのスタイルのルール
スコアリングと重み付けは、カスケードの並べ替えの段階です。
スタイル属性の並べ替えとフィルタリング。
並べ替えとフィルタはカスケードの段階であり、競合解決の側面を理解するのに役立ちます。

関連情報