日曜日, 9月 28, 2025
日曜日, 9月 28, 2025
- Advertisment -
ホームニューステックニュースCSS大解剖 14日目: 「カスケード」

CSS大解剖 14日目: 「カスケード」


本稿は、2024年3月頃に書き溜めていたシリーズです。最後まで温存させるのが勿体ないので、未完成ですがそのまま公開します(公開日: 2025/9/26)。そのため、内容の重複や記述方針の不一致があるかもしれませんが、ご理解ください。


CSSの仕様を理解するために、1日ごとにテーマを決めて説明する企画14日目です。今日のテーマは「カスケード」です。

カスケードとは

カスケードは、複数の矛盾するスタイル指定(プロパティ宣言)の中から、優先度の高いものを1つ選ぶという仕様のことです。Cascading Style Sheetの名の通り、カスケードはCSSの根幹をなす概念のひとつです。

ただし、CSSがプロパティの値を決定するためのプロセスはカスケード以外にもいくつかの要素から構成されています。

本稿では、カスケードを含め、CSSにおいてプロパティの値を決定するまでの流れ全体を扱います。

プロパティ

プロパティは要素や擬似要素にスタイルを指定するための値の入れもので、 color, font-size, width などの名称のことです。プロパティは大きく3種類に分けられます。

さらに、ユーザーエージェント定義プロパティは以下のように分けられます。

また、プロパティに類似のものとして記述子があります。たとえば @page 内に書けるプロパティのようなものは @page 記述子と呼ばれ、本稿で説明するカスケードに似た処理を受けます。

プロパティの決定手順

要素を描画するためには、各要素のプロパティの値を決定しなければなりません。プロパティの値は一発でポンと決まるわけではなく、大きく以下の6段階に分けられた手順を経て決定されます。

  1. はじめに、セレクターを評価することで、要素に適用可能な宣言を全て列挙します。この結果を宣言値 (declared value)といいます。宣言値は複数あることもあれば、1つもない場合もあります。
    • 正確に言うならば、このステップの出力は値そのもののリストではなく、それに対応する宣言のリストだと考えたほうがいいでしょう。
  2. 続いて宣言値に優先順位をつけ、最も優先度の高い1つだけを残します。この結果をカスケード値 (cascaded value)といいます。カスケード値は0個または1個あります。
  3. カスケード値がない場合や、カスケード値に特殊な指定が存在する場合には、所定のデフォルト値を評価します。この結果を指定値 (specified value)といいます。継承はデフォルトの一種です。
  4. 指定値を、プロパティごとに固有の方法で簡約したものを計算値 (computed value)といいます。たとえば、多くのプロパティでは、長さの相対指定をこの時点で解決するように指定されています。 calc() も、可能な範囲内でこのタイミングで解決されます。
  5. width: auto; など、実際のレイアウトを行うまで最終結果がわからない指定は多数存在します。これらの解決が済んだ値を使用値 (used value)といいます。長さの相対指定や calc() の中には、このタイミングまで評価が遅延されるものもあります。
  6. 使用値をWebブラウザの表示環境にあわせて補正した値を実値 (actual value)といいます。

ただし、この6段階の概念はあくまで値の計算の途中経過をわかりやすく分類したものにすぎず、実際には直線的に計算が進むわけではありません。CSSの実態をある程度考慮して手順を書き下すと、おおむね以下のようになると考えられます。

  1. パース時点で無効なプロパティを除外します。
  2. 有効な略称プロパティ宣言に対して、対応する擬似的な正称プロパティ宣言を生成します。この時点で対応する値が確定しない場合 (font プロパティのシステムデフォルト名が指定されている場合、フロー相対の略称プロパティの場合や中で var() が使われている場合) もあるので、このような場合は略称プロパティ宣言への内部的なリンクを生成するに留めておきます。
  3. コンテナクエリの処理のためのループ:

    1. 文書のルート要素によって作られるクエリコンテナから処理を開始します。
    2. 継承の処理のためのループ:
      1. クエリコンテナ内のルート要素から処理を開始します。
      2. プロパティ間依存処理のためのループ:
        1. 「全てのカスタムプロパティ・一括」を対象に処理を開始します。
        2. revert/revert-layerのためのループ:
          1. 全てのオリジン・全てのレイヤーが有効な状態から処理を開始します。
          2. セレクターを評価し、各正称プロパティの宣言値を列挙します。キーフレームの評価もこのタイミングで行います。
          3. 要素の書字方向を参照し、フロー相対正称プロパティの宣言値のリストを、対応する物理プロパティの宣言値のリストにマージします。
          4. 宣言値に優先順位をつけ、カスケード値を決定します。
          5. カスケード値がrevertまたはrevert-layerの場合は、レイヤーまたはオリジンを削ってステップ3-2-2-2-2からやり直します。それ以外の場合はデフォルト指定の処理を行い、指定値を決定しループを抜けます。
        3. 指定値に var() が含まれる場合はこれを展開し、パースを行います。パースに失敗した場合や、パース結果が明示的なデフォルト指定キーワードだった場合は、デフォルト処理を行います。カスタムプロパティ自身の var() の処理においてループが発生した場合は無効化処理を行います。
        4. 展開後の指定値と、親要素の情報をもとに計算値を決定します。
        5. 所定のプロパティの計算値がわかったので、他のプロパティについての計算のためにステップ3-2-2-2からやり直します。計算するべきプロパティがなければループを抜けます。このとき、プロパティの計算順にはいくつかの制約があります。 (以下は網羅的なリストではありません)
          • カスタムプロパティとアニメーション関係プロパティ (animation-*) は先に計算する必要があります。カスタムプロパティ・アニメーション関係プロパティ間の依存関係は固定されていないため、一括で処理してループの検出を行います。
          • color は、他の を参照しうるプロパティよりも先に計算する必要があります。
          • font-size, font-family などのフォント関連プロパティや writing-mode, direction, text-orientation など文字の描画に影響のあるプロパティは、 font-size 等自身を除く他の を参照しうるプロパティよりも先に計算する必要があります。
          • writing-mode, direction, text-orientation は、フロー相対プロパティとの対応関係を持つ物理指定プロパティよりも先に計算する必要があります。
      3. 全てのプロパティの計算値がわかったので、子要素についての計算を続けるためにステップ3-2-2からやり直します。これ以上処理するものがなければループを抜けます。
    3. レイアウトを行い、使用値実値を決定します。
    4. 子クエリコンテナの大きさが決定されたので、クエリコンテナの内部に入ってステップ3-2からやり直します。これ以上処理するものがなければ終了します。

TODO: プロパティの決定順について書く、var() が revert に解決された場合について書く

TODO: 例

TODO: Syntaxの章にValues and Unitsの話をつけ足す

TODO: revertまわりの処理のループ順を逆にして継承っぽく説明する

もちろん、上で示した手順はあくまで定義の依存関係を明確にするためのものであり、実際にWebブラウザが利用している高速なアルゴリズムはこれとは大きく異なる(しかし同じ結果をもたらす)手順で実装されていると考えられます。

それでは、個々のステップを詳しく見ていきましょう。

プロパティの構文解析

イントロ

宣言されたプロパティは、まず構文解析簡単な静的検査にかけられます。このときプロパティ値が**無効 (invalid)**と判定された場合は、そのプロパティ宣言は無視されます。CSSの前方互換性を担保するため、この挙動は厳格に定められています。たとえば、以下の例を考えます。

#hero {
  height: 100%;
  height: 100vh;
  height: 100svh;
}

ここで、 svh という単位を解釈できない古いWebブラウザは最後の宣言を無視します。残った宣言の中で最後に宣言された height: 100vh がカスケードで選択されることになります。

いっぽう、一見無意味な値であっても、構文上は有効として扱われる場合もあります。たとえば以下の例では、最後のプロパティ宣言は (calc() をサポートする十分に新しいWebブラウザでは) 有効です。

.meaningless {
  width: 100px; 
  width: -100px; 
  width: calc(-100px); 
}

最後のプロパティ宣言が有効であることから、 width: 100px; という指定はカスケードで上書きされてしまいます。

これは古いブラウザの対応だけではなく、ブラウザが設けている制限を検出してフォールバックするのにも使える可能性があります。たとえば、非常に長い calc()はWebブラウザごとに固有の制限により無効化される可能性がありますが、その場合はより短いプロパティを書いておくことでフォールバック処理とすることができます。

値の構文定義

さて、どのような値が有効であるかはプロパティごとに定められています。たとえば、以下はwidthプロパティの定義です。

図: widthプロパティの定義のスクリーンショット

このうち、値のフォーマットを定義しているのは以下の項目です。

  • Value: auto | | min-content | max-content | fit-content()

この項目はValue Definition Syntaxというメタ構文によって記述されるルールになっています。上の例ではキーワードとして auto, min-content, max-content を受理するほか、 100px, 100%, calc(100px + 100%), fit-content(100px) などを受理することがわかります。

カスタムプロパティの場合は以下のようになります。

  • 未登録のカスタムプロパティは、ほとんど全てのトークン列を受理します。具体的には という構文に従いますが、これはパースエラーによって生じる特殊なトークンを除外するほか、感嘆符記号 ! の出現を禁止しています。したがって以下は無効な宣言です。
    
    
    --foo: !important !important;
    

    いっぽう、以下のような宣言は全て有効です。

    --foo: 100kg; 
    --foo: #include ; 
    --foo:; 
    
  • Houdiniの仕様に基づいて登録されたプロパティは、登録時にsyntax記述子により構文が指定されていますが、この段階では構文検査は行われません。この段階での挙動は、未登録の場合と同じです。
    • 構文指定に意味がないわけではなく、あとのほうで利用されます。

値の内部表現

構文解析された値は通常、Webブラウザ固有の内部表現に変換されます。たとえばChromium/Blinkの場合はCSSValueというクラスで、実質的には直和型を用いたツリー構造として表現されています

  • 長さなどの数値はUnitType型のnumeric_literal_unit_typeと、double型のnumの組み合わせで表現されます。
  • calc() などの数式呼び出しは、式の構造をそのままexpressionとして保持しています。

「値」という名前で呼ばれてはいますが、これらは概念的にはプログラミング言語における式のようなものとして考えたほうがいいでしょう。これらの値は、宣言された当初は calc(100% - 2em)auto などの複雑な式を許容しますが、本稿で説明するステップを経ることで段々と単純化していき、最終的には具体的な数値などレンダリングに必要な値が判明している状態にまで落とし込まれます。関数型言語の意味論に親しみのある人であれば、これは簡約ベースで定義された意味論のように考えるのがわかりやすいかと思います。

さて、値をこれらの内部表現に変換する過程で、すでにいくつかの情報は欠損しています。代表的なものとして以下のようなものがあります。

  • スペースの有無。
  • キーワードの大文字小文字。たとえば、 redRED の違い。
  • 数値がどのように表記されていたか。たとえば、 1.51.50 の違い。
  • 数値を浮動小数点数や固定長の整数で表現するにあたって欠落した情報。

CSSのレンダリングの過程で、宣言値の中間状態が直接露出することはないため、このタイミングでどれくらい値を簡略化するかは本来は大きな問題ではありません。しかし、CSSOMが宣言値をJavaScriptから取得する機能を備えているため、このAPIを通じて内部表現の表現精度が露出してしまいます。こういった事情から、CSSOMでは宣言値からどれくらいの情報が復元可能であるべきかをある程度規定しています

グローバルキーワードと var()

各プロパティの定義によらず常に有効とみなされる値が2種類あります。

1つ目はグローバルキーワードで、以下が知られています。

これらは各プロパティの定義よりも優先して解釈され、このタイミングでは必ず有効なものとして扱われます。これらの特別な値は、指定値の決定時に解釈されます。

.btn {
  
  border: unset;
  
  --foo: initial;
}

2つ目はvar()が使われている場合です。この場合、以下のルールが適用されます。

var() の呼び出し形式の正しさは以下のように決まります。

  • var() 内の最初のトークン(空白を除く)が --foo のような形の識別子であること。
  • var() 内の2番目のトークン(空白を除く)が , であるか、または存在しない (1トークンのみ) こと。

たとえば、 var(--foo), var(--foo,), var(--foo, bar, baz) は正しい呼び出しですが、 var(foo)var() は不正な呼び出しです。このような不正な呼び出しはこの時点で無効とみなされます。

var() の呼び出しが1つ以上あり、それらの呼び出し自体が正しければ、他がでたらめでもこの時点では有効なプロパティとみなされます。たとえば以下の例では height の宣言はこの時点では有効です。

.separator {
  
  height: for(int i = len; var(--i) > 0;) printf("Hello!\n");
}

上の例にもあるように、 var() の出現位置は括弧にネストされた位置でもかまいません。よくあるのは calc() の中に出現する場合です。

なお、ChromeやFirefoxなどの実際の実装では !{} などが含まれると無効扱いされることがあるようです。

略称プロパティの処理

略称プロパティ (shorthand property) は、正称プロパティ (longhand property) に展開される特殊なプロパティです。宣言値・カスケード値・計算値など後続の処理は、すべて展開後の状態で処理されます

たとえば、以下の例の場合、 border の展開を行ってからカスケードが処理されます。結果、 border-color の値は red になります。

.foo {
  border: 1px solid black;
  border-color: red;
}

いっぽう、以下の場合は border-color の値は black です。

.foo {
  border-color: red;
  border: 1px solid black;
}

略称プロパティの主な目的は記述の簡略化ですが、 allfont など一部の略称プロパティには、単なる略記とは言えない代替不可能な役割があります。

指定なしの場合

略称プロパティは、その値にかかわらず、常に決まった数の正称プロパティに展開されます。言い換えると、指定のなかった部分についても必ず決まった値で上書きすることになります。

たとえば以下のプロパティ宣言を考えます。

これは現時点では以下と等価です

border-top-color: black;
border-top-style: solid;

border-top-width: medium;

「現時点では」と書いたのには理由があります。CSSに新規プロパティが導入されるタイミングに限り、後方互換性を保ちながら略称プロパティを拡大することができるからです。たとえば、将来ボーダーに触覚効果を追加する border-top-touch-effect が追加されたとします (あくまで想像上の例です)。それと同時に、 border-top を以下のように展開するように仕様を拡張します。

border-top-color: black;
border-top-style: solid;

border-top-width: medium;

border-top-touch-effect: none; 

これは後方互換性が保たれています。というのも、それ以前のWebページは border-top-touch-effect を利用していませんし、このプロパティの導入後に書かれるWebページは、はじめから border-top がこのように展開することを前提に組まれるからです。

なお、常に決まった正称プロパティに展開することだけが要件であり、それら全てを自由に操作できる必要はありません。たとえば、 border 略称プロパティは border-image-* を常にリセットしますが、 border 内には border-image-* の値を指定する手段があるわけではありません。

all

allは特殊な略称プロパティで、 directionunicode-bidi を除く全てのUA定義の正称プロパティに展開されます。

all は、いかなる値も受理しないように定義された略称プロパティであると言えます。言い換えると、このプロパティにはグローバルキーワードである initial, inherit, unset, revert, revert-layer のみを書くことができます。略称プロパティのグローバルキーワードは展開後に解釈されるため、これは以下のように全てのプロパティに同じキーワードを指定したのと同等だと言えます。


align-content: unset;
align-items: unset;
align-self: unset;
animation: unset;
animation-delay: unset;
animation-direction: unset;
animation-duration: unset;
animation-fill-mode: unset;
animation-iteration-count: unset;
animation-name: unset;
animation-play-state: unset;
animation-timing-function: unset;
azimuth: unset;

とはいえ、定義されているCSSのプロパティは増え続けているので、Web作者の視点からはこれは展開後のコードと等価とは到底言えないでしょう。増え続けるプロパティ全てに対応できることから、 all は主に、ユーザーエージェントスタイルシートやコンポーネント境界の外で定義されたスタイルをリセットするために利用されます。

directionunicode-bidi が除外されているのは、これらが本来はCSSではなくHTMLなどのマークアップ言語の範疇の機能だからです。これらはHTML以外の、Webブラウザがサポートしていない文書形式のスタイルを行うための特殊機能であるため、HTML文書のスタイル指定においてはこれらのプロパティを上書きしてはいけません。

他にも、リセット後の挙動に注意が必要なプロパティがいくつかあります。以下にいくつかを例示します。

  • display: inline がデフォルトです。
  • cursor: auto がデフォルトですが、これは対象要素の種類によって挙動が変わります。
  • outline をはじめとして、アクセシビリティ用のスタイル指定の多くが無効になるため、これらの代替を適切に実装する必要があります。

font

font はいくつかの font-* プロパティの略称ですが、システム設定を参照する指定は font プロパティを通じてのみ行えます。そのため、 font は必ずしも展開後の指定で代替できません。

略称プロパティが var() を含む場合

略称プロパティが var() を含む場合は、その場で展開結果を計算することができません。この場合でも略称プロパティを仮想的に展開し、置換待ちの値 (pending-substitution value) という特殊なサンク値を保持することで後続のカスケードやデフォルトの処理を行えるようにします。

「置換待ちの値」はWebブラウザで内部的に保持される値であるため、対応するCSSの構文はありません。擬似コードで説明すると、以下のような感じです。

たとえば、以下のようなコードを考えます。

border-top: var(--blen) var(--bsty) var(--bcol);

一見するとこれは border-top-width: var(--blen) のような対応関係があるように思えますが、それは名前からのヒューリスティックスでそのように推定できるだけで、予想に反して var(--blen) には black のような値が入っている可能性も排除できません。ですから、Webブラウザはそのような展開は行わず、仮想的に以下のようなサンクを生成します。


border-top-color: __LONGHAND__(border-top, border-top-color, var(--blen) var(--bsty) var(--bcol));
border-top-style: __LONGHAND__(border-top, border-top-style, var(--blen) var(--bsty) var(--bcol));
border-top-width: __LONGHAND__(border-top, border-top-width, var(--blen) var(--bsty) var(--bcol));

フロー相対略称プロパティ

padding, margin など、いくつかの略称プロパティは、その物理的な方向にもとづいて正称プロパティに展開されます。


padding: 1px 2px 3px 4px;


padding-top: 1px;
padding-right: 2px;
padding-bottom: 3px;
padding-left: 4px;

これらのフロー相対な亜種がCSS Logical Properties and Values内で提案されています。ただし、この規定は例外的に不確定な部分としてCSS Logical Properties and Valuesの現行バージョンの正式な定義から除外されています。したがって、ここで説明する記法は暫定的なものであるという点に留意してください。

現行の提案されている構文では、以下のように logical をつけることでフロー相対に解釈されることになっています。


padding: logical 1px 2px 3px 4px;


padding-block-start: 1px;
padding-inline-start: 2px; 
padding-block-end: 3px;
padding-inline-end: 4px; 

もしこの構文で実装される場合、以下のような場合分けが発生します。

  • 値が var() を含まない場合、フロー相対プロパティへの展開は容易です。
  • 値が var() を含む場合、それが物理プロパティに展開されるのか、フロー相対プロパティに展開するのかは一見するとわかりません。しかし、フロー相対プロパティに展開されたとしても、あとの作業で必ず4方向全ての物理プロパティの宣言リストに1つずつマージされることは保証されています。そのため、この時点では物理プロパティに対して「置換待ちの値」をサンクとして生成しておき、あとで展開時にlogicalが指定されていたらその時点でのwriting-mode/directionプロパティの値に基づいて射影方向を選択するということは可能です。

TODO: 規格ではcomputed valueでこの処理を行っているのでそのへんの辻褄合わせ

レガシー別名とレガシー略称

略称プロパティのうち、後方互換性のために単一の正称プロパティに射影されるものをレガシー別名/レガシー略称といいます。

  • レガシー別名 はこのような略称プロパティのうち、値を変換しないもののことです。
  • レガシー略称 はこのような略称プロパティのうち、値の変換をともなうもののことです。

目的こそ違えど、その振る舞いは一般の略称プロパティと変わりません。ただし、これらはよりシンプルであることから、一般の略称プロパティよりも簡易的に実装される可能性があります。

宣言値

ここまででようやく、各要素のプロパティ値を計算する準備ができました。

宣言値は、その要素に該当する宣言を全て集めてきたものです。これにはたとえば、以下のような(自然な)条件が加味されます。

  • その宣言を含むスタイルシートや、その祖先が有効であること。
  • その宣言に紐付けられた @media クエリやスタイルシート全体の media 条件が満たされていること。
  • その宣言に紐付けられた @supports クエリが満たされていること。
  • その宣言に紐付けられた @container クエリが満たされていること。
  • その宣言を含むスタイルブロックのセレクターが、その要素に該当すること。
  • その宣言が無効な宣言ではないこと。

継承はこれよりも後のステップで処理されるので、ここではまだ考えません。あくまで要素自身のことを考えればよく、その祖先要素に当てられたスタイルは考慮しません。ただし、セレクターでDOMの構造に関する結合子が指定されている場合は、そのルールは規定通りに適用します。

宣言値という名称で呼ばれているものの、この時点では技術的には値ではなく宣言そのものを保持していると考えるのが自然です。実は後述するように、少なくとも計算値を導出するまでは宣言との関係を保持しておく必要があります。

この時点で略称プロパティの処理は完了しているとみなせるため、以降では略称プロパティの宣言値を考える必要はありません。

フロー相対プロパティの宣言値のマージ

padding-top など、特定の方向に紐付くプロパティの値を計算するにあたっては、対応するフロー相対プロパティの宣言値をこのタイミングでマージしておきます

たとえば、以下の例を考えます。

padding-top: 2px;
padding-block-start: 4px;

この場合、横書きモードにおける padding-top の宣言値は 2px4px の2つですが、縦書きモードの場合は 2px の1つのみです。この分岐ではその要素自身のwriting-mode プロパティと direction プロパティ (加えて、この使用値に影響を与える text-orientation プロパティ) を参照するため、先にこれらのプロパティの計算を済ませておく必要があります。 (もちろん、実際の実装では必要になってから計算するような形式でもかまいません)

スコープ

@scope 等を使ってスコーピングされた宣言は、実際には単一の宣言ではなく、スコープルートによってパラメーター化されていると考えられます。この場合は、宣言への参照だけではなく、スコープルート要素への参照を保持しておく必要があります。 (あるいは、単にスコープ近接性を整数列で保持するだけでも十分です)。これについてはカスケードの節で説明します。

アニメーション宣言 (@keyframes)

@keyframesの評価もこのタイミングで行われます。これはおおむね以下のステップで行われます。

  1. animation-* プロパティアニメーション不可であるため、この時点でその計算値が決定されていると仮定できます。
  2. これをもとに @keyframes の内容を参照し、関連するキーフレーム(一般的に2個ある)を特定します。
  3. キーフレーム内のプロパティ宣言の計算値を求めます。
    1. 宣言は1つしかないので、宣言値は明らかです。
    2. 宣言は1つしかないので、カスケード値は明らかです。
    3. TODO

Transition宣言

TODO

カスケード値

カスケードは宣言値からカスケード値を得るステップです。これは一言で言えば、宣言値同士を所定の基準で比較し、最も優先されるべき宣言を採用するという処理です。この比較基準をカスケード順といいます。

なお、宣言値がひとつもない場合は、カスケード値はありません。言い換えると、宣言値がひとつもない場合のカスケード値は unset であるとみなされます。

カスケード順のルールは年々複雑化していますが、まずは古典的なカスケード順を理解しておきましょう。

  1. まず、オリジンと重要度を比較します。
    1. ユーザーエージェント (Webブラウザ) による !important 宣言 ↑強い
    2. ユーザーによる !important 宣言
    3. ページ作者による !important 宣言
    4. ページ作者による通常宣言
    5. ユーザーによる通常宣言
    6. ユーザーエージェント (Webブラウザ) による通常宣言 ↓弱い
  2. オリジンと重要度が同じ場合で、どちらかが style 属性に由来している場合は、それが優先されます。
  3. オリジンと重要度が同じ場合で、いずれも style 属性に由来する場合は、宣言に対応するセレクターの詳細度を比較します。詳細度が大きいほうが優先されます。
  4. オリジンと重要度が同じで、セレクターの詳細度も同じ場合は、出現順を比較します。後に出現するほうが優先されます。

現代ではこれが以下のように拡張されています。

  1. オリジンと重要度

    1. CSS Transitions由来の仮想的な宣言 ↑強い
    2. ユーザーエージェント (Webブラウザ) による !important 宣言
    3. ユーザーによる !important 宣言
    4. 文書の作者による !important 宣言
    5. CSS Animations由来の仮想的な宣言
    6. 文書の作者による通常宣言
    7. 文書の作者による表現ヒント
    8. ユーザーによる通常宣言
    9. ユーザーエージェント (Webブラウザ) による通常宣言 ↓弱い
  2. カプセル化文脈。シャドウDOMの階層において、外側の文脈のほうが優先される。 !important では逆順。
  3. style 属性の優先
  4. レイヤー。最後のレイヤーが優先される。 !important では逆順。
  5. 強スコープ近接性 (Cascading and Inheritance 6)。当該要素からスコープへの木上の距離が近いほうが優先される。現時点では、強スコープ近接性と弱スコープ近接性のどちらが採用されるかは未確定。
  6. 詳細度。詳細度の大きいほうが優先される。
  7. 弱スコープ近接性 (Cascading and Inheritance 6)。当該要素からスコープへの木上の距離が近いほうが優先される。現時点では、強スコープ近接性と弱スコープ近接性のどちらが採用されるかは未確定。
  8. 出現順。後に出現したほうが優先される。

オリジン

オリジンは、そのスタイルを誰が指定したかをあらわす概念です。古典的なオリジンは以下の3種類です。

  • 文書の作者 (author) はHTML文書の提供元です。HTML文書から で参照されるスタイルにはこのオリジンが割り当てられます。
  • ユーザー (user) はWebブラウザを利用するユーザーです。ユーザーはWebブラウザの組み込み機能や拡張機能を使ってスタイルをカスタマイズすることが許されています。このような機能を使って当てられるスタイルにはこのオリジンが割り当てられます。
  • ユーザーエージェント (user agent) は、平たく言えばWebブラウザのことです。

これらはスタイルの提供者と利用者の関係にあるといえます。Webブラウザは



Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -