1. 序論
これは、 `~level 4$ からの差分~仕様である。 ◎ This is a diff spec against CSS Values and Units Level 4.
1.1. ~module間の相互作用
`~level 4$ は、 `CSS21$r の `§ 1.4.2.1@~TR/CSS2/about.html#value-defs$, `§ 4.3@~TR/CSS2/syndata.html#values$, `§ A.2@~TR/CSS2/aural.html#aural-intro$ による各種~data型~定義を置換して,拡張する。 この~moduleは、 `~level 4$ を拡張する。 ◎ This module extends [CSS-VALUES-4] which replaces and extends the data type definitions in [CSS21] sections 1.4.2.1, 4.3, and A.2.
2. ~textな~data型
`~level 4$ の `§ ~textな~data型@~CSSVAL#textual-values$ を見よ。 ◎ See CSS Values 4 § 4 Textual Data Types.
3. 値~定義の構文
`~level 4$ の `§ 値~定義の構文@~CSSVAL#value-defs$ を見よ。 ◎ See CSS Values 4 § 2 Value Definition Syntax.
加えて: ◎ Additionally,
- 条件付き記法を成す真偽値の組合n ◎ Boolean combinations of a conditional notation.\
- これらは、 `boolean-expr[]$t 記法を利用して記される。 それは、 ~keywordや丸括弧を利用して[ 角括弧~内に指定された文法に適用される真偽-論理 ]が成す再帰的な式を表現する。 (例: `媒体~query$を表出するための `boolean-expr[ <media-feature> ]$t )。 ◎ These are written using the <boolean-expr[]> notation, and represent recursive expressions of boolean logic using keywords and parentheses, applied to the grammar specified in brackets, e.g. <boolean-expr[ ( <media-feature> ) ]> to express media queries.
3.1. 関数-記法の定義
`~level 4$ の `§ 関数-記法の定義@~CSSVAL#component-functions$ を見よ。 ◎ See CSS Values 4 § 2.6 Functional Notation Definitions.
3.1.1. 関数の引数~群における~comma
`関数-記法$は、 その内部的な文法を成す各部を分離するために,~commaを利用することが多い。 しかしながら、 一部の関数( `mix$f など )は,値~自体が~commaを包含し得ることを許容する。 これらの値 (現時点では、 `whole-value$t, `declaration-value$t, `any-value$t ) は、 `~commaを包含する生成規則@ である。 ◎ Functional notation often uses commas to separate parts of its internal grammar. However, some functions (such as mix()) allow values that, themselves, can contain commas. These values (currently <whole-value>, <declaration-value>, and <any-value>) are comma-containing productions.
これらに類する文法を一義的に収容するため、 `~commaを包含する生成規則$は,任意選択で波括弧 — `{^g, `}^g — で括れる 【作者は、値を そのような形で記してもヨイ】。 これらの波括弧は、 構文上のものであり,実際の値の一部を成すものではない。 特定的に,`~commaを包含する生成規則$は: ◎ To accommodate these sorts of grammars unambiguously, the comma-containing productions can be optionally wrapped in curly braces {}. These braces are syntactic, not part of the actual value. Specifically:
- `{-token$t (左~波括弧)から開始することも, 開始しないこともできる。 ◎ A comma-containing production can either start with a "{" token, or not.
- `{-token$t から開始しない場合、 ~commaや`波括弧-~block$( `{} block^en )を包含し得ない — 当の生成規則が自身に対し定義する特有な制約が何であれ,それに加えて。 (当の生成規則の構文解析は,[ `comma-token$t / `{-token$t ]に出くわした所で停止され、[ ~comma/`波括弧-~block$ ]は,代わりに次に来る文法~項 — 【前者ならば、】おそらく,当の関数の自前の引数を分離している~comma — に合致する。) ◎ If it does not start with a "{" token, then it cannot contain commas or {} blocks, in addition to whatever specific restrictions it defines for itself. (The production stops parsing at that point, so the comma or {} block is matched by the next grammar term instead; probably the function’s own argument-separating comma.)
- `{-token$t から開始する場合、 それが開く`波括弧-~block$だけに合致する。 当の生成規則は、 この~blockを成す`内容^emを表現する。 加えて、 その内容に対し,何であれ[ 当の生成規則が自身に対し定義する特有な制約 ]を適用する — 当の~blockを括る波括弧を無視して。 ◎ If it does start with a "{" token, then the production matches just the {} block that the "{" token opens. It represents the contents of that block, and applies whatever specific restrictions it defines for itself to those contents, ignoring the {} block wrapper.
例えば `random-item$f 関数の文法: ◎ For example, the grammar of the random-item() function is:
random-item( `random-caching-options$t, [`declaration-value$t?]# )
において、 `#^g は, ~commaで分離された繰返nを指示するので、 3 個の~keywordから~randomに選ぶことは, 通常の関数と同じく次の様に書かれる: ◎ The # indicates comma-separated repetitions, so randomly choosing between three keywords would be written as normal for functions, like:
font-family: random-item(--x, serif, sans-serif, monospace);
しかしながら,ときには、 ~commaを含む必要がある値を選ぶことが求まれることもある。 この事例に該当するとき,値を波括弧で括ることは、 それらの~commaを[ 当の関数の引数どうしを分離している~comma ]から判別することを許容する: ◎ However, sometimes the values you want to choose between need to include commas. When this is the case, wrapping the values in {} allows their commas to be distinguished from the function’s argument-separating commas:
font-family: random-item(--x, {Times, serif}, {Arial, sans-serif}, {Courier, monospace});
これは、 3 個の[ ~font族たちが成す~list ] — `Times, serif^v, `Arial, sans-serif^v, `Courier, monospace^v — から 1 つを~randomに選ぶ。 ◎ This randomly chooses one of three font-family lists: either Times, serif, or Arial, sans-serif, or Courier, monospace.
波括弧の利用は、 一律的ではない。 それは、 それが必要になる`一部^emの引数に限って利用でき, 厳密に要求されないときでも許容される。 例えば: ◎ This is not all-or-nothing; you can use {} around some arguments that need it, while leaving others bare when they don’t need it. You are also allowed to use {} around a value when it’s not strictly required. For example:
font-family: random-item(--x, {Times, serif}, sans-serif, {monospace});
これは、 3 個の~font族~list — `Times, serif^v / `sans-serif@~CSSFONT#valdef-font-family-sans-serif$v / `monospace@~CSSFONT#valdef-font-family-monospace$v — から選ぶことを表現する。 ◎ This represents choosing between three font-family lists: either Times, serif, or sans-serif, or monospace.
しかしながら,この波括弧による括り法は、 一部の関数~引数 — `~commaを包含する生成規則$として定義されたもの — に`限り^em許容され,他の生成規則においては妥当でない — 他の関数~引数の周りに波括弧を利用した場合、 単に当の関数の文法に合致することに失敗し,無効になる。 例えば,次は、 無効になる: ◎ However, this {}-wrapping is only allowed for some function arguments—those defined as comma-containing productions. It’s not valid for any other productions; if you use {} around other function arguments, it’ll just fail to match the function’s grammar and become invalid. For example, the following is invalid:
background-image: linear-gradient(to left, {red}, magenta);
注記: ~blockを括る波括弧は,明示的に要求されない所でも許容されるので、 `var$f 様な`任意-代入~関数$に因り,~commaを包含するようになるか否か不確かなときでも、 作者は,それらを各~値の周りに防御的に利用できる。 例えば, `font-family:random-item(--x, {var(--list1)}, monospace)$p は、 ~custom~prop `--list1^p が~commaで分離された~listを包含するか否かに関わらず, 正しく働くことになる。 ◎ Note: Because {} wrappers are allowed even when not explicitly required, they can be used defensively around values when the author isn’t sure if they’ll end up containing commas or not, due to arbitrary substitution functions like var(). For example, font-family: random-item(--x, {var(--list1)}, monospace) will work correctly regardless of whether the --list1 custom property contains a comma-separated list or not.
`関数-記法$は、 アリなときは,~blockを括る波括弧を伴わずに直列化される。 ◎ Functional notations are serialized without {} wrappers whenever possible.
次に挙げる汎用な生成規則は、 `~commaを包含する生成規則$である: ◎ The following generic productions are comma-containing productions:
- `any-value$t ◎ <any-value>
- `whole-value$t ◎ <whole-value>
- `declaration-value$t ◎ <declaration-value>
旧来との互換性の理由から、 `var$f 関数の~fallback値~用に定義された `declaration-value$t は、 `~commaを包含する厳密でない生成規則@ になる。 それは: ◎ For legacy compat reasons, the <declaration-value> defined the fallback value for var() is a non-strict comma-containing production.\
- `{-token$t から開始しないときには、 それが何を包含し得るかを制約する規則を無視する — すなわち、[ ~comma, `波括弧-~block$ ]を包含することは許容される。 ◎ It ignores the rules restricting what it can contain when it does not start with a "{" token: it is allowed to contain commas and {} blocks.\
- `{-token$t から`開始するとき^emには、 依然として,標準な`~commaを包含する生成規則$の規則に従う。 しかしながら,当の~fallback値は、 当の`波括弧-~block$の内容だけになり,それを括る波括弧を含まない。 ◎ It still follows the standard comma-containing production rules when it does start with a "{" token, however: the fallback is just the contents of the {} block, and doesn’t include the {} wrapper itself.
他の文脈は, `~commaを包含する厳密でない生成規則$を利用するものと定義しても`ヨイ^emが、 必要yでない限り,避ける`ベキ^emである。 ◎ Other contexts may define that they use non-strict comma-containing productions, but it should be avoided unless necessary.
3.2. 真偽-式の複化子: `boolean-expr[]^t
いくつかの文脈( `media$at, `supports$at, `if$f, ...など)は、[ 条件たちを指定して, それらを真偽-論理( `and^v / `or^v / `not^v / ~group化)で組合せる ]ことを許容する。 それらは,同じ自明でない再帰的な構文~構造を利用するので、 特別な `boolean-expr[]@t 生成規則が,この~patternを汎用~的に表現する。 ◎ Several contexts (such as @media, @supports, if(), ...) specify conditions, and allow combining those conditions with boolean logic (and/or/not/grouping). Because they use the same non-trivial recursive syntax structure, the special <boolean-expr[]> production represents this pattern generically.
`boolean-expr[]$t 記法は、 その中の角括弧~内に別の値~型 %型 を包装する (例: `boolean-expr[ <test> ]^t 【!`boolean[ <test> ]^t】)。 【言い換えれば、別の値~型(例: `test^t )で~parameter化された型である。】 それは、 %型 を成す 1 個の値, あるいは 真偽-組合n — ~keyword[ `not^v【!@~MQ5#valdef-media-not】/ `and^v / `or^v ]や[ ~group化するための丸括弧 ]を利用している組合n — 【を %型 を成す値たちに適用した結果】を表現する。 それは、 正式には,次と等価になる: ◎ The <boolean-expr[]> notation wraps another value type in the square brackets within it, e.g. <boolean[ <test> ]>, and represents that value type alone as well as boolean combinations using the not, and, and or keywords and grouping parenthesis. It is formally equivalent to:
`boolean-expr[ <test> ]^t = not `boolean-expr-group^t | `boolean-expr-group^t [ [ and `boolean-expr-group^t ]* | [ or `boolean-expr-group^t ]* ] `boolean-expr-group^t = `test^t | ( `boolean-expr[ <test> ]^t ) | `general-enclosed$t
`boolean-expr[]$t 生成規則は、[ `真^i / `偽^i / `未知^i ]値を表現する。 その値は、 ~Kleeneの 3-値~論理を利用して解決される — ただし,~top-levelの (すなわち,別の `boolean-expr[]$t を成す文法の内側に直に入子にされていない) `未知^i は、 他が指定されない限り, `偽^i に解決される。 詳細は `§ 真偽-論理@#boolean-logic$を見よ。 ◎ The <boolean-expr[]> production represents a true, false, or unknown value. Its value is resolved using 3-value Kleene logic, with top-level unknown values (those not directly nested inside the grammar of another <boolean-expr[]>) resolving to false unless otherwise specified; see Appendix B: Boolean Logic for details.
例えば, `container$at 規則は、 多様な~testを許容する — ~size~query, ~style~query, ~scroll状態~queryなど。 これらすべては、 真偽-論理と任意に組合せることが可能である。 `container^at 規則を成す容器~query用の文法は、 `boolean-expr[]$t を利用して,次のように書くこともできる: ◎ For example, the @container rule allows a wide variety of tests: including size queries, style queries, and scroll-state queries. All of these are arbitrarily combinable with boolean logic. Using <boolean-expr[]>, the grammar for an @container query could be written as:
`container-query^t = `boolean-expr[ <cq-test> ]^t `cq-test^t = (`size-query^t) | style( `style-query^t ) | scroll-state( `scroll-state-query^t ) `size-query^t = `boolean-expr[ ( <size-feature> ) ]^t | `size-feature^t `style-query^t = `boolean-expr[ ( <style-feature> ) ]^t | `style-feature^t `scroll-state-query^t = `boolean-expr[ ( <scroll-state-feature> ) ]^t | `scroll-state-feature^t
この論理を成す分岐 `general-enclosed$t は、 将来との互換性を許容する — 新たな式は、 それを~supportしない~UAにおいては,他が指定されない限り “未知なもの” として[ 構文解析される/見なされる ]ことになる — 当の式【!生成規則】を無効~化することなく。 そのような許容との一貫性を得るため、 `boolean-expr[]$t 内の `test^t 項は, `general-enclosed^t に合致する【にも合致する?】よう定義されるベキである。 ◎ The <general-enclosed> branch of the logic allows for future compatibility—unless otherwise specified new expressions in an older UA will be parsed and considered “unknown”, rather than invalidating the production. For consistency with that allowance, the <test> term in a <boolean-expr[]> should be defined to match <general-enclosed>.
3.3. ~CSSにおける~CSS構文の指定-法: `syntax^t 型
~CSSにおける一部の特能 — `attr$f 関数, `登録-済み~custom~prop$など — は、[ `別の^em値が,どう構文解析されるものと意味されるか ]を指定することを許容する。 これは、 `syntax$t 生成規則を介して宣言される。 それは、[ 仕様において~CSS特能を定義するために利用される,~CSSの`値~定義の構文$ ]を制限した形を真似る。 それは、 ある`構文~定義$を表現する: ◎ Some features in CSS, such as the attr() function or registered custom properties, allow you to specify how another value is meant to be parsed. This is declared via the <syntax> production, which resembles a limited form of the CSS value definition syntax used in specifications to define CSS features, and which represents a syntax definition:
`syntax@t = '*' | `syntax-component$t [ `syntax-combinator$t `syntax-component$t ]* | `syntax-string$t `syntax-component@t = `syntax-single-component$t `syntax-multiplier$t? | '<' transform-list '>' `syntax-single-component@t = '<' `syntax-type-name$t '>' | `ident$t `syntax-type-name@t = angle | color | custom-ident | image | integer | length | length-percentage | number | percentage | resolution | string | time | url | transform-function `syntax-combinator@t = '|' `syntax-multiplier@t = [ '#' | '+' ] `syntax-string@t = `string$t
`syntax-component$t 【を成す `syntax-single-component$t 】は、 次のいずれかからなる: ◎ A <syntax-component> consists of either\
- `<^g, `>^g (山括弧)で括られた `syntax-type-name$t — `~supportされる構文~成分~名$のうち いずれかへ対応付けられる。 ◎ a <syntax-type-name> between <> (angle brackets), which maps to one of the supported syntax component names,\
- `ident$t — 任意の`~keyword$を表現する。 ◎ or an <ident>, which represents any keyword.\ ◎ ↓ Additionally, a <syntax-component> may contain a multiplier, which indicates a list of values.
注記: このことは、 `<length>^g と `length^g は、 2 つの異なる型を表すことを意味する: 前者は `length$t を述べる一方で、 後者は`~keyword$ `length^v を述べる。 ◎ Note: This means that <length> and length are two different types: the former describes a <length>, whereas the latter describes a keyword length.
`syntax-component$t は、 `複化子$を包含してもヨイ — それは、 成分~値たちが成す`~list$であることを指示する。 ◎ ↑
複数個の `syntax-component$t を `delim-token$t `|^g で`結合-@~CSSPV1#combinator$してもヨイ — それは、 値に対し,各~構文~成分を指定した順序で照合させる。 ◎ Multiple <syntax-component>s may be combined with a | <delim-token>, causing the syntax components to be matched against a value in the specified order.
<percentage> | <number> | auto
これは, `syntax$t として構文解析されたときには、[ `percentage$t 値, `number$t 値, ~keyword `auto^v ]を受容するようになる。 ◎ The above, when parsed as a <syntax>, would accept <percentage> values, <number> values, as well as the keyword auto.
red | <color>
この `syntax$t 値を構文解析した結果の`構文~定義$が,`構文解析@~CSSSYN#css-parse-something-according-to-a-css-grammar$用の文法として利用されたときには、 入力[ `red^v / `blue^v ]は[ `~CSS識別子$/ `color$t ]として合致するようになる。 ◎ The syntax definition resulting from the above <syntax>, when used as a grammar for parsing, would match an input red as an identifier, but would match an input blue as a <color>.
`delim-token$t `*^g は、 `全称~構文~定義$を表現する。 ◎ The * <delim-token> represents the universal syntax definition.
値 `<transform-list>^v は、
`transform-list$t 生成規則に対応する
— それは、
`transform-function$t+
に等価な便利~用の形である。
これは、
`syntax-multiplier$t が後続しなくともよいことに注意。
◎
The <transform-list> production is a convenience form equivalent to <transform-function>+. Note that <transform-list> may not be followed by a <syntax-multiplier>.
次に挙げる箇所には、 `空白$は許容されない: ◎ Whitespace is not allowed\
- `syntax-type-name$t とそれを括る山括弧 — `delim-token$t `<^g, `>^g — の合間 ◎ between the angle bracket <delim-token>s (< >) and the <syntax-type-name> they enclose,\
- `syntax-multiplier$t の直前 ◎ nor is whitespace allowed to precede a <syntax-multiplier>.
注記: `空白$に対する制約は、 `<transform-list>^v にも適用される。 ◎ Note: The whitespace restrictions also apply to <transform-list>.
`syntax-string$t 値は、 `syntax$t 【を成す `syntax-string$t 以外?】の`文法に則って構文解析-$した結果が `失敗^i にならない `string$t であり,当の `syntax$t と同じ値【構文?】を表現する。 ◎ A <syntax-string> is a <string> whose value successfully parses as a <syntax>, and represents the same value as that <syntax> would.
注記: `syntax-string$t は、 ほぼ歴史的な目的で存在する — `syntax$t が定義される前は、 `property$at 規則が,この目的に `string$t を利用していた。 ◎ Note: <syntax-string> mostly exists for historical purposes; before <syntax> was defined, the @property rule used a <string> for this purpose.
3.3.1. `syntax$t としての構文解析-法
`syntax$t の目的は、 通例的には,別の値を構文解析する方法を指定することにある (ある`登録-済み~custom~prop$の値や `attr$f が参照する属性の値など)。 しかしながら,汎用な[ 何かを`文法に則って構文解析-$する~algo ]は、 未指定な内部~構造を返す — 構文解析した結果は多義的になるかもしれず、 その場合,更に解きほぐすことが必要になるので。 ◎ The purpose of a <syntax> is usually to specify how to parse another value (such as the value of a registered custom property, or an attribute value in attr()). However, the generic parse something according to a CSS grammar algorithm returns an unspecified internal structure, since parse results might be ambiguous and need further massaging.
これらの課題を避けて,きちんと定義された結果を取得するため、 `構文~値で構文解析する$~algoが利用される: ◎ To avoid these issues and get a well-defined result, use parse with a <syntax>:
`構文~値で構文解析する@ ときは、 所与の ( `文字列$ / [ ~token/`成分~値$ ]たちが成す`~list$ ] %値~群, `syntax$t 値 %構文, 文脈~用の要素 %要素 (省略時は ε ) ) に対し,次の手続きを遂行する — それは、[ ~CSS値たちが成す`~list$/ ε(`無効が保証される値$を表現する) ]を返す: ◎ To parse with a <syntax> given a string or list or component values values, a <syntax> value syntax, and optionally an element el for context, perform the following steps. It returns either CSS values, or the guaranteed-invalid value.
- %値~群 ~LET`成分~値~listを構文解析する$( %値~群 ) ◎ Parse a list of component values from values, and let raw parse be the result.
- ~IF[ %要素 ~NEQ ε ] ⇒ %値~群 ~SET %値~群 内の`任意-代入~関数たちへ代入する$ ◎ If el was given, substitute arbitrary substitution functions in raw parse, and set raw parse to that result.
-
%分岐~群 ~LET %構文 に応じて
⇒#
`*^v ならば «
`declaration-value$t?
が表現する構文 » / ~ELSE_ %構文 を成す `syntax-component$t たちが成す指定された順の`~list$ ◎ ↓ - %構文解析-結果 ~LET `失敗^i ◎ ↓
-
%分岐~群 を成す ~EACH( %分岐 ) に対し:
- ~Assert: 何かを %分岐 の`文法に則って構文解析-$した結果は一義的に定義される
- %構文解析-結果 ~LET %値~群 を %分岐 の`文法に則って構文解析-$する
- ~IF[ %構文解析-結果 ~NEQ `失敗^i ] ⇒ ~BREAK
- ~IF[ %構文解析-結果 ~EQ `失敗^i ] ⇒ ~RET ε ◎ If parsed result is failure, return the guaranteed-invalid value.
- ~RET %構文解析-結果 ◎ ↑ Assert: parsed result is now a well-defined list of one or more CSS values, since each branch of a <syntax> defines an unambiguous parse result (or the * syntax is unambiguous on its own). ◎ Return parsed result.
注記: この~algoは、[ 構文解析された値を`算出d値$の中へ解決する ]ことはない — 当の値を利用した文脈は、 通例的に,それをすでに行うことになるので【?】 — そうでない場合、 呼出している~algoは,それを自前で取扱う必要があることになる。 ◎ Note: This algorithm does not resolved the parsed values into computed values; the context in which the value is used will usually do that already, but if not, the invoking algorithm will need to handle that on its own.
4. ~level 4 の値~型に対する拡張
`~level 4$ を見よ。 ◎ See CSS Values and Units Level 4.
4.1. 資源の所在指定子: `url$t 型
`~level 4$ の `§ 資源の所在指定子@~CSSVAL#urls$ を見よ。 ◎ See CSS Values 4 § 4.5 Resource Locators: the <url> type.
4.1.1. 要請~URL改変子
`request-url-modifier@t 【 “要請~URL改変子” 】は、 `url-modifier$t を表現する — それは、 自身に結付けられた`~URLの要請~改変子~用の手続き$を適用することにより, `url$t への資源`要請$に影響する。 `~level 4$ の `§ ~URL処理~model@~CSSVAL#url-processing$ を見よ。 ◎ <request-url-modifier>s are <url-modifier>s that affect the <url>’s resource request by applying associated URL request modifier steps. See CSS Values 4 § 4.5.4 URL Processing Model.
この仕様は、 次に挙げる `request-url-modifier$t を定義する: ◎ This specification defines the following <request-url-modifier>s:
`request-url-modifier$t = `crossorigin-modifier$t | `integrity-modifier$t | `referrerpolicy-modifier$t◎ <request-url-modifier> = <crossorigin-modifier> | <integrity-modifier> | <referrerpolicy-modifier> ↓↓ <crossorigin-modifier> = crossorigin(anonymous | use-credentials) ↓↓ <integrity-modifier> = integrity(<string>) ↓↓ <referrerpolicy-modifier> = referrerpolicy(no-referrer | no-referrer-when-downgrade | same-origin | origin | strict-origin | origin-when-cross-origin | strict-origin-when-cross-origin | unsafe-url)
-
`crossorigin-modifier@t = `crossorigin@v(`anonymous@v | `use-credentials@v)
-
この改変子~用の`~URLの要請~改変子~用の手続き$は、 所与の ( `要請$ %要請 ) に対し: ◎ The URL request modifier steps for this modifier given request req are:
- `要請$の`~mode$rq ~SET `cors^l ◎ Set request's mode to "cors".
- ~IF[ 引数に与えられた値 ~EQ `use-credentials$v ] ⇒ `要請$の`資格証~mode$rq ~SET `include^l ◎ If the given value is use-credentials, set request's credentials mode to "include".
-
`integrity-modifier@t = `integrity@v(`string$t)
- この改変子~用の`~URLの要請~改変子~用の手続き$は、 所与の ( `要請$ %要請 ) に対し ⇒ %要請 の`完全性~metadata$rq ~SET 引数に与えられた `string$t ◎ The URL request modifier steps for this modifier given request req are to set request's integrity metadata to the given <string>.
-
`referrerpolicy-modifier@t = `referrerpolicy@v( `no-referrer@v | `no-referrer-when-downgrade@v | `same-origin@v | `origin@v | `strict-origin@v | `origin-when-cross-origin@v | `strict-origin-when-cross-origin@v | `unsafe-url@v )
- この改変子~用の`~URLの要請~改変子~用の手続き$は、 所与の ( `要請$ %要請 ) に対し ⇒ %要請 の`~referrer施策$rq ~SET 引数に与えられた値に合致する `ReferrerPolicy$I 値 ◎ The URL request modifier steps for this modifier given request req are to set request's referrer policy to the ReferrerPolicy that matches the given value.
`~URL値からの要請~改変子を適用する@ ときは、 所与の ( `要請$ %要請, `url$t %~URL ) に対し ⇒ %~URL 内に指定された ~EACH( `request-url-modifier$t %改変子 ) に対し ⇒ %改変子 用の`~URLの要請~改変子~用の手続き$( %要請 ) ◎ To apply request modifiers from URL value given a request req and a <url> url, call the URL request modifier steps for url’s <request-url-modifier>s in sequence given req.
4.2. 二次元な位置決め: `position^t 型
`position@t 値は、 `整列~容器$(例:`背景~位置決め区画$)の内側における`整列~subject$(例:背景~画像)の位置を[ 指定された 2 辺 (既定では左端と上端)に対する~offset ]が成す~pairとして指定する。 その構文は: ◎ The <position> value specifies the position of an alignment subject (e.g. a background image) inside an alignment container (e.g. its background positioning area) as a pair of offsets between the specified edges (defaulting to the left and top). Its syntax is:
`position$t = `position-one$t | `position-two$t | `position-four$t `position-one@t = left | center | right | top | bottom | x-start | x-end | y-start | y-end | block-start | block-end | inline-start | inline-end | `length-percentage$t `position-two@t = [ left | center | right | x-start | x-end ] && [ top | center | bottom | y-start | y-end ] | [ left | center | right | x-start | x-end | `length-percentage$t ] [ top | center | bottom | y-start | y-end | `length-percentage$t ] | [ block-start | center | block-end ] && [ inline-start | center | inline-end ] | [ start | center | end ]{2} `position-four@t = [ [ left | right | x-start | x-end ] `length-percentage$t ] && [ [ top | bottom | y-start | y-end ] `length-percentage$t ] | [ [ block-start | block-end ] `length-percentage$t ] && [ [ inline-start | inline-end ] `length-percentage$t ] | [ [ start | end ] `length-percentage$t ]{2}
指定された成分~値の個数に応じて: ◎ ↓
- 1 個( `position-one$t ) ⇒ 2 個目の値は `center$vP であると見做される。 ◎ If only one value is specified (<position-one>), the second value is assumed to be center.
-
2 個( `position-two$t ): ◎ If two values are given (<position-two>),\
- `length-percentage$t は、[ 1 個目/ 2 個目 ]の値としては[ 横/縦 ]位置を`整列~容器$の[ 左端/上端 ]辺から`整列~subject$の[ 左端/上端 ]辺までの~offsetとして表現する。 ◎ a <length-percentage> as the first value represents the horizontal position as the offset between the left edges of the alignment subject and alignment container,\ and a <length-percentage> as the second value represents the vertical position as an offset between their top edges.
- どちらの~keywordも[ `start^v / `end^v ]である場合、 順に,[ `塊-軸$, `行内-軸$ ]を表現する。 ◎ If both keywords are one of start or end, the first one represents the block axis and the second the inline axis.
注記: 軸に特有な 2 個の~keywordが成す~pairは,並替えれる一方、 ~keywordと[ 長さ/百分率 ]の組合nは,そうでない。 なので、 `center left^v や `inline-start block-end^v は妥当であるが, `50% left^v は妥当でない。 [ `start^v, `end^v ]は軸に特有でないので、[ `start end^v, `end start^v ]は異なる位置を表現する。 ◎ Note: A pair of axis-specific keywords can be reordered, while a combination of keyword and length or percentage cannot. So center left or inline-start block-end is valid, while 50% left is not. start and end aren’t axis-specific, so start end and end start represent two different positions.
- 4 個( `position-four$t ) ⇒ 各 `length-percentage$t は、 その直前にある~keywordにより指定される辺に対する~offsetを表現する。 例えば【!background-position:】 `bottom 10px right 20px^v は、 【`整列~容器$の】[ 下端~辺から上への縦~offset `10px^v, 右端~辺から左への横~offset `20px^v ]を表現する。 ◎ If four values are given (<position-four>) then each <length-percentage> represents an offset between the edges specified by the preceding keyword. For example, background-position: bottom 10px right 20px represents a 10px vertical offset up from the bottom edge and a 20px horizontal offset leftward from the right edge.
いずれも、[ 正な値/負な値 ]は,`整列~容器$の辺から[ `内方^em/`外方^em ]への~offsetを表現する。 ◎ Positive values represent an offset inward from the edge of the alignment container. Negative values represent an offset outward from the edge of the alignment container.
次に挙げる宣言は、 左上~隅からの【!the stated】[ 横, 縦 ]~offsetを与える: ◎ The following declarations give the stated (horizontal, vertical) offsets from the top left corner:
background-position: left 10px top 15px; /* 10px, 15px */ background-position: left top ; /* 0px, 0px */ background-position: 10px 15px; /* 10px, 15px */ background-position: left 15px; /* 0px, 15px */ background-position: 10px top ; /* 10px, 0px */
`position$t は、 左上でない隅からも相対的にし得る。 例えば,次は、 背景~画像【の右下~隅】を[ 右端から `3em^v, 下端から `10px^v ]の所に置く: ◎ <position>s can also be relative to other corners than the top left. For example, the following puts the background image 10px from the bottom and 3em from the right:
background-position: right 3em bottom 10px
`position$t の`算出d値$は、 ( 横~offset, 縦~offset ) が成す~pair — 各~offsetは、 算出d `length-percentage$t 値【`算出d長さ$?】 — になる。 この[ 横~offset/縦~offset ]は、 `整列~容器$の[ 左端~辺/上端~辺 ]から`整列~subject$の[ 左端~辺/上端~辺 ]までの距離を表現する。 ◎ The computed value of a <position> is a pair of offsets (horizontal and vertical), each given as a computed <length-percentage> value, representing the distance between the left edges and top edges (respectively) of the alignment subject and alignment container.
- `length-percentage$t
-
`length-percentage$t 値は、 `整列~容器$から`整列~subject$までの指定された辺に関する~offset【!の~size】を指定する。 ◎ A <length-percentage> value specifies the size of the offset between the specified edges of the alignment subject and alignment container.
例えば `background-position: 2cm 1cm$p は、 背景~画像の左上~隅を`背景~位置決め区画$の左上~隅から[ 右へ `2cm^v, 下へ `1cm^v ]の所に配置する。 ◎ For example, for background-position: 2cm 1cm, the top left corner of the background image is placed 2cm to the right and 1cm below the top left corner of the background positioning area.
-
[ 横~offset/縦~offset ]用の `percentage$t は、 `整列~容器$の[ 横幅/縦幅 ]から`整列~subject$の[ 横幅/縦幅 ]を減算した結果に相対的になる。 ◎ A <percentage> for the horizontal offset is relative to (width of alignment container - width of alignment subject). A <percentage> for the vertical offset is relative to (height of alignment container - height of alignment subject).
例えば: 値~pair `0% 0%^v に対しては、 `整列~subject$の左上~隅が,`整列~容器$の左上~隅に整列される。 値~pair `100% 100%^v に対しては、 `整列~subject$の右下~隅が,`整列~容器$の右下~隅に整列される。 値~pair `75% 50%^v に対しては、 `整列~subject$の左上~隅から[ 75% 右, 50% 下 ]を指す地点が,`整列~容器$の左上~隅から[ 75% 右, 50% 下 ]を指す地点に整列するよう配置される (下図)。 ◎ For example, with a value pair of 0% 0%, the upper left corner of the alignment subject is aligned with the upper left corner of the alignment container A value pair of 100% 100% places the lower right corner of the alignment subject in the lower right corner of the alignment container. With a value pair of 75% 50%, the point 75% across and 50% down the alignment subject is to be placed at the point 75% across and 50% down the alignment container.
- `top@vP
- `right@vP
- `bottom@vP
- `left@vP
- 対応する軸において, `整列~subject$の[ 上端/左端/右端/下端 ]辺(同順)を`整列~容器$の辺から指定された量(既定では `0%^v )で~offsetする。 ◎ Offsets the top/left/right/bottom edges (respectively) of the alignment subject and alignment container by the specified amount (defaulting to 0%) in the corresponding axis.
- `y-start@vP
- `y-end@vP
- `x-start@vP
- `x-end@vP
- 順に,[ `縦~軸$における`始端$ / `縦~軸$における`終端$ / `横~軸$における`始端$ / `横~軸$における`終端$ ]側に対応する物理-辺~keywordと同じに算出される。 ◎ Computes the same as the physical edge keyword corresponding to the start/end side in the [=y-axis|y/x axis.
- `block-start@vP
- `block-end@vP
- `inline-start@vP
- `inline-end@vP
- 順に,[ `塊-軸$における`始端$ / `塊-軸$における`終端$ / `行内-軸$における`始端$ / `行内-軸$における`終端$ ]側に対応する物理-辺~keywordと同じに算出される。 ◎ Computes the same as the physical edge keyword corresponding to the start/end side in the block/inline axis.
- `center@vP
- 対応する軸における~offset `50%^v に算出される。 ◎ Computes to a 50% offset in the corresponding axis.
他が指定されない限り、 `~flow相対$な~keyword【が どの物理-辺~keywordに対応するか】は,それが指定された要素の`書字~mode$に則って解決される。 ◎ Unless otherwise specified, the flow-relative keywords are resolved according to the writing mode of the element on which the value is specified.
注記: `background-position$p ~propは,成分~値 3 個の構文も受容するが、 汎用~的には許容されない — ~prop値~内で他の[ 長さ/百分率 ]成分と組合されたとき,構文解析-時に多義性をもたらすので。 ◎ Note: The background-position property also accepts a three-value syntax. This has been disallowed generically because it creates parsing ambiguities when combined with other length or percentage components in a property value.
この構文が[ `background-position$p において,その`下位prop$たちへどう展開されるか ]を定義する必要がある — 例えば、 ある成分に `var$f が利用された場合に。 [`9690$issue] ◎ Need to define how this syntax would expand to the longhands of background-position if e.g. var() is used for some (or all) of the components. [Issue #9690]
4.2.1. `position^t の構文解析-法
文法~内で他の[ ~keyword / `length$t / `percentage$t ]と並べて指定された `position$t は、 `貪欲に^em構文解析され,アリな限り多くの成分を消費する。 ◎ When specified in a grammar alongside other keywords, <length>s, or <percentage>s, <position> is greedily parsed; it consumes as many components as possible.
例えば `transform-origin$p は、 三次元な位置を (実質的に) `position$t `length$t? として定義する。 `left 50px^v などの値は,[ z 成分が省略された,2 個の成分からなる `position$t 値 ]として構文解析される一方、 `top 50px^v などの値は,[ 1 個の成分からなる `position$t 値, `length$t 値 ]が成す並びとして構文解析されることになる。 ◎ For example, transform-origin defines a 3D position as (effectively) <position> <length>?. A value such as left 50px will be parsed as a 2-value <position>, with an omitted z-component; on the other hand, a value such as top 50px will be parsed as a single-value <position> followed by a <length>.
4.2.2. `position^t の直列化-法
`position$t の`指定d値$を直列化するときは、 指定された成分の個数に応じて: ◎ When serializing the specified value of a <position>:
- 1 個( `position-one$t ) ⇒ 暗黙な~keyword `center$vP を追加した上で, 2 個の場合に従う。 ◎ If only one component is specified: • The implied center keyword is added, and a 2-component value is serialized.
-
2 個( `position-two$t ): ◎ If two components are specified:
- 各~keywordは、 そのまま~keywordとして直列化する。 ◎ Keywords are serialized as keywords.
- 各 `length-percentage$t は、 `length-percentage$t として直列化する。 ◎ <length-percentage>s are serialized as <length-percentage>s.
- これらは、[ 横~成分, 縦~成分 ]の順に直列化する。 ◎ Components are serialized horizontal first, then vertical.
-
4 個( `position-four$t ): ◎ If four components are specified:
- 各[ ~keyword, ~offset ]は、 どちらも直列化する。 ◎ Keywords and offsets are both serialized.
-
これらは、[ 横~成分, 縦~成分 ]の順に, あるいは[ `塊-軸$, `行内-軸$ ]の順に直列化する。 ◎ Components are serialized horizontal first, then vertical; alternatively block-axis first, then inline-axis.
【 後者の順に直列化されるのは、[ `block-^v / `inline-^v ]が接頭された~keywordが利用された場合に限られると思われる ( 2 個の場合も同様になるべき?)。 】
注記: `position$t 値が 1 個の成分からなる値として直列化されることは、 決してない — そのような値が同じ挙動を生産するときでも。 これは、 `position$t が `length$t の隣に配置される一部の文法 — `transform-origin$p など — において,構文解析の多義性が生じるのを避けるためである。 ◎ Note: <position> values are never serialized as a single value, even when a single value would produce the same behavior, to avoid causing parsing ambiguities in some grammars where a <position> is placed next to a <length>, such as transform-origin.
`position$t の`算出d値$は、[ 左端, 上端 ]辺からの~offsetを[ 同じ順序で表現する 2 個の`length-percentage$t が成す~pair ]として直列化される。 ◎ The computed value of a <position> is serialized as a pair of <length-percentage>s representing offsets from the left and top edges, in that order.
4.2.3. `position^t の結合n
`position$t の`補間$は、 値を成す[ x, y ]成分ごとに独立に,[ 左上~隅からの~offsetに正規化された `length-percentage$t ]として`補間-$するものとして定義される。 ◎ Interpolation of <position> is defined as the independent interpolation of each component (x, y) normalized as an offset from the top left corner as a <length-percentage>.
同様に, `position$t の`加算$は、 値を成す[ x, y ]成分ごとに独立に,[ 左上~隅からの~offsetに正規化された `length-percentage$t ]として`加算-$するものとして定義される。 ◎ Addition of <position> is likewise defined as the independent addition each component (x, y) normalized as an offset from the top left corner as a <length-percentage>.
5. 補間~進捗-関数-記法
この節は、 探求段階な草案であり,まだ~CSS~WGにより認可されてない。 `6245$issue ◎ This section is an exploratory draft, and not yet approved by the CSSWG. [Issue #6245]
`関数-記法$[ `progress$f / `media-progress$f / `container-progress$f ]は、[ `~math関数$/`媒体~特能$/`容器~特能$ ]から進捗~率を取り出すことを許容する。 いずれも、 所与の[ `進捗~値@, `進捗~始端~値@, `進捗~終端~値@ ]に対し[ `進捗~始端~値$からの, `進捗~終端~値$までの距離に対する`進捗~値$までの距離の~~割合 ]を表現し,次の共通な構文-~patternに従う: ◎ The progress(), media-progress(), and container-progress() functional notations represent the proportional distance of a given value (the progress value) from one value (the progress start value) to another value (the progress end value). They allow drawing a progress ratio from math functions, media features, and container features, respectively, following a common syntactic pattern:
%進捗~関数() = %進捗~関数( %進捗-値 from %始端~値 to %終端~値 )
その結果は `number$t であり、 `進捗~関数を計算する$ことにより解決される。 ◎ Each resolves to a <number> by calculating a progress function.
`進捗~関数を計算する@ ときは、 所与の ( `進捗~値$ %値, `進捗~始端~値$ %始端~値, `進捗~終端~値$ %終端~値 ) に対し: ◎ To calculate a progress function, given a progress value, progress start value, and progress end value:
- ~IF[ %始端~値 ~NEQ %終端~値 ] ⇒ ~RET ( %値 ~MINUS %始端~値 ) ~DIV ( %終端~値 ~MINUS %始端~値 ) ◎ If the progress start value and progress end value are different values • (progress value - progress start value) / (progress end value - progress start value).
- ~RET %値 に応じて ⇒# %値 ~LT %始端~値 ならば −∞ / %値 ~GT %始端~値 ならば +∞ / %値 ~EQ %始端~値 ならば 0 ◎ If the progress start value and progress end value are the same value • 0, -∞, or +∞, depending on whether progress value is equal to, less than, or greater than the shared value.
注記: 返り値は素な `number$t であり、 既定では,結果の`型を入力と一貫させる$ことはない。 ◎ Note: The return value is a plain <number>, not made consistent with its arguments by default.
結果の型は `number$t なので、 他の計算式 — `~math関数$や`混合-記法$など — の中への入力を成し得る。 ◎ The resulting number can then be input into other calculations, such as a math function or a mix notation.
5.1. 計算された進捗-値: `progress^f 記法
`progress@f `関数-記法$は、 次を表現している `number$t 値を返す ⇒ 入力を成す 2 個の`計算式$ %計算式たち (`進捗~始端~値$, `進捗~終端~値$) の合間における`計算式$(`進捗~値$)の位置 ◎ The progress() functional notation returns a <number> value representing the position of one calculation (the progress value) between two other calculations (the progress start value and progress end value).\
`progress$f は`~math関数$である。 ◎ progress() is a math function.
`progress$f の構文は: ◎ The syntax of progress() is defined as follows:
`progress()@t = progress(`calc-sum$t, `calc-sum$t, `calc-sum$t)
各 `calc-sum$t 値は、 順に[ `進捗~値$, `進捗~始端~値$, `進捗~終端~値$ ]を表現する。 ◎ where the first, second, and third <calc-sum> values represent the progress value, progress start value, and progress end value, respectively.
%計算式たち を成す各~計算式は、[ `number$t, `dimension$t, `percentage$t ]いずれにも解決され得るが, %計算式たち は`一貫した型を有して$いなければナラナイ — さもなければ、 当の関数は無効になる。 ◎ The argument calculations can resolve to any <number>, <dimension>, or <percentage>, but must have a consistent type or else the function is invalid.
`progress$f の値は、 数量-値としては`進捗~関数を計算する$ことにより決定される `number$t になり, その`型$は次の結果になる ⇒ `型を入力と一貫させる$( `型を作成する$( `number^l ) , %計算式たち の`一貫した型$ ) ◎ The value of progress() is a <number>, determined by calculating a progress function, then made consistent with the consistent type of its arguments.
`percent-progress^f 記法は必要か? あるいは、 必要yでないほど十分な箇所で【百分率から】自動-変換されているのか? ◎ Do we need a percent-progress() notation, or do enough places auto-convert that it’s not necessary?
注記: `progress$f 関数は、 本質的には `calc$f 記法が成す特定0の~pattern用の構文-糖衣なので,`~math関数$である。 ◎ Note: The progress() function is essentially syntactic sugar for a particular pattern of calc() notations, so it’s a math function.
5.2. 媒体~query進捗-値: `media-progress^f 記法
`media-progress@f `関数-記法$は、 `progress$f 記法と類似に,[ 指定された`媒体~query$ `MEDIAQUERIES-4$r の現在の値【`実~値$】 ]を[ 当の`媒体~query$用の 2 個の明示的な値 (`進捗~始端~値$, `進捗~終端~値$) の合間における`進捗~値$ ]として表現している `number$t 値 を返す。 ◎ Similar to the progress() notation, the media-progress() functional notation returns a <number> value representing current value of the specified media query [MEDIAQUERIES-4] as a progress value between two explicit values of the media query (as the progress start value and progress end value).
`media-progress$f の構文は: ◎ The syntax of media-progress() is defined as follows:
`media-progress()@t = media-progress(`mf-name$t, `calc-sum$t, `calc-sum$t)
各~引数は:
- `mf-name$t は、 ある`媒体~特能$ %特能 を指定する — %特能 の値【`実~値$】が,`進捗~値$を表現する。
- 2 個の`計算式$ `calc-sum$t の値[ %始端~値, %終端~値 ]は、 順に[ `進捗~始端~値$, `進捗~終端~値$ ]を表現する。
これらの引数は、 ~AND↓ を満たさなければナラナイ — さもなければ、 当の関数は無効になる:
- `mf-name$t は、 妥当な`範囲~型$【!“range” type】の`媒体~特能$を識別している
- [ %始端~値, %終端~値 ]は、 %特能 用の妥当な値を指定している
- « %始端~値, %終端~値 » は、 `一貫した型を有して$いる
[ %始端~値, %終端~値 ]における単位は、 %特能 に指定されたとおりに解釈される (当の関数を利用している文脈により指定されたとおりではなく)。 ◎ The progress start value and progress end value calculations are interpreted as specified for the media feature (rather than as specified by the context the function is used in).
`media-progress$f の値は、 `進捗~関数を計算する$ことにより決定される `number$t になる。 ◎ The value of media-progress() is a <number>, determined by calculating a progress function.
注記: `media-progress$f は、 `number$t に評価される関数に過ぎず,`~math関数$`ではない^em。 ◎ Note: media-progress() is not a math function; it’s just a function that evaluates to a <number>.
5.3. 容器~query進捗-値: `container-progress^f 記法
`container-progress@f `関数-記法$は、 `媒体~特能$に代えて`容器~特能$ `CSS-CONTAIN-3$r を受容することを除いて, `media-progress$f 関数-記法と一致する。 ◎ The container-progress() functional notation is identical to the media-progress() functional notation, except that it accepts container features [CSS-CONTAIN-3] in place of media features.
`container-progress$f の構文は: ◎ The syntax of container-progress() is defined as follows:
`container-progress()@t = container-progress(`mf-name$t [ of `container-name$t ]?, `calc-sum$t, `calc-sum$t)
各~引数は:
- `mf-name$t は、 ある`~size特能$ %特能 を指定する — %特能 の値が,`進捗~値$を与える。
- 省略可能な `container-name$t は、 どの容器を~~基準に解決するか選定するときに考慮される有名~容器を指定する。
- 2 個の`計算式$ `calc-sum$t の値[ %始端~値, %終端~値 ]は、 順に[ `進捗~始端~値$, `進捗~終端~値$ ]を表現する。
これらの引数は、 ~AND↓ を満たさなければナラナイ — さもなければ、 当の関数は無効になる:
- `mf-name$t は、 妥当な`~size特能$を識別している
- [ %始端~値, %終端~値 ]は、 %特能 用の妥当な値を指定している
- « %始端~値, %終端~値 » は、 `一貫した型を有して$いる
`container-progress$f は、 ~prop値の文脈~内に限り,妥当になる — 他(例:`媒体~query$)では、 利用できない。 ◎ container-progress() is only valid in a property value context; it cannot be used in, for example, a media query.
[ %始端~値, %終端~値 ]は、 %特能 に指定されたとおりに解釈される (当の関数を利用している文脈により指定されたとおりではなく)。 適切な容器が見出されなかった場合、 %特能 の値【! `size-feature$t ~query】は,`小さい表示域~size$を~~基準に解決される。 ◎ The progress start value and progress end value calculations are interpreted as specified for the size feature (rather than as specified by the context the function is used in). If no appropriate containers are found, container-progress() resolves its <size-feature> query against the small viewport size.
`container-progress$f 【!media-progress()】の値は、 `進捗~関数を計算する$ことにより決定される `number$t になる。 ◎ The value of media-progress() is a <number>, determined by calculating a progress function.
注記: `container-progress$f は、 `number$t に評価される関数に過ぎず,`~math関数$`ではない^em。 ◎ Note: container-progress() is not a math function; it’s just a function that evaluates to a <number>.
6. 混合-法と補間~記法: `*-mix^f 族
この特能は、 `複数個の~breakpointをきちんと取扱えない@https://css.typetura.com/ruleset-interpolation/explainer/$ので,`設計し直す必要があるかもしれない@~CSSissue/6245#issuecomment-2469190377$。 [`6245$issue] ◎ This feature does not handle multiple breakpoints very well, and might need to be redesigned. [Issue #6245]
~CSSにおける いくつかの `混合-記法@ は、[ `混合-始端~値@ , `混合-終端~値@ の合間における ある地点までの進捗 ]を与える `混合-進捗~値@ への補間を表現することを許容する。 これらの`関数-記法$は、 次の構文-~patternに従う: ◎ Several mix notations in CSS allow representing the interpolation of two values, the mix start value and the mix end value, at a given point in progress between them (the mix progress value). These functional notations follow the syntactic pattern:
%混合-関数() = %混合-関数( `progress$t, `start-value^t, `end-value^t )【!mix-function( <progress>, [=mix start value|start-value=], [=mix end value|end-value=] )】
~CSSにおける`混合-記法$には、 次に挙げるものがある: ◎ The mix notations in CSS include:
- `calc-mix$f ⇒ `calc$f 式~内で表現-可能な次元 — `length$t, `percentage$t, `time$t など — の補間-用 ◎ calc-mix(), for interpolating <length>, <percentage>, <time>, and other dimensions representable in calc() expressions
- `color-mix$f ⇒ `color$t 値の補間-用 ◎ color-mix(), for interpolating two <color> values
- `cross-fade$f ⇒ `image$t 値の補間-用 ◎ cross-fade(), for interpolating <image> values
- `palette-mix$f ⇒ `font-palette$p 値の補間-用 ◎ palette-mix(), for interpolating two font-palette values
- 汎用な `mix$f ⇒ どの~propに対しても,その値の補間を表現できる — ただし、 ~propの値を成す個々の成分ではなく,値~全体を成す場合に限る。 ◎ and finally the generic mix() notation, which can represent the interpolation of any property’s values (but only the property’s entire value, not individual components).
注記: `cross-fade$f 記法にも,[ 3 個~以上の値を混合することを許容する代替な構文 ]があるが、 それらは,より複階的な `progress$t を成す式を許容しない。 ◎ Note: The cross-fade() notation also has an alternative syntax that allows for mixing more than two values, but does not allow for the more complex expressions of <progress>.
`mix$f 記法には、 ~keyframeたちが成す集合をとる変種もある。 それは、[ ある `keyframes$at 規則を参照rして,そこから対応している~prop宣言を取り出す ]ことにより,これを行う。 他の混合-記法も~keyframeを許容するようになれば良さそうだが、 ~keyframeたちが成す集合を(~propの全部的な値ではなく)`成分~値$用にどう表現するか? ◎ The mix() notation also has a variant that takes a set of keyframes. It does this by referring to an @keyframes rule, and pulling the corresponding property declaration out of that. It would be nice to allow the other mix notations to take keyframe also, but how would we represent a set of keyframes for a component value (rather than a full property value)?
6.1. 補間~進捗の表現-法: `progress^t 型
`progress@t 型の値は、 `混合-記法$を成す`混合-進捗~値$を表現する。 それは、最終的に百分率に解決されるが, 媒体~queryや~animation時列線などの~sourceから取り出した百分率~値を — 補間~用に利用する前に — `~easing関数$を通して変換できる。 ◎ The <progress> value type represents the mix progress value in a mix notation, and ultimately resolves to a percentage. It can, however, draw that percentage value from sources such as media queries and animation timelines, and can also convert it through an easing function before using it for interpolation.
その構文は: ◎ Its syntax is defined as follows:
`progress$t = [ `percentage$t | `number$t | `animation-timeline$tp ] && [ by `easing-function$t ]?
ここで: ◎ where:
- `percentage-token$t
- 等価な `number$t に算出される — `0%^v は `0^v になり, `100%^v は `1^v になる, 等々。 ◎ Computes to the equivalent <number>: 0% becomes 0, 100% becomes 1, etc.
- 注記: これは、 `15%^v の様な~literalな百分率しか許容しない。 `calc(100% / 7)^v の様な計算式は、 働かないことになる — それは、 代わりに,[ 百分率を別の型( `width$p における `length$t など)を~~基準に解決するための通常の規則 ]を利用するよう試みるので。 代わりに `calc(1 / 7)^v の様な式を利用すること。 ◎ Note: This only allows literal percentages, like 15%; calculations like calc(100% / 7) will not work, as they will instead attempt to use the normal rules for resolving a percentage against another type (such as <length>, in width). Use expressions like calc(1 / 7) instead.
- `number$t
- `混合-進捗~値$を表現する。 ◎ Represents the mix progress value.
- 注記: これは、[ `progress$f/ `media-progress$f/ `container-progress$f ]記法の利用を許容することに注意。 ◎ Note: This allows the use of the progress(), media-progress(), and container-progress() notations.
- `animation-timeline$tp
- 指定された`~animation時列線@~WANIM#timelines$の進捗†として`混合-進捗~値$を表現する。 ただし,値[ `none$v, `auto$v ]は妥当でない。 `CSS-ANIMATIONS-2$r `WEB-ANIMATIONS-2$r ◎ Represents the mix progress value as the progress of the specified animation timeline. The values none and auto, however, are invalid. [CSS-ANIMATIONS-2] [WEB-ANIMATIONS-2]
- 【† `開始-時刻$から`終止-時刻$までにおける`現-時刻$の進捗~率を表すように思われるが、 はっきりしない。 】
- `easing-function$t
- 指定された`~easing関数$ `CSS-EASING-1$r を利用して, 指定された入力`混合-進捗~値$を出力`混合-進捗~値$へ変換する。 ◎ Converts the specified input mix progress value into an output mix progress value using the specified easing function. [CSS-EASING-1]
注記: [ `0^v 以上 `1^v 以下 ]でない進捗~値も妥当であり、[ 始端~値, 終端~値 ]により定義される範囲を超える補間を表現することを許容する。 ◎ Note: Progress values below 0 and above 1 are valid; they allow representing interpolation beyond the range defined by the start and end values.
注記: `progress$t 自体は, `percentage$t であり得るが、[ `progress$f の様な `number$t へ`解決され^emる関数を等価な `number$t へ直に対応付ける ]ときは, `percentage$t を当の文脈~用の通常の規則を利用して解決する。 例えば、 `width$p においては,ある長さを~~基準に解決されることになる。 ◎ Note: While <progress> itself can be a <percentage>, mapping directly to the equivalent <number>, a function that resolves to a <number>, like progress(), resolves <percentage>s using the normal rules for the context; for example, in width, they would be resolved against a length.
`progress$t 値の`算出d値$は、[ `percentage$t / `number$t ]を伴って指定された場合は `number^t の算出d値になり, `animation-timeline$tp を伴って指定された場合には `animation-timeline$tp の算出d値になる — いずれも、 `easing-function$t が与えられた場合は,それを通して変換される。 ◎ The computed value of a <progress> value specified with <percentage> or <number> is the computed <number> converted through the <easing-function> (if any). The computed value of a <progress> value specified with <'animation-timeline'> is the computed <'animation-timeline'> and <easing-function> (if any).
6.2. 補間された数量-値: `calc-mix^f 記法
`calc-mix@f `混合-記法$ は、 補間された数量-値(次元を伴い得る数)を表現する。 【!Like `calc$f 】 それは、 次の構文-形を伴う`~math関数$である: ◎ The calc-mix() mix notation represents an interpolated numeric or dimensional value. Like calc(), it is a math function, with the following syntactic form:
`calc-mix()@t = calc-mix( `progress$t, `calc-sum$t, `calc-sum$t )
入力を成す 2 つの`計算式$ %計算式たち は、 それを成す各~計算式は[ `number$t, `dimension$t, `percentage$t ]いずれにも解決され得るが, %計算式たち は`一貫した型を有して$いなければナラナイ — さもなければ、 当の関数は無効になる。 当の関数の`型$は、 次の結果になる ⇒ `型を入力と一貫させる$( %計算式たち の`一貫した型$, 入力を成す `progress$t 値の`型$ ) ◎ The <calc-sum> arguments can resolve to any <number>, <dimension>, or <percentage>, but must have a consistent type or else the function is invalid. The result’s type will be the consistent type, made consistent with the type of the <progress> value.
妥当な `calc-mix$f の: ◎ ↓
- `使用~値$は、 所与の 2 個の `calc-sum$t 値を所与の `progress$t による進捗へ補間した結果になる。 ◎ The used value of a valid calc-mix() is the result of interpolating these two values to the progress given by <progress>.\
-
`算出d値$は:
- 所与の `progress^t が ある `number$t 値 %進捗 に算出できる場合、 所与の 2 個の `calc-sum$t の算出d値 ( %A, %B ) を %進捗 へ補間した結果になる (言い換えれば、 %A ~PLUS ( %B ~MINUS %A ) ~MUL %進捗 になる)。
- 他の場合、 そのまま `calc-mix^f 記法になるが, その各~引数は各自の型に則って算出される。
6.3. 補間された色~値: `color-mix^f 記法
この仕様は、 `color-mix$f `関数-記法$を[ 次の構文【を成す 1 個目の `color-mix^f 】を受容する`混合-記法$ ]で拡張する: ◎ This specification extends the color-mix() functional notation as a mix notation accepting the following syntaxes:
`color-mix$f = color-mix( [ `progress$t && `color-interpolation-method$t? ], `color$t, `color$t ) | color-mix( `color-interpolation-method$t, [`color$t && `percentage [0,100]$t?]#{2} )
1 個目の `color-mix^f 記法の使用~値は、[
所与の `progress$t 値を `percentage$t で表す値 %進捗
]を[
2 個目の `color-mix^f 内の 2 個目の `color$t 引数に伴われる `percentage$t
]にアテガうことと等価になる。
すなわち、
color-mix( %進捗, %色, %もう一つの色 )
は,
color-mix(…†, %色, %もう一つの色 %進捗 )
と等価になる。
2 個目の `color-mix^f 用の規範的な定義は、
`CSS-COLOR-5$r `§ 色の混合-法@~CSSCOLOR5#color-mix$
を見よ。
◎
The used value of the first mix notation variant is equivalent to assigning the <progress> value, as a <percentage>, to the <percentage> of the second <color> argument in the second variant. That is, color-mix(progress, color1, color2) is equivalent to color-mix(color1, color2 progress). See CSS Color 5 § 3 Mixing Colors: the color-mix() Function for the normative definition of the second variant.
【† `color-interpolation-method$t を省略した場合の挙動が不明 (本当は省略可能でない?)。 】
`progress$t は[ 0% 以上 100% 以下 ]の外側にある百分率を返すことを許容するが、 【 2 個目の】 `color-mix$f は そのような値を許容しないので, それをどう処理するか定義する必要がある。 ◎ <progress> allows returning percentages outside 0-100%, but color-mix() doesn’t allows such values, so need to define how that gets processed.
6.4. 補間された 画像~値: `cross-fade^f 記法
この仕様は `cross-fade$f `関数-記法$を[ 次の構文【を成す 1 個目の `cross-fade^f 】を受容する`混合-記法$ ]で拡張する: ◎ This specification extends the cross-fade() functional notation as a mix notation accepting the following syntaxes:
`cross-fade$f = cross-fade( `progress$t, [ `image$t | `color$t ], [ `image$t | `color$t ] ) | cross-fade( `cf-image$t# )
1 個目の `cross-fade^f の`使用~値$は、[
所与の `progress$t 値を `percentage$t で表す値 %進捗
]を[
2 個目の `cross-fade^f 内の 2 個目の `cf-image$t 【!`color^t】引数を成す `percentage$t
]にアテガうことと等価になる。
すなわち、
cross-fade( %進捗, %画像, %もう一つの画像 )
は,
cross-fade( %画像, %もう一つの画像 %進捗 )
と等価になる。
2 個目の `cross-fade^f 用の規範的な定義は、
`CSS-IMAGES-4$r `§ 画像の組合n@~CSSIMAGE4#cross-fade-function$
を見よ。
◎
The used value of the first mix notation variant is equivalent to assigning the <progress> value as the <percentage> of the second <color> argument in the second variant. That is, cross-fade(progress, image1, image2) is equivalent to cross-fade(image1, image2 progress). See CSS Images 4 § 2.6 Combining images: the cross-fade() notation for the normative definition of the second variant.
6.5. 補間された変形~値: `transform-mix^f 記法
`transform-mix@f `混合-記法$は、 `補間-@~TRANSFORM#interpolation-of-transforms$された `transform-list$t を表現する。 それは、 次の構文-形を伴う: ◎ The transform-mix() mix notation represents an interpolated <transform-list>, with the following syntactic form:
`transform-mix()@t = transform-mix( `progress$t, `transform-list$t, `transform-list$t )
妥当な `transform-mix$f の: ◎ ↓
- `使用~値$は、 所与の 2 個の `transform-list$t 値を所与の `progress$t による進捗へ補間した結果になる。 ◎ The used value of a valid transform-mix() is the result of interpolating these two values to the progress given by <progress>.\
-
`算出d値$は:
- [ 所与の `progress^t が `percentage$t に【!can be】算出される ]かつ[ 所与の 2 個の `transform-list$t を使用~値の時点での情報なしに補間できる ]場合、 所与の 2 個の `transform-list$t の算出d値を所与の `progress^t 値へ補間した結果になる。
- 他の場合、 そのまま `transform-mix^f 記法になるが, その各~引数は各自の型に則って算出される。
`transform-mix$f 自身は、 `transform-function$t である。 ◎ transform-mix() is, itself, a <transform-function>.
【 `transform-list^t どうしを補間した結果は, 一般に変形~関数たちが成す~listになるので、 これは不正確に見えるが、 ~listを成す変形~関数をすべて累積した結果を成す 1 個の `transform-function^t として解釈されるのかもしれない。 】
6.6. 補間された~prop値: `mix^f 記法
所与の~prop用の 2 個の値の`補間$は、 `mix@f `混合-記法$により表現できる — それは、 2 つの代替な構文~patternを~supportする: ◎ Interpolation of any two property values can be represented by the mix() mix notation, which supports two alternative syntax patterns:
`mix()@t = mix( `progress$t , `whole-value$t? , `whole-value$t? ) | mix( `progress$t && of `keyframes-name$t )
1 個目の構文~代替は、 他の`混合-記法$と同様に,[ `混合-始端~値$を与える 1 個目の `whole-value$t, `混合-終端~値$を与える 2 個目の `whole-value$t ]の合間において補間する。 2 個目の構文~代替は、 より複階的な補間~曲線を許容するため†, ~keyframeたちが成す集合††から対応している~prop宣言†††たちを`混合-進捗~値$を利用して補間する。 ◎ The first syntax alternative, like other mix notations, interpolates between the first <whole-value> (its mix start value) and the second <whole-value> (its mix end value). The second uses the mix progress value to interpolate the corresponding property declarations from a set of keyframes, allowing for more complex interpolation curves.
【†† `keyframes-name$t で識別される `keyframes$at 規則を成す`~keyframe~style規則$たちを指すと思われる。 】【††† この関数を値に利用している~propと同じ名前を伴う~prop宣言を指すと思われる。 】【† 各~keyframeにて指定された[ `~keyframe選択子$/`~easing関数$ ]も織り込まれることを意図していると思われる。 】
`mix$f の`算出d値$は、 次に従う: ◎ ↓
- 1 個目の “標準な” `mix^f 記法で指定されていて,[ 2 個の `whole-value$t が,それを指定した~prop用の値として補間-可能である ]かつ[ 補間した結果は `mix$f を伴わずに表現できる ]場合 ⇒ それら 2 個の値を[ `progress$t により与えられた進捗 ]へ補間した結果になる。 ◎ For the standard mix notation variant, if the two <whole-value>s being interpolated by mix() are interpolable as values for the property in which it is specified, and the interpolated value can be represented without mix(), the computed value of mix() is the result of interpolating these two values to the progress given by <progress>.\
-
他の場合 ⇒ そのまま `mix^f `関数-記法$になるが、 その引数のうち `progress$t 値は算出され, `whole-value$t は(供されたなら)[ 当の~prop用の値 ]として算出される。
【 2 個目の `mix^f 記法で指定された場合も,この場合に含まれるように思われる。 】
◎ Otherwise, the computed value of mix() is the mix() functional notation itself with its <progress> value computed and its <whole-value>s (if provided) computed as values for this property.
`mix$f の利用のうちほとんどは、 算出d値の時点で解決されることになる: ◎ For example, most uses of mix() will resolve at computed-value time:
color: mix(90%, red, blue); /* は、 単純な補間を介して,次に算出される: ◎ via simple interpolation, computes to: */ color: rgb(10% 0 90%); color: mix(90%, currentcolor, black); /* 算出d値の時点では全部的に解決し得ないが、 それでも,定義された表現がある: ◎ can’t be fully resolved at computed-value time, but still has a defined representation: */ color: color-mix(currentcolor 90%, black 10%); float: mix(90%, left, right); /* 離散的に~animate可能 ◎ discretely animatable */ float: right;
が、 少数の事例では,中間的な表現は無い: ◎ But a few cases don’t have an intermediate representation:
transform: mix(90%, translate(calc(1em + 50%)), rotate(30deg));
/*
2 つの関数は合致しないので,
`matrix^f を介して補間されることになるが、
`translate^f は百分率を伴うので,
`matrix^f に転換するためには~layout情報が必要になる。
なので、
補間した値を実際には表現し得ない。
その結果、
次【の様な形】に算出される:
◎
because functions don’t match, it will interpolate via matrix(). But translate(%) needs layout information to turn into a matrix(), so the interpolated value can’t actually be represented. Computes to:
*/
transform: mix(90%, translate(calc(16px + 50%)), rotate(30deg));
transform: mix(90% of ripple);
`mix$f 記法は、 `whole-value$t である。 加えて、 いずれかの `whole-value$t 引数が`~animate不可$である場合,当の記法は無効になる。 ◎ The mix() notation is a <whole-value>. Additionally, if any of its <whole-value> arguments are not animatable, the notation is invalid.
例えば,次に挙げる宣言は、 どれも無効になり,無視されることになる: ◎ For example, the following declarations are invalid, and will be ignored:
/* 始端~値が妥当でない ◎ Invalid start value */ color: mix(90%, #invalid, #F00); /* `mix^f 関数が~propの値~全体を成していない ◎ Function is mixed with other values */ background: url(ocean) mix(10%, blue, yellow); /* `animation-*^p は~animate可能でない ◎ 'animation-*' is not animatable */ animation-delay: mix(0%, 0s, 2s);
7. 値が代入される諸々の関数
7.1. ~prop値~全体の表現-法: `whole-value^t 型
この仕様が定義するいくつかの関数は、 所与の~propの “値~全体を成す” 場合にしか利用できない。 例えば、 `background-position:toggle(50px 50px, center)$p は妥当であるが, `background-position:toggle(50px, center) 50px^p は妥当でない。 `whole-value$t 生成規則は、 そのような値を表現する。 ◎ Several functions defined in this specification can only be used as the "whole value" of a property. For example, background-position: toggle(50px 50px, center); is valid, but background-position: toggle(50px, center) 50px; is not. The <whole-value> production represents these values.
すべての~propは、 その値~全体として `whole-value$t を暗黙的に受容する — `~CSS全域~keyword$を値~全体として受容するのと同じく。 ◎ All properties implicitly accept a <whole-value> as their entire value, just as they accept the CSS-wide keywords as their entire value.
`whole-value$t が,ある関数の成分~値【引数】として利用されたときも、[ 当の関数を利用した~propの値~全体を成すものとして,通常は妥当になる~CSS値 ]を表現する (追加的な `whole-value$t 関数 【当の関数の引数として利用された関数のうち `whole-value$t を引数に含むもの?】 も含めて)。 しかしながら、 関数によっては,[ `whole-value$t 引数が含み得るもの ]は制約され得る。 ◎ When used as a component value of a function, <whole-value> also represents any CSS value normally valid as the whole value of the property in which it is used (including additional <whole-value> functions). However, some functions may restrict what a <whole-value> argument can include.
7.2. ~supportされる最初の値の選定-法: `first-valid^f 記法
~CSSは、 前方-互換な構文解析により漸進的な増補を~supportする。 作者は,~style規則~内で同じ~propを複数回 — 各~回に異なる値を利用しながら — 宣言でき、 ~CSS~UAは, それらのうち自身が解する最後のものを自動的に利用して,それ以外を棄てる。 この原則は、 `supports$at 規則との~~併用により,[ 旧い~UA, 新たな~UAどちらでも きちんと働く~stylesheetを書く ]ことを作者に許容する。 ◎ CSS supports progressive enhancement with its forward-compatible parsing: authors can declare the same property multiple times in a style rule, using different values each time, and a CSS UA will automatically use the last one that it understands and throw out the rest. This principle, together with the @supports rule, allows authors to write stylesheets that work well in old and new UAs simultaneously.
しかしながら、 `var$f 関数(あるいは、構文解析した後に解決される類似な代入~関数【`任意-代入~関数$】)の利用は, この機能性を~~妨げる — それらを利用する【!such】どの~propも,構文解析-時点では妥当と見做すことが要求されるので。 ◎ However, using var() (or similar substitution functions that resolve after parsing) thwarts this functionality; CSS UAs must assume any such property is valid at parse-time.
`first-valid@f `関数-記法$は、 ~fallback用の挙動を宣言の中に — その構文解析に内在的になるよう — ~inline化する。 ほとんどの記法と違って、 その各~引数は,妥当な構文も妥当でない構文も受容する — それは、 各~引数のうち,次を満たす最初のものを表現する ⇒ この記法を利用した~propの値~全体を成していたとするとき, ~UAにより~supportされる (妥当な値として構文解析される) ◎ The first-valid() functional notation inlines the fallback behavior intrinsic to parsing declarations. Unlike most notations, it can accept any valid or invalid syntax in its arguments, and represents the first value among its arguments that is supported (parsed as valid) by the UA as the whole value of the property it’s used in.
`first-valid()@t = first-valid( `declaration-value$t# )
どの引数も当の~prop用の妥当な値を表現しない場合、 当の~propは,`算出d値の時点で無効$になる。 ◎ If none of the arguments represent a valid value for the property, the property is invalid at computed-value time.
`first-valid$f は `whole-value$t である。 ◎ first-valid() is a <whole-value>.
これは異なる名前にするべきか? — この関数を追加するものと解決されるまで, 【どう命名するか】裁定し切れなかった。 ◎ Should this have a different name? We didn’t quite decide on it during the resolution to add this.
注記: `first-valid$f が[ その引数として実質的には `whole-value$t をとるにもかかわらず, `declaration-value$t をとる ]ものと定義されるのは、 定義により,[ `その値は、それをとる宣言~用には妥当でないかもしれない^em ]事例で利用されることが意図されるので。 `declaration-value$t は、 それが合致するものに対し — `whole-value$t と違って — 文脈に応じた妥当性の拘束を何も課さない。 ◎ Note: Despite effectively taking <whole-value>s as its argument, first-valid() is instead defined to take <declaration-value>s because, by definition, it’s intended to be used in cases where its values might be invalid for the declaration it’s in. <declaration-value> imposes no contextual validity constraints on what it matches, unlike <whole-value>.
7.3. 条件付きな値の選定: `if^f 記法
`if@f 記法は、 条件付きな値たちを表現する`任意-代入~関数$である。 それは、[ ~semicolonで分離された言明たちが成す【!有順序な】~list ]を引数にとる。 各~言明は、 順に[ 条件, 1 個の~colon, 値 ]からなる。 `if$f 記法は、 引数~listを成す条件のうち `真^i に評価されるものは[ 在るならば,それらのうち最初のものに対応する値/ 無いならば,空な~token~stream ]を表現する。 ◎ The if() notation is an arbitrary substitution function that represents conditional values. Its argument consists of an ordered semi-colon–separated list of statements, each consisting of a condition followed by a colon followed by a value. An if() notation represents the value corresponding to the first condition in its argument list to be true; if no condition matches, then the if() notation represents an empty token stream.
`if$f 記法の構文は: ◎ The if() notation syntax is defined as follows:
`if()@t = if( [ `if-condition$t : `declaration-value$t? ; ]* `if-condition$t : `declaration-value$t? ;? ) `if-condition@t = `boolean-expr[ <if-test> ]$t | `else$v `if-test@t = supports( [ `supports-condition$t | `ident$t : `declaration-value$t ] ) | media( `media-query$t ) | style( `style-query$t )
~keyword `else@v は、 常に `真^i に評価される条件を表現する。 ◎ The else keyword represents a condition that is always true.
`if$f 関数 %関数 用に`任意-代入~関数を解決する$ ときは:
-
%関数 を成す
~EACH( `if-condition$t %条件 )
に対し
⇒
~IF[
%条件 は `真^i に評価される
]
⇒
~RET ( %条件 に結付けられた
`declaration-value$t?
, ε ) - ~RET ( 空な~token~stream, ε )
注記: [ `media$at / `supports$at / `container$at ]規則は,その条件が `偽^i に評価されたときには[ その内容は無視されるだけになり, 値として何を適用するかを~cascadeに決定させる ]が、 それとは違って, `if$f を伴う宣言は、 条件が `偽^i に評価されても,~cascadeは巻戻されない — ~fallback値は、 【必要なら, `if$f の他に】 ~inlineに供する必要がある【!must】。 ◎ Note: Unlike using @media/@supports/@container rules, which just ignore their contents when they’re false and let the cascade determine what values otherwise apply, declarations with if() do not roll back the cascade if the conditions are false; any fallback values must be provided inline.
7.4. 一連の値の~toggle法: `toggle^f 記法
`toggle@f 式は、 子孫~要素たちが — 同じ値を継承する代わりに — ~listを成す各~値を巡回することを許容する。 ◎ The toggle() expression allows descendant elements to cycle over a list of values instead of inheriting the same value.
次の例は、 `em^e 要素を一般には~italic体にしつつ,~italic体の内側では~normal体に戻す: ◎ The following example makes <em> elements italic in general, but makes them normal if they’re inside something that’s italic:
em { font-style: toggle(italic, normal); }
次の例は、 入子な~list用に,~markerたちを巡回する。 ~marker図形は、 ~top-levelの~listにおいては `disc$v になり, その中に入子にされた~listにおいては — 階が深まるごとに — 順に[ `circle$v, `square$v, `box^v ]になり, ( 5 階の深さで)再び `disc$v から開始するようになる。 ◎ The following example cycles markers for nested lists, so that a top level list has disc-shaped markers, but nested lists use circle, then square, then box, and then repeat through the list of marker shapes, starting again (for the 5th list deep) with disc.
ul { list-style-type: toggle(disc, circle, square, box); }
`toggle$f 式の構文は: ◎ The syntax of the toggle() expression is:
`toggle()$t = toggle( `whole-value$t# )
`toggle$f 記法は、 `whole-value$t である。 しかしながら、 入子にできないことに加え,[ `attr$f / `calc$f ]記法も包含できない — そのような構成子を包含している宣言は無効になる。 ◎ The toggle() notation is a <whole-value>. However, it is not allowed to be nested, nor may it contain attr() or calc() notations; declarations containing such constructs are invalid.
次に挙げる `toggle$f 式は、 どれも無効になる: ◎ The following toggle() examples are all invalid:
background-position: 10px toggle(50px, 100px); /* `toggle$f は~propの値~全体を成していなければナラナイ。 ◎ toggle() must be the sole value of the property */ list-style-type: toggle(disc, 50px); /* `50px^v は `list-style-type$p 用の妥当な値でない。 ◎ 50px isn’t a valid value of 'list-style-type' */
`toggle$f 式 %式 の`算出d値$は、 次に従って決定される:
- %最初の値 ~LET ε
- %初回の反復か ~SET ~F
- %前回の反復で合致したか ~SET ~F
-
%式 の ~EACH( 引数 %引数 ) に対し,順に:
- %値 ~LET [ %引数 が %式 を利用している~propの値~全体を成していた ]とするとき,~propの`算出d値$を評価した結果
- ~IF[ %前回の反復で合致したか ~EQ ~T ] ⇒ ~RET %値
- ~IF[ %初回の反復か ~EQ ~T ] ⇒# %初回の反復か ~SET ~F; %最初の値 ~SET %値
- ~IF[ %値 ~EQ %式 を利用している~propの`継承d値$ ] ⇒ %前回の反復で合致したか ~SET ~T
- ~RET %最初の値
注記: したがって, `toggle$f 内で同じ値が繰返された場合、 ~listは短絡されることになる。 例えば, `toggle(1em, 2em, 1em, 4em)^v は、 `toggle(1em, 2em)^v と等価になる。 ◎ Note: This means that repeating values in a toggle() short-circuits the list. For example toggle(1em, 2em, 1em, 4em) will be equivalent to toggle(1em, 2em).
注記: `toggle$f は,明示的に親の算出d値を調べるので、 継承されない~propであっても働く。 このことは、 継承されない~propに対しても働く `inherit$v ~keywordと類似する。 ◎ Note: That toggle() explicitly looks at the computed value of the parent, so it works even on non-inherited properties. This is similar to the inherit keyword, which works even on non-inherited properties.
注記: ~propの`算出d値$は、 抽象的な[ 値たちが成す集合 ]であり,特定0の直列化ではない `CSS21$r ので、 算出d値どうしの比較は常に一義的になり, 期待される結果になるべきである。 例えば, `CSS21$r における `background-position$p の算出d値は、 各自が[ 絶対~長さ/百分率 ]として表現される 2 個の~offsetだけからなるので、[ 宣言 `background-position^p: `top center^v ]と[ 宣言 `background-position^p: `50% 0%^v ]が生産する算出d値は,一致する。 ~prop定義の “算出d値” の欄が何かを[ 多義的/厳密~過ぎ ]に定義すると見受けられる場合は、 修正できるよう`~feedback@#sotd$を供されたし。 ◎ Note: That the computed value of a property is an abstract set of values, not a particular serialization [CSS21], so comparison between computed values should always be unambiguous and have the expected result. For example, a Level 2 background-position computed value is just two offsets, each represented as an absolute length or a percentage, so the declarations background-position: top center and background-position: 50% 0% produce identical computed values. If the "Computed Value" line of a property definition seems to define something ambiguous or overly strict, please provide feedback so we can fix it.
`toggle$f が`略式~prop$に利用された場合、 その各`下位prop$の値も `toggle$f 値になるが、 その各~引数は,元の `toggle$f 式の各~引数に対し[ それが当の略式~propの値~全体を成していたとするとき,下位propが受取ることになる値 ]に設定される。 ◎ If toggle() is used on a shorthand property, it sets each of its longhands to a toggle() value with arguments corresponding to what the longhand would have received had each of the original toggle() arguments been the sole value of the shorthand.
次の略式~prop宣言は: ◎ For example, the following shorthand declaration:
margin: toggle(1px 2px, 4px, 1px 5px 4px);
次の下位prop宣言と等価になる: ◎ is equivalent to the following longhand declarations:
margin-top: toggle(1px, 4px, 1px); margin-right: toggle(2px, 4px, 5px); margin-bottom: toggle(1px, 4px, 4px); margin-left: toggle(2px, 4px, 5px);
[ 上端~margin/下端~margin ]は、[ `1px^v / `4px^v ]が 2 回~現れているので, 2 個の値のみを巡回する。 一方で,[ 左端~margin/右端~margin ]は、 3 個の値を巡回することになる。 言い換えれば、 上の宣言から得られる算出d値は,次の下位prop宣言と同じになる: ◎ Note that, since 1px appears twice in the top margin and 4px appears twice in bottom margin, they will cycle between only two values while the left and right margins cycle through three. In other words, the declarations above will yield the same computed values as the longhand declarations below:
margin-top: toggle(1px, 4px); margin-right: toggle(2px, 4px, 5px); margin-bottom: toggle(1px, 4px); margin-left: toggle(2px, 4px, 5px);
その結果は、 意図されるものではなかろう。 ◎ which may not be what was intended.
7.5. ~custom~prop 参照: `var^f 記法
`var$f 記法は、 `~custom~prop$の値が`代入-$される — `CSS-VARIABLES-1$r `§ ~cascade変数の利用-法@~CSSVAR#using-variables$を見よ。 ◎ The var() notation substitutes the value of a custom property, see the CSS Custom Properties for Cascading Variables Module. [CSS-VARIABLES]
7.6. 継承d値~参照: `inherit^f 記法
`inherit@f `関数-記法$は、 `inherit$v ~keywordと同様に,親の~prop — 1 個目の引数に指定された~prop — の`算出d値$に解決される。 しかしながら、 `算出d値$そのものではなく,それを更に~token化した結果に解決される。 2 個目の引数は、 在るならば,[ 1 個目の引数が【`代入-$時に】`無効が保証される値$に解決される事例 ]で~fallbackとして利用される。 ◎ Like the inherit keyword, the inherit() functional notation resolves to the computed value of a property on the parent. Rather than resolving to the value of the same property, however, it resolves to the tokenized computed value of the property specified as its first argument. Its second argument, if present, is used as a fallback in case the first argument resolves to the guaranteed-invalid value.
`inherit$f は`任意-代入~関数$である。 その構文は: ◎ inherit() is an arbitrary substitution function whose syntax is defined as:
`inherit()@t = inherit( `custom-property-name$t, `declaration-value$t? )
要素 %要素 に適用される~propの値が包含している `inherit()$t 関数 %関数 用に`任意-代入~関数を解決する$ ときは:
- %値 ~LET %要素 の[ %関数 の 1 個目の引数で識別される`~custom~prop$ ]の`継承d値$
- %結果 ~LET %値 を~token化した結果
- %~fallback ~LET [ %関数 に 2 個目の引数は指定されたならば それ / ~ELSE_ ε ]
- ~RET ( %結果, %~fallback )
注記: 将来の~levelでは、[ `inherit$f に標準な~CSS~propを指定する ]ことも許容し得る。 しかしながら,それらの~propには[ `算出d値$の~token化が標準~化されていないもの ]もあるので、 その特能は,この~level 5 から先送りされる。 `算出d値$は、 `使用~値$とは相違することに注意 — それは、 `getComputedStyle()$c が返す`解決d値$になるとは限らない。 したがって, `inherit(width)^v が許容されたとしても、 `length$t ( `width$p の使用~値)を返すとは限らない — `width^p を指定する先祖が無いならば, ~keyword `~autoS$v ( `width^p の初期~値)を返すことになる。 ◎ Note: Future levels of CSS may allow specifying standard CSS properties in inherit(); however because the tokenization of computed values is not fully standardized for all CSS properties, this feature is deferred from Level 5. Note that the computed value differs from the used value, and is not always the resolved value returned by getComputedStyle(); thus even if inherit(width) were allowed, it would frequently return the keyword auto, not the used <length>.
7.7. 属性~参照: `attr^f 記法
`attr@f 関数は、[ それを利用している~propが適用される`要素$の ある`属性$ ]を参照し,当の`属性$の値が`代入-$される ( `var$f 関数に`~custom~prop$の値が代入されるのと類似に)。 ◎ The attr() function substitutes the value of an attribute on an element into a property, similar to how the var() function substitutes a custom property value into a function.
attr() = attr( `attr-name$t `attr-type$t? , `declaration-value$t?) `attr-name@t = [ `ident-token$t? '|' ]? `ident-token$t `attr-type@t = type( `syntax$t ) | string | `attr-unit$t
`attr-unit@t 生成規則は、[ ~CSS次元~単位の名前(例: `px$u )に`~ASCII大小無視$で合致する`~CSS識別子$/ `%^v を .値にとる `delim-token$t ]に合致する。 単位たちが成す集合は時間~越しに拡がるので、 この生成規則は,ここでは~literalには展開されない。 ◎ The <attr-unit> production matches any identifier that is an ASCII case-insensitive match for the name of a CSS dimension unit, such as px, or the <delim-token> %. It is not expanded literally here, as the set of units expands over time.
`attr$f を成す各~引数は: ◎ The arguments of attr() are:
- `attr-name$t
- 参照している属性の名前を与える — それは、 `wq-name$t `SELECTORS-3$r に類似するが、 それを成す最初の成分【名前空間~接頭辞】は,~wildcard【任意の名前空間を表現する `*^v 】をとり得ない。 ◎ Gives the name of the attribute being referenced, similar to <wq-name> (from [SELECTORS-3]) but without the possibility of a wildcard prefix.
- 名前空間が指定されなかった場合 ( `attr(foo)^v の様に,識別子だけが与えられた場合) ~NULL名前空間が含意される。 (名前空間を伴う属性は稀なので、 通例的には,これが欲されるものになる。 特に、[ ~HTML/~SVG ]には,名前空間を伴う属性は無い。) ◎ If no namespace is specified (just an identifier is given, like attr(foo)), the null namespace is implied. (This is usually what’s desired, as namespaced attributes are rare. In particular, HTML and SVG do not contain namespaced attributes.)\
- `属性~選択子$と同じく、 `attr-name$t が文字大小区別かどうかは,文書~言語に依存する。 ◎ As with attribute selectors, the case-sensitivity of <attr-name> depends on the document language.
- ある[ 要素/疑似要素 ]に適用される~propにて利用された `attr$f は、[ 当の要素/当の疑似要素の`最終的な出自の要素$【!`出自の要素$】 ]の[ 所与の名前を伴う属性 ]を参照する。 ◎ If attr() is used in a property applied to an element, it references the attribute of the given name on that element; if applied to a pseudo-element, the attribute is looked up on the pseudo-element’s originating element.
- `attr-type$t
- 当の属性の値を[ この引数に与えた`文法に則って構文解析-$する ]よう指定する。 ◎ Specifies how the attribute value is parsed into a CSS value.
- `type^f 関数【!誤:~CSSIMAGE4#funcdef-image-set-type】として与えられた場合、 当の属性の値【!the value】は,その `syntax$t 引数に則って構文解析され、 結果の~token列が代入される。 構文解析に失敗した場合、 ~fallbackが誘発される。 ◎ If given as a type() function, the value is parsed according to the <syntax> argument, and substitutes as the resulting tokens. Values that fail to parse according to the syntax trigger fallback.
- `attr-unit$t 値として与えられた場合、 当の属性の値【!the value】は,まず[ `type(<number>)^v が指定された ]かのように `number$t として構文解析される。 結果の数量-値は、 所与の単位を伴う次元 — あるいは `%^v が与えられた場合は百分率 — へ転換される。 構文解析に失敗した場合、 ~fallbackが誘発される。 ◎ If given as an <attr-unit> value, the value is first parsed as if type(<number>) was specified, then the resulting numeric value is turned into a dimension with the corresponding unit, or a percentage if % was given. Values that fail to parse as a <number> trigger fallback.
-
[ `string^v ~keywordとして与えられた/ 省略された ]場合、 当の属性の値は,そのまま~CSS文字列として扱われるようになる — ~CSS構文解析は([ ~CSS~escape, 空白, ~comment, 等々 ]の除去も含めて),まったく遂行されずに。 ~fallbackが誘発されるのは、 当の属性が欠落ったときに限られる。 ◎ If given as the string keyword, or omitted entirely, it causes the attribute’s literal value to be treated as the value of a CSS string, with no CSS parsing performed at all (including CSS escapes, whitespace removal, comments, etc). No value triggers fallback; only the lack of the attribute entirely does.
注記: これは、 構文に `type(*)^v を指定することとは異なる。 `type(*)^v は、 ~CSS構文解析を誘発して (それは、 当の値が妥当に構文解析されることを超える要件を何も課さないが), その結果を[ `string$t 値ではなく,~token列 ]として直に代入する。 ◎ Note: This is different from specifying a syntax of type(*), which still triggers CSS parsing (but with no requirements placed on it beyond that it parse validly), and which substitutes the result of that parsing directly as tokens, rather than as a <string> value.
- `declaration-value$t
- ~fallback値を指定する — [ 当の属性が欠落った場合/ 当の属性の値を指定された型として構文解析することに失敗した場合 ]、 当の`attr$f には,この~fallback値が代入されることになる。 ◎ Specifies a fallback value for the attr(), which will be substituted instead of the attribute’s value if the attribute is missing or fails to parse as the specified type.
-
省略された場合の既定の~fallback値は:
-
`syntax$t 引数が省略された場合†、 空~文字列になる。
【† `syntax$t 引数は `attr-type$t 引数に更新されたが、 この記述は,それを反映していない。 これは、 `attr-type^t 引数が[ 省略された場合/ `string^v ~keywordをとる場合 ]と解釈するべきに思われる。 】
- 他の場合、 `無効が保証される値$になる。
-
~propが包含している各 `attr$f 関数が,どれも構文上は妥当な場合、 ~prop全体の文法は,構文解析-時点では妥当であると見做すモノトスル。 構文は、 `attr^f 関数に`代入-$【!#substitute-an-attr】された後の算出d値の時点に限り,検査される。 ◎ If a property contains one or more attr() functions, and those functions are syntactically valid, the entire property’s grammar must be assumed to be valid at parse time. It is only syntax-checked at computed-value time, after attr() functions have been substituted.
注記: ~fallback値【!既定の値】の型は、 【 `attr-type$t にて】与えられた型と一致する必要は無いことに注意。 一例として、 作者が属性の値を `px^u 単位【!`number px^t】として扱うよう要求した場合でも, ~fallback値は `auto^v をとり得る — `width:attr(size px, auto)$p の様に。 ◎ Note that the default value need not be of the type given. For instance, if the type required of the attribute by the author is <number px>, the default could still be auto, like in width: attr(size <number px>, auto);.
`attr$f を利用して, ~XML~file内の~dataを視覚的に~~説明する例: ◎ This example shows the use of attr() to visually illustrate data in an XML file:
`attr-notation-1^xCode7.7.1. 属性~値~代入: `attr^f 記法
`attr$f は、 `var$f と類似な`任意-代入~関数$であり, `算出d値$の時点で,それが表現する値で置換される — `無効が保証される値$を表現する場合、 当の宣言を`算出d値の時点で無効$にすることになる。 ◎ attr() is an arbitrary substitution function, similar to var(), and so is replaced with the value it represents (if possible) at computed value time; otherwise, it’s replaced with the guaranteed-invalid value, which will make its declaration invalid at computed-value time.
要素 %要素 に適用される~propの値が包含している `attr$f 関数 %関数 用に`任意-代入~関数を解決する$ ときは: ◎ To resolve an attr() function: • Let el be the element that the style containing the attr() function is being applied to.\
- %属性~名 ~LET %関数 内に指定された属性の名前 ◎ Let attr name be the attribute name specified in the function.\
-
%構文 ~LET %関数 内に指定された `syntax$t は[ 在るならば それ/ 無いならば ~NULL ]
【 `syntax$t 引数は `attr-type$t 引数に更新された(拡張された)が、 この記述は,それを反映していない。 この段は、 それを収容するよう更新する必要がある。 特に, `attr-type$t が `string^v をとる場合、 %構文 は ~NULL になるべきであろう。 また, `attr-unit$t を適切な `syntax$t に変換する必要もある。 】
◎ Let syntax be the <syntax> specified in the function, or null if it was omitted.\ - %~fallback ~LET %関数 内に指定された `declaration-value$t は[ 在るならば それ/ 無いならば ε ] ◎ Let fallback be the <declaration-value>? argument specified in the function, or the guaranteed-invalid value if it was omitted.
- %属性~値 ~LET %要素 は名前 %属性~名 を伴う属性を[ 有するならば その値 / 有さないならば ε ] ◎ ↓
- ~IF[ %属性~値 ~EQ ε ] ⇒ ~RET ( ε, %~fallback ) ◎ If there is no attribute named attr name on el, return the guaranteed-invalid value and fallback. Otherwise, let attr value be that attribute’s value.
-
~IF[ %構文 ~EQ ~NULL ] ⇒ ~RET %属性~値 を値にとる `string$t ◎ If syntax is null, return a CSS <string> whose value is attr value.
注記: この値に対しては、 いかなる種類の[ 構文解析/改変 ]も遂行されない。 ◎ Note: No parsing or modification of any kind is performed on the value.
- %結果 ~LET `構文~値で構文解析する$( %属性~値, %構文, %要素 )
- ~RET ( %結果, %~fallback ) ◎ Parse with a <syntax> attr value, with syntax and el. Return the result and fallback.
7.7.2. ~security
`attr$f 関数が参照する属性は、 当の~pageにより~style付け用に利用されるものとは決して意図されない,敏感な情報 (例:~page上の~scriptにより利用される~security~token) を包含するかもしれない。 ◎ An attr() function can reference attributes that were never intended by the page to be used for styling, and might contain sensitive information (for example, a security token used by scripts on the page).
このことは、 一般には,~~問題ない。 ほとんどの状況下では、 `attr$f を利用しても,[ ~pageから情報を抽出して,それを敵対的な主体へ送信する ]ことは困難なので。 例外は、 ~URLである。 第三者-主体~CSSが許容される下で、 純粋に~CSSから,ある~URLを任意な属性の値で構築できた場合、 属性~内に格納された情報は,敵対的な主体へ容易に送信できるようになる。 ◎ In general, this is fine. It is difficult to use attr() to extract information from a page and send it to a hostile party, in most circumstances. The exception to this is URLs. If a URL can be constructed with the value of an arbitrary attribute, purely from CSS, it can easily send any information stored in attributes to a hostile party, if 3rd-party CSS is allowed at all.
【 それでも、 ~URLを介さずに敏感な情報が漏洩する能性はある — 例えば、 少なくとも属性~値の長さは,~layoutを通して~scriptから観測-可能になろう。 [`5136$issue] 】
これに抗して防護するため、 `attr$f により生産された値は, `attr() に染まっ@ た( `attr()-tainted^en )ものと見なされる。 ◎ To guard against this, the values produced by an attr() are considered attr()-tainted, as are functions that contain an attr()-tainted value.
`任意-代入~関数$の代入~値は、 その代入~値を作成する【`任意-代入~関数を解決する$】際に `attr() に染まっ$た値が孕まれる場合には, `全体として^em `attr() に染まっ$たものとされる。 ◎ The substitution value of an arbitrary substitution function is attr()-tainted as a whole if any attr()-tainted values were involved in creating that substitution value.\
注記: これは、 `登録-済み~custom~prop$の値を代入するときには,`等価な~token列$へ拡張する。 ◎ This extends to the equivalent token sequence when substituting values of registered custom properties.
`attr() に染まっ$た値を[ `url$t 内に/ `url$t として ]利用している宣言は、 `算出d値の時点で無効$になる。 ◎ Using an attr()-tainted value as or in a <url> makes a declaration invalid at computed-value time.
例えば,次に挙げるものは、 いずれも`算出d値の時点で無効$になる: ◎ For example, all of the following are invalid at computed-value time:
- `background-image: src(attr(foo))$p ⇒ 直に利用できない。 ◎ background-image: src(attr(foo)); - can’t use it directly.
- `background-image: image(attr(foo))$p ⇒ `url$t をとる他の関数~内でも,利用できない。 ◎ background-image: image(attr(foo)) - can’t use it in other <url>-taking functions.
- `background-image: src(string("http://example.com/evil?token="attr(foo)))$p ⇒ 別の関数を通しても,値を “洗浄-” できない。 ◎ background-image: src(string("http://example.com/evil?token=" attr(foo))) - can’t "launder" it thru another function.
- `--foo:attr(foo)^p — `--foo^p は`登録-済み~custom~prop$であり,文字列~構文を伴う【その`構文~文字列$ ~EQ `<string>^l 】とする — が宣言された下での, `background-image:src(var(--foo))^p ⇒ 別の~propを通しても,値を洗浄できない。 ◎ --foo: attr(foo); background-image(src(var(--foo))) (assuming that --foo is a registered custom property with string syntax) - can’t launder the value thru another property, either.
しかしながら、 他の目的に `attr$f を利用することは,~~問題ない — その用法が `url^t に`近い^em場合でも: ◎ However, using attr() for other purposes is fine, even if the usage is near a url:
- `background-image: image("foo.jpg", attr(bgcolor type(<color>)))$p は~~問題ない — `attr$f が供するものは~fallback色であり, 【1 個目の引数】 `url$t は `attr() に染まっ$てないので。 ◎ background-image: image("foo.jpg", attr(bgcolor type(<color>))) is fine; the attr() is providing a fallback color, and the <url> isn’t attr()-tainted.
ある`~custom~prop$を介して `attr$f を間接的に利用すると、 その代入~値は,全体が `attr() に染まっ$たものとされる: ◎ Using attr() indirectly via a custom property causes attr()-tainting of the whole custom property value:
-
`background-image: var(--foo)^p は、 `--foo: image("foo.jpg", attr(bgcolor type(<color>)))^p が宣言されていたなら,`算出d値の時点で無効$になる。 ◎ --foo: image("foo.jpg", attr(bgcolor type(<color>))); background-image: var(--foo); is invalid at computed-value time.
~custom~prop値が部分的に染まることについて究明する。 ◎ Investigate partial tainting of custom property values.
注記: この制約を実装するためには、 `attr$f 値から構築された値に対し,~dirty~bit【洗浄されたか否か】を追跡することが要求される — それらは、 `登録-済み~custom~prop$を介して,全部的に文字列へ解決され得るので、 表出された値を精査するだけには依拠できないので。 非-文字列~型でも、 他の型の値を文字列~化し得る関数 — `string^f【`string@~CSSCONTENT#funcdef-string$f?】 など — を介して,これを誘発し得ることに注意: `--foo:attr(foo type(<number>))^p が宣言されていたなら, `background-image:src(string(var(--foo)))^p も無効になる必要がある。 ◎ Note: Implementing this restriction requires tracking a dirty bit on values constructed from attr() values, since they can be fully resolved into a string via registered custom properties, so you can’t rely on just examining the value expression. Note that non-string types can even trigger this, via functions like string() that can stringify other types of values: --foo: attr(foo type(<number>)); background-image: src(string(var(--foo))) needs to be invalid as well.
8. ~randomな値の生成-法
設計に ある程度の “~random性” を組入れると有用になることが多い — 同じ~page内で繰返される要素に多少の “ゆらぎ” が感じられるようにしたり, ~pageに気が散らないほどの “華を添える” ために。 ◎ It is often useful to incorporate some degree of "randomness" to a design, either to make repeated elements on a page feel less static and identical, or just to add a bit of "flair" to a page without being distracting.
`~random関数@ と総称される[ `random$f, `random-item$f ]関数は、 作者が[ 自身の~pageの中へ~random性を組入れる ]ことを許容する — それは、[ この~random性を設計~視点からは予測-可能に保つ ]一方で, ~randomな値を[ 複数箇所で再利用するべきか,~instanceごとに一意になるべきか ]は作者が裁定できるようにする。 ◎ The random() and random-item() functions (the random functions) allow authors to incorporate randomness into their page, while keeping this randomness predictable from a design perspective, letting authors decide whether a random value should be reused in several places or be unique between instances.
~randomな数-を生成する正確な手法は、 ~UAにより定義される。 2 つの別個な~random値の相関は,容易に検出-可能になる`べきではない^emが、 この仕様は,[ それが暗号-強度の用語で何を意味するか ]は意図的に指定しない。 作者は、 高品質な暗号に依存する目的においては, `~random関数$に依拠しては`ナラナイ^em。 ◎ The exact random-number generation method is UA-defined. It should be the case that two distinct random values have no easily-detectable correlation, but this specification intentionally does not specify what that means in terms of cryptographic strength. Authors must not rely on random functions for any purposes that depend on quality cryptography.
8.1. ~randomな数量-値の生成-法: `random^f 関数
`random@f 関数は、 `~math関数$であり, ある範囲内で一様に分布する~randomな値を表現する。 【以下、この節に現れる~randomは,一様(すべての値は、同じ~~確率で選ばれる)と見做される。】 それはまた、 任意選択で,アリな値を[ 最小~値からの差が,ある段差の整数倍になる ]よう制限できる。 その構文は: ◎ The random() function is a math function that represents a random value between a minimum and maximum value, drawn from a uniform distribution, optionally limiting the possible values to a step between those limits:
`random()^t = random( `random-caching-options$t? , `calc-sum$t, `calc-sum$t, [by `calc-sum$t]? ) `random-caching-options@t = `dashed-ident$t || per-element
その引数たちは: ◎ Its arguments are:
- `random-caching-options$t
- 省略可能な この引数は、 当の `random$f 関数が[ ~page上の他の `random^f 関数と類似に解決されるか否か ]に対する,いくぶんの制御を供する。 詳細は、 `§ ~randomな値の生成-法/~cache法@#random-caching$ を見よ。 ◎ The optional <random-caching-options> provides some control over whether a given random() function resolves similarly or differently to other random()s on the page. See § 8.3 Generating/Caching Random Values: the <random-caching-options> value for details.
-
注記: `random$f 関数は: ◎ ↓
- この引数が省略された場合、[ それを含んだ~styleを利用している要素~すべて ]から共有される単独の値に解決される。 2 つの `random^f 関数は、 互いの引数たちがすべて一致するならば,同じ~randomな値に解決されることになる。 ◎ By default, random() resolves to a single value, shared by all elements using that style, and two random() functions with identical arguments will resolve to the same random value.
- この引数に `dashed-ident$t が供された場合、[ 他の引数は一致する他の `random$f 関数 ]とは別物にして,別個な値を生成させる。 ◎ Providing a <dashed-ident> does nothing, but can make the argument lists distinct between two or more otherwise-identical random() functions, so they’ll generate distinct values.
- この引数に `per-element^v ~keywordが供された場合、 当の関数が適用される`要素ごと^emに異なる値を生成させる — ~stylesheet内での各利用ごとに単独の値に解決されるのではなく。 ◎ The per-element keyword causes the random() function to generate a different value on each element the function is applied to, rather than resolving to a single value per usage in the stylesheet.
- `calc-sum$t, `calc-sum^t
- これら 2 個の要求される`計算式$は、 順に,当の関数を解決した結果がとり得る範囲の[ 最小~値, 最大~値 ]を指定する。 ◎ The two required calculations specify the minimum and maximum value the function can resolve to. Both limits are inclusive (the result can be the min or the max).
- [ 最大~値 ~LTE 最小~値 ]の場合、 最大~値は最小~値と等しいものとして挙動する。 ◎ If the maximum value is less than the minimum value, it behaves as if it’s equal to the minimum value.
- 例えば, `random(100px, 300px)^v は、 `100px^v 以上 `300px^v 以下の~randomな `length$t に解決されることになる。 ◎ For example, random(100px, 300px) will resolve to a random <length> between 100px and 300px: it might be 100px, 300px, or any value between them like 234.5px.
- `by^v `calc-sum$t
- 省略可能な最後の引数は、 段差~値を指定する。 当の関数を解決した結果は、 最小~値からの差が段差の整数倍になるよう制約され, そこから~randomに選ばれる。 ◎ The final optional argument specifies a step value: the values the function can resolve to are further restricted to the form min + (N * step), where N is a non-negative integer chosen uniformly randomly from the possible values that result in an in-range value.
-
例えば、 `random(100px, 300px, by 50px)^v を解決した結果は,[ `100px^v, `150px^v, `200px^v, `250px^v, `300px^v ]いずれかに限られ、 `120px^v 様な値を返すことは決してない。 ◎ For example, random(100px, 300px, by 50px) can only resolve to 100px, 150px, 200px, 250px, or 300px; it will never return a value like 120px.
結果が最小~値になることは,常にアリな一方、 最大~値になることは — 最小~値との差が段差の整数倍である場合を除き — アリでない。 例えば,[ `random(100px, 300px, by 30px)^v を解決した結果 ]としてアリな最~大な値は、 `280px^v ( ~EQ 最小~値 ~PLUS 段差 ~MUL 6 )になる。 ◎ While the minimum value is always a possible result, the maximum value isn’t always, if it’s not also a multiple of the step from the minimum. For example, in random(100px, 300px, by 30px), the largest possible value it can resolve to is 280px, 6 steps from the minimum value.
これには、 丸ngが影響し得ることに注意: `random(100px, 200px, by 100px / 3)^v にアリな値は, 3 通り — `100px^v, 約 `133.33px^v, 約 `166.67px^v — 以上はあるが、 `200px^v がアリになるかどうかは,丸ngの精度に依存する。 安全になるためには、 最大~値を期待される最~大な値より`少し大きく^emすればよい — `random(100px, 201px, by 100px / 3)^v の様に。 ◎ Note that rounding issues might have an effect here: in random(100px, 200px, by 100px / 3) you’ll definitely get three possible values (100px, and approximately 133.33px and 166.67px), but whether 200px is possible depends on rounding precision. To be safe, you can put the maximum value slightly above where you expect the final step to land, like random(100px, 201px, by 100px / 3).
-
`round$f の定義にて説明したとおり,~CSSの値には “生来な” 精度は無いが、 段差~値を利用すれば,精度をアテガえる — 例えば:
- `random(100px, 500px, by 1px)^v は、 解決した結果を `1px^v の整数倍に限るよう制約する。
- `random(1, 10, by 1)^v は、 解決した結果を整数に限るよう制約する。
- 注記: 段差の定義は、 素朴に[ 範囲~内の~randomな値を生成した結果を最も近い段差~値に丸める ]ことを許容するもの`ではない^em — そうすると、 結果の各~値は,同じ~~確率で現れなくなるので。 例えば, `random(100px, 200px, by 50px)^v は、 アリな 3 通りの値を同じ 1/3 の~~確率で生成する必要がある — 素朴な丸ngに基づく手法は、 `150px^v を[ 両端を成す他の値 ]の 2 倍の~~確率で生成するので,不正である。 ◎ Note: The definition of the step does not allow for naively generating a random value in the range and then rounding it to the nearest step value, as that can result in the values not appearing with the same weights. For example, random(100px, 200px, by 50px) has to generate the three possible values each with a 1/3 chance; a naive rounding-based method will instead incorrectly generate 150px twice as often as the boundary values.
入力を成す`計算式$たち %計算式たち は、 それを成す各~計算式は[ `number$t / `dimension$t / `percentage$t ]いずれにも解決され得るが, %計算式たち は`一貫した型を有して$いなければナラナイ 【!but must have the same type(おそらく更新漏れ)】 — さもなければ、 当の関数は無効になる。 当の関数の`型$は、 %計算式たち の`一貫した型$になる 【!have the same type as(おそらく更新漏れ)】。 ◎ All of the calculation arguments can resolve to any <number>, <dimension>, or <percentage>, but must have the same type, or else the function is invalid; the result will have the same type as the arguments.
例えば: ◎ For example,\
- `random(50px, 100%, by 1em)^v は、 百分率は[ これを利用した文脈において妥当である ]かつ[ `length$t に解決される ]と見做すならば,妥当になる — どの引数も,長さに解決されるので。 ◎ random(50px, 100%, by 1em) is valid (assuming percentages are valid in the context this is used, and resolve to a <length>), as all three arguments resolve to a length.
- `random(50px, 180deg)^v は、 長さと角度が同じ`型$ではないので,妥当でない。 ◎ However, random(50px, 180deg) is invalid, as lengths and angles are not the same type.
`random$f 関数は、 引数として与えた`計算式$を数量-値に単純~化できるようになり次第, `単純~化@~CSSVAL#simplify-a-calculation-tree$できる。 ◎ A random() function can be simplified as soon as its argument calculations can be simplified to numeric values.
注記: このことは、[ `random$f は、 `通例的には^em `算出d値$の時点で解決されるので,静的な数量-値として継承される ]ことを意味する。 しかしながら, 引数として与えた`計算式$が`使用~値$の時点まで解決されない場合 ( `percentage$t 値を含んでいて,解決するためには~layout情報が要求される場合など)、 `継承$は `random$f 関数~自体を転送することになる (しかしながら,これは、 `percentage$t 自身の挙動と異なるものでない — それは、 `percentage$t として継承されるので, 子~要素~上では異なる値に解決されるかもしれない)。 ◎ Note: This means that random() is usually resolved by computed value time, and thus will inherit as a static numeric value. However, if the argument calculations aren’t resolved until used value time (such as if they include <percentage> values that require layout information to resolve), inheritance will transfer the random() function itself. (This is no different, however, to the behavior of the <percentage>s themselves, which would inherit as <percentage>s and thus might resolve to different values on the child elements.)
少なくとも理論~上は、
`per-element^v が指定されない限り,
`random$f を~prop以外の文脈で利用しても大丈夫なはずである。
例えば、
`media^at (max-width: random(100px, 500px)) {...}
で何が起こるかは,きちんと定義される。
とは言え、
それを許容することが求まれるのかどうかは,疑わしい。
◎
At least in theory it should be fine to use random() in non-property contexts, so long as per-element isn’t specified; it’s well-defined what happens with @media (max-width: random(100px, 500px)) {...}, for example. I suspect we want to disallow it, tho?
8.1.1. 引数の範囲
`random(A, B, by C)^f においては: ◎ In random(A, B, by C),\
- %A, %B いずれかが無限である場合, 結果は ~NaN になる。 ◎ if A or B is infinite, the result is NaN.\
-
%C が無限である場合, 結果は %A になる。 ◎ If C is infinite, the result is A.
( %C ~LTE 0 の場合、 標準な定義から外れるが,結果は %A になる。) ◎ (If C is zero or negative, the result is A, but that falls out of the standard definition.)
注記: 通例の`~math関数$と同じく、 いずれかの計算式~引数が ~NaN になる場合, 結果は~NaNになる。 ◎ Note: As usual for math functions, if any argument calculation is NaN, the result is NaN.
8.2. ~listから~randomな~itemを選び取る: `random-item$f 関数
`random-item@f 関数は、 2 個目以降の引数たちが成す~listから~randomに選ばれる~itemに解決される。 ◎ The random-item() function resolves to a random item from among its list of items.
`random-item()$t = random-item( `random-caching-options$t , [ `declaration-value$t? ]# )
この関数においては、 `random-caching-options$t は`要求される^em。 それは、 `random$f のときと同じに解釈される (詳細は、 `§ ~randomな値の生成-法/~cache法@#random-caching$ を見よ)。 ◎ The required <random-caching-options> is interpreted identically to random(). (See § 8.3 Generating/Caching Random Values: the <random-caching-options> value for details.)
注記: `random$f と同様に、[ `dashed-ident$t / `per-element^v ]を利用すれば,[ 類似な `random-item$f 関数たちが別個な~random値を生成する/ 要素ごとに別個な値に解決される ]よう強制できる。 ◎ Like random(), the <dashed-ident> can be used to force similar random-item() functions to generate distinct random values, and per-element causes it to resolve to a distinct value on each element.
これらは別として、 `random-item$f 関数たちの~group分けは, `random$f より ずっと単純である — 関数どうしが “一致するか” どうかは、 引数の個数のみに基づく。 ◎ Aside from these, the grouping of random-item() functions as "identical" is much simpler: all that matters is the number of arguments.
すなわち, `random-item(--x, red, blue, green)^v と `random-item(--x, 1, 2, 3)^v は、 常に同じ引数~indexに解決され,[ `red$v, `1^v / `blue$v, `2^v / `green$v, `3^v ]いずれかになる。 これは、[ ~randomな値たちが成す集合を利用するよう求まれる~prop ]たちが成す~groupどうしの協調を許容する。 ◎ That is, random-item(--x, red, blue, green) and random-item(--x, 1, 2, 3) will always resolve to the same argument index: either red and 1, or blue and 2, or green and 3. This allows coordination between groups of properties that all want to use a random set of values.
他方、 `random-item(--x, red, blue, green)^v と `random-item(--x, 1, 2, 3, 4)^v には何ら繋がりはなく, 12 通りある どの組合nも生じ得る。 ◎ On the other hand, random-item(--x, red, blue, green) and random-item(--x, 1, 2, 3, 4) will have no connection to each other; any of the 12 possible combinations can occur.
注記: `random-caching-options$t 引数が `random$f においては省略可能な一方, `random-item$f においては要求されるわけは: ◎ Note: The <random-caching-options> argument is required in random-item(), but optional in random(), both\
- 構文解析の理由 ( `random-item(--foo, --bar, --baz)^v が 3 個の `declaration-value$t 引数をとるのか, 2 個のそれと `random-caching-options$t 引数をとるのか伝えることはアリでない)。 ◎ for parsing reasons (it’s impossible to tell whether random-item(--foo, --bar, --baz) has three <declaration-value> arguments or two and a <random-caching-options> argument),\
- 省略可能にすると、[ `random-item^f 関数の~instanceどうしを判別するために利用されるもの ]は,引数の個数しかなくなる — その結果、 別個な~random生成になるべき関数たちが,不用意に一緒くたにされ易くなる。 ◎ and because accidentally associating the random generation of random-item() functions together is much easier to do accidentally, since only the number of arguments is used to distinguish instances.
残りの引数は、 ~CSS値たちが成す任意な連列である。 `random-item$f 関数は、 この連列から~randomに選ばれる一つに解決される。 ◎ The remaining arguments are arbitrary sequences of CSS values. The random-item() function resolves to one of these sequences, chosen uniformly at random.
`random-item$f 関数は、 `var$f の様な`任意-代入~関数$である。 ◎ The random-item() function is an arbitrary substitution function, like var().
注記: すなわち, `random-item$f を利用する場合: ◎ That is, if you use random-item():
- `random-item$f (および他の`任意-代入~関数$)自体は、 構文上は妥当である限り, ~prop全体が構文解析-時点では妥当であると見做される。 ◎ So long as random-item() itself (and any other arbitrary substitution functions) is syntactically valid, the entire property is assumed to be valid at parse time.
- `random-item$f には、 `算出d値$の時点で — `var$f へ`代入-$するときと同じく — [ 何であれ それを解決した結果の値 ]が代入される — したがって、 すべての子は,同じ解決した結果の値を継承する。 ◎ random-item() is substituted with whatever value it resolves to at computed value time when you’d substitute a var(), so children all inherit the same resolved value.
- 値が代入された結果,~propが無効になる場合、 当の~propの値は,`無効が保証される値$になる。 ◎ If the substituted value ends up making the property invalid, the property’s value becomes the guaranteed-invalid value.
8.3. ~randomな値の生成-法/~cache法: `random-caching-options$t 値
~JSの様な~programming言語においては, ~code内に明瞭な時間的~順序付けが在るので、 `Math.random()^c に対する~callの様なものが`いつ評価されるか^emを正確に伝えれる。 結果は変数~内に格納できるので、 複数の箇所で[ 単独の~randomな値を再利用しているのか,別個な~random値を利用しているのか ]は,明瞭になる。 ◎ In a programming language like JavaScript, there’s a clear temporal ordering to code, so you can tell exactly when something like a call to Math.random() is evaluated. You can also store the results in a variable, making it clear when you’re reusing a single random value in multiple places, versus using a distinct random value in each location.
他方,~CSSは宣言的な言語なので (~codeは、 特定0の順序で “実行される” ことはなく, 何かが何回 “実行されるか” に対する制御も無い)、 同じ~styleを複数の要素に適用することは,ごく容易であるが: ◎ CSS, on the other hand, is a declarative language (code is not "executed" in any particular order, nor is there any control over how many times something is "executed");\ it makes it very easy to apply identical styles to multiple elements but\
- 各~要素に別個な値を指定することは困難である ( `random$f が[ それを利用している~propが適用される各~要素 ]に対し[ 同じ値, 別個な値 ]どちらに解決するよう意味されるかは、 不明瞭である)。 ◎ difficult to specify distinct values for each of them (making it unclear whether a property using random() is meant to resolve to the same value on each element it’s applied to or to distinct values on each);\
- “変数” の機能性は,ごく制限される (特定0の[ ~randomに生成された値 ]を何箇所かで意図的に再利用することは、 困難である)。 ◎ and it has very limited "variable" functionality (making it difficult to intentionally reuse a particular randomly-generated value in several places).
これらの課題を解決するため、 `~random関数$【!the random() and random-item() functions】は, 次に挙げる[ ~cache法の意味論 ]の下で~randomな値を生成するものと定義される: ◎ To resolve these issues, the random() and random-item() functions are defined to generate random values under the following caching semantics:
-
~stylesheet内の各[ `~random関数$【!`random$f or `random-item$f】の~instance ]は、 `~random~cache用~key@ を指定する。 [ `random$f たち/ `random-item$f たち ]【!Two instances of either function】は、 `~random~cache用~key$が[ 一致するならば`一致する値^em/ 異なるならば`別個な値^em ](順不同)に解決するモノトスル。 ◎ Each instance of random() or random-item() in a stylesheet specifies a random-caching key. Two instances of either function must resolve to identical values if their random-caching keys are identical; they must resolve to distinct values if they’re different.
(ここでの “別個” とは、[ ある新規な~random演算により生成される ]ことを意味する — その結果は、 別の~random演算と偶然~同じ値になるかもしれないが。) ◎ ("Distinct" here means generated by a fresh random operation; this might coincidentally result in the same value as another random operation.)
-
`random$f 用の`~random~cache用~key$は、 次に挙げるものからなる`~tuple$である: ◎ For random(), the random-caching key is a tuple of:
- 最小を与える`計算式$の`使用~値$。 ◎ The used value of the minimum calculation.
- 最大を与える`計算式$の`使用~値$。 ◎ The used value of the maximum calculation.
- 段差を与える`計算式$が[ 在るならば その`使用~値$/ 無いならば ~NULL ]。 ◎ The used value of the step calculation, if present, or null otherwise.
- `random-caching-options$t を成す `dashed-ident$t は[ 在るならば それ/ 無いならば ~NULL ]。 ◎ The <dashed-ident> part of the <random-caching-options>, if present, or null otherwise.
- `random-caching-options$t 内に `per-element^v が指定された場合、 当の関数が現れる[ 要素/疑似要素 ]ごとに一意な値。 ◎ If per-element is specified in the <random-caching-options>, a unique value per element or pseudo-element the function appears in.
-
`random-item$f 用の`~random~cache用~key$は、 次に挙げるものからなる`~tuple$である: ◎ For random-item(), the random-caching key is a tuple of:
- 当の関数に与えられた引数の個数。 ◎ The number of arguments to the function.
- `random-caching-options$t を成す `dashed-ident$t は[ 在るならば それ/ 無いならば ~NULL ]。 ◎ The <dashed-ident> part of the <random-caching-options>, if present, or null otherwise.
- `random-caching-options$t 内に `per-element^v が指定されたならば、 当の関数が現れる[ 要素/疑似要素 ]ごとに一意な値。 ◎ If per-element is specified in the <random-caching-options>, a unique value per element or pseudo-element the function appears in.
[ 要素/疑似要素 ]ごとに “一意な値” の存続期間は、[ 当の要素/当の疑似要素の`最終的な出自の要素$【!`出自の要素$】 (および当の疑似要素を一意に識別するために足る追加的な報) ]への~JS参照と同じになるモノトスル。 別々な文書~内の要素どうしは、 別個な一意な値をとる`べきである^em (同じ~pageであっても、 別個な文書を生産する場合 — 例:~pageが~refreshされた前後 — には,別々な文書とされる)。 (このことは,厳密には[ これらの値の疑似-~random生成を許容するために要求されるもの ]ではないが、 一意~性は,作者が[ 要素たちが文書どうしで同じ値をとること ]に依存し得なくするには十分なはずと見込まれる。) ◎ The "unique value per element or pseudo-element" must have the same lifetime as a JavaScript reference to the element (or to the originating element + sufficient additional info to uniquely identify the pseudo-element). Elements in separate documents (including across refreshes of the same page, which produces distinct documents with distinct elements) should have distinct unique values. (This is not strictly required, to allow for pseudo-random generation of these values, but uniqueness should be likely enough that authors cannot depend on elements having the same values across documents.)
加えて,~random生成~methodは、 同じ演算であっても異なる文書(同じ~pageの~refreshも含む)で呼出されたときは,別個な値を生成する`ベキ^emである。 ◎ Additionally, the random generation method should generate distinct values for the same operation when invoked on different documents (including refreshes of the same page).
例えば、 次の~stylesheetにおいて: ◎ For example, in the following stylesheet:
.random-square { width: random(100px, 500px); height: random(100px, 500px); }
両~関数の`~random~cache用~key$は、 どちらも ( `100px^v, `500px^v, ~NULL, ~NULL, ~NULL ) になり,一致する。 このことは、 どちらも正確に同じ値に解決されることを意味する — その結果、 `.random-square^css に合致している要素たちは,[ 縦幅, 横幅とも同じ[ `100px^v 以上 `500px^v 以下のどこかにある~size ]を伴う正方形になる ]かつ[ どの要素も同じ~sizeになる ]ことが保証される。 ◎ The random-caching keys for both functions are identical: (100px, 500px, null, null, null). This means that both will resolve to the exact same value, guaranteeing a square element with a size somewhere between 100px and 500px. Additionally, every .random-square element will have the same size.
他方,次の~stylesheetでは: ◎ On other hand, in this stylesheet:
.random-rect { width: random(100px, 500px); height: random(--x, 100px, 500px); }
両~関数の`~random~cache用~key$は、 別個になる ⇒# `width$p においては ( `100px^v, `500px^v, ~NULL, ~NULL, ~NULL ), `height$p においては ( `100px^v, `500px^v, ~NULL, `--x^v, ~NULL ) ◎ The random-caching keys are distinct between the two functions: the function in width has (100px, 500px, null, null, null), while the function in height has (100px, 500px, null, --x, null).
すなわち、 両~関数は別個な~random値に解決され,要素は およそ正方形にならない。 それでも、 `.random-rect^css に合致している要素たちは, `同じ^em~randomな~sizeを有することになる。 ◎ This means the two functions will resolve to distinct random values, making it very unlikely for the element to be square. However, every element matching .random-rect will still have the same random size.
この~keyは、 関数を成す どの側面を変更しても,改められる。 類似に、 次の 2 個の宣言は別個になる — 結果の横幅と縦幅には何ら繋がりはない: ◎ Changing any aspect of the function also alters this key. The following two declarations are similarly distinct, resulting in the width and height having no connection to each other:
.random-rect-2 { width: random(100px, 500px); height: random(100px, 500px, by 50px); }
2 つの関数は、 見かけは異なっていても,【各~引数の】`使用~値$が一致するならば一致する。 例えば,次の~codeでは: ◎ But so long as the used values end up identical, two functions that look distinct might end up identical. For example, in the following code:
.random-square-2 { font-size: 16px; width: random(160px, 320px); height: random(10em, 20em); }
2 つの関数は,見かけ上は異なるが、 `~random~cache用~key$は, 長さを全部的に解決した後には どちらも ( `160px^v, `320px^v, ~NULL, ~NULL, ~NULL ) になるので、[ 横幅, 縦幅 ]は,実際には常に一致するようになる。 ◎ The two functions superficially look different, but after the lengths are fully resolved they end up with identical random-caching keys; each is (160px, 320px, null, null, null), so actually the widths and heights will end up always identical.
既定では、 ~stylesheet内の各[ `random$f 関数の~instance ]は,本質的に静的な値に解決され、 当の~propが適用される要素~すべてから共有される。 この挙動は、 `per-element^v ~keywordで変更できる。 ◎ By default, each instance of a random() function in a stylesheet essentially resolves to a static value, which is then shared by every element that property applies to. This behavior can be changed with the per-element keyword.
例えば、 次においては: ◎ For example, in:
.foo { width: random(100px, 500px); }
`.foo^css に合致している要素たちの横幅は, 同じ~randomな値になるが、 次においては: ◎ Multiple elements matching .foo will end up with the same random width. ◎ But in:
.foo { width: random(per-element, 100px, 500px); }
`.foo^css に合致している各~要素は、 自前の`一意^emな横幅を取得することになる。 ◎ Every element matching .foo will get its own unique width.
これは,値を要素ごとに一意にするが、 `値ごと^emに一意になることは必要yでないことに注意。 例えば、 次においては: ◎ Note that this causes the value to be unique per element, not per value necessarily. For example, in:
.random-squares { width: random(per-element, 100px, 500px); height: random(per-element, 100px, 500px); }
`.random-squares^css に合致している要素たちは,互いに別個な~random値を取得するが、 各~要素の[ `width$p, `height$p ]~propは,どちらも`同じ値^emをとり,要素を正方形にする。 — それらの~propの`~random~cache用~key$は ( `100px^v, `500px^v, ~NULL, ~NULL, 当の要素~用の一意な値 ) であり、 どちらの関数も同じ要素~上では同じ長さに解決されるので。 ◎ Every element matching .random-squares will get a distinct random value, but that value will be the same for width and height on a given element, making the element square. This is because in both properties the random-caching key is (100px, 500px, null, null, [unique value for the element]), so both functions will resolve to the same length on a single element.
これは、 `~custom~prop$における~randomな値が,より予測-可能に動作するようにする。 上の~codeは、 次のように書くこともできる: ◎ This makes random values in custom properties act more predictably. The preceding code could also be written as:
.foo { --size: random(per-element, 100px, 500px); width: var(--size); height: var(--size); }
9. ~tree計数~関数: `sibling-count^f, `sibling-index^f 記法
`sibling-count@f `関数-記法$は、 この記法を利用した要素の親の子~群を成す`要素$の総数を `integer$t として表現する。 ◎ The sibling-count() functional notation represents, as an <integer>, the total number of child elements in the parent of the element on which the notation is used.
`sibling-index@f `関数-記法$は、[ この記法を利用した要素は,その親の子~群を成す何個目の要素なのか ]を — `nth-child()$ps と同様に 1 から数える — `integer$t として表現する。 ◎ The sibling-index() functional notation represents, as an <integer>, the index of the element on which the notation is used among the children of its parent. Like :nth-child(), sibling-index() is 1-indexed.
注記: `counter$f 関数は, `sibling-index$f と類似な能を供せるが、 それは, `integer$t ではなく `string$t を返す。 ◎ Note: The counter() function can provide similar abilities as sibling-index(), but returns a <string> rather than an <integer>.
これらの関数は、 `疑似要素$に利用されたときは, その`最終的な出自の要素$に対し指定されたかのように解決される。 ◎ When used on a pseudo-element, these both resolve as if specified on its ultimate originating element.
注記: [ `sibling-count$f, `sibling-index$f ]は、 他の(`選択子$以外の)~CSSと同様に, `平坦~化された要素~tree$に対し演算する ◎ Note: Like the rest of CSS (other than selectors), sibling-count() and sibling-index() operate on the flat tree.
注記: これらの関数は、 将来においては,拡張され得る — `nth-child()$ps と類似に, 子~群を下位集合に~filterするための of `selector^t 引数を受容するよう。 ◎ Note: These functions may, in the future, be extended to accept an of <selector> argument, similar to :nth-child(), to filter on a subset of the children.
10. 内在的~sizeを伴う計算-法: `calc-size^f 関数
`calc$f 関数は、[ 2 個の `確定的~size$の合間で遷移するとき/ 既存の`確定的~size$を少し調整するとき ]には,申し分なく働く (例: `100%^v と `20px^v の中間点は `calc(50% + 10px)^v で得られ, 両~側に~margin `15px^v を伴う `20%^v は `calc(20% + 15px * 2)^v で得られる, 等々)。 が,そのような演算は、[ 遷移する/調整する ]よう求まれる~sizeが`内在的~size$である場合には,もはやアリでない — それには、 実施~上の理由も後方-互換性の理由もある。 ◎ When transitioning between two definite sizes, or slightly adjusting an existing definite size, calc() works great: halfway between 100% and 20px is calc(50% + 10px), 20% with a margin of 15px on either side is calc(20% + 15px * 2), etc. ◎ But these operations are no longer possible if the size you want to adjust or transition to/from is an intrinsic size, for both practical and backward-compatibility reasons.\
`calc-size$f 関数は、 内在的~sizeに対し[ 安全かつ きちんと定義された仕方で~mathが遂行される ]ことを許容する。 ◎ The calc-size() function allows math to be performed on intrinsic sizes in a safe, well-defined way.
`calc-size()@t = calc-size( `calc-size-basis$t, `calc-sum$t ) `calc-size-basis@t = `intrinsic-size-keyword$t | `calc-size$f | `any$vC | `calc-sum$t
`intrinsic-size-keyword@t 生成規則は、 当の文脈において許容される どの`内在的~size$~keywordにも合致する。 例えば, `width$p においては、[ `~autoS$v, `min-content$v, `stretch$v, 等々 ]に合致する。 ◎ The <intrinsic-size-keyword> production matches any intrinsic size keywords allowed in the context. For example, in width, it matches auto, min-content, stretch, etc.
なぜ `calc-size$f は入子にできるか? ◎ Why can calc-size() be nested?
基底s引数【 `calc-size-basis$t 】として `calc-size$f を許容することは、 作者は,基底sとして変数【 `var$f 】を利用できることを意味する ( `calc-size(var(--foo), size + 20px)^v の様に) — それは、 当の変数【 `var^f が参照する~custom~propの値】が[ 元々,当の~prop用の値として妥当である場合 ]に限り,`常に働く^emことになる。 ◎ Allowing calc-size() as the basis argument means that authors can use a variable as the basis (like calc-size(var(--foo), size + 20px)) and it will always work as long as the variable was originally valid for the property.
同じことを `calc$f だけで行っても働かない — 例えば, `--foo^p の値に `calc-size(min-content, size + 20px)^v を指定した場合 (あるいは `min-content^v だけを指定した場合でも)、 `calc( (var(--foo)) + 20px )^v は失敗する。 ◎ Doing the same with just calc() doesn’t work - for example, if you have --foo: calc-size(min-content, size + 20px), or even just --foo: min-content, then calc( (var(--foo)) + 20px ) fails.
入子ngは[ 補間の間, 使用~値の時点 ]で単純~化され,消え去るので、 当の基底sは — 補間や他の効果が生じる時点に先立って — 常に,単純な値になる — § `calc-size^f の単純~化-法 を見よ。 ◎ The nesting is simplified away during interpolation, and at used-value time, so the basis always ends up as a simple value by the time interpolation and other effects occur; see § 10.1 Simplifying calc-size().
1 個目の引数は、 `~calc-size基底s@ を与える。 2 個目の引数は、 `~calc-size計算式@ を与える。 どちらも、 `calc-sum$t である場合は ⇒# `length-percentage$t に`合致して$いなければナラナイ。 `length$t に解決するモノトスル。 ◎ The first argument given is the calc-size basis, and the second is the calc-size calculation.\ For either argument, if a <calc-sum> is given, its type must match <length-percentage>, and it must resolve to a <length>.
`~calc-size基底s$が `any$vC でない場合、 `~calc-size計算式$の中では,~keyword `size@vC が許容される。 この~keywordは `length$t であり, `使用~値$の時点で解決される。 ◎ Within the calc-size calculation, if the calc-size basis is not any, the keyword size is allowed. This keyword is a <length>, and resolves at used value time.
`calc-size$f は、 ある`内在的~size$を表現する。 特定的に、 それは, `length$t `ではない^em — `calc-size^f を受容するよう求まれる箇所は,どこであれ、 その文法~内に明示的に含めなければナラナイ。 ◎ calc-size() represents an intrinsic size. It is specifically not a <length>; any place that wants to accept a calc-size() must explicitly include it in its grammar.
なぜ `calc$f 内に内在的~size~keywordを許容するだけは済まないのか? ◎ Why not just allow intrinsic keywords in calc()?
理論~上は、 `calc-size$f を導入することなく — 補間が通常通り働くことを許容するために — `calc(auto * .5)^v が妥当になるよう定義することもできた。 ◎ In theory, rather than introducing calc-size(), we could have defined calc(auto * .5) to be valid, allowing interpolation to work as normal.
が、 これには小さな課題がある: 複数の~keywordを併用することは,依然として許容されないが、 そのことは,さほど明白でない (すなわち、 `calc((min-content + max-content)/2)^v は適理に見えるが,許容されない)。 ◎ This has the minor issue that mixing keywords still wouldn’t be allowed, but it wouldn’t be as obvious (that is, calc((min-content + max-content)/2) looks reasonable, but would be disallowed).
より大きな課題は、 これが百分率を滑らかに遷移することを許容しないことにある。 `calc(50%)^v は、 当の文脈において百分率が`確定的~size$になるときは, `calc(100%)^v が成す~sizeの半分になるが、 そうでない場合には,通例的に `calc(100%)^v と同じ~sizeになる (当の文脈に依存して, `0px^v になるか `~autoS$v で~sizeされる)。 ◎ The larger issue, tho, is that this wouldn’t allow us to smoothly transition percentages. calc(50%) is only half the size of calc(100%) when percentages are definite in the context; if they’re not, the two values will usually be the same size (depending on the context, either 0px or auto-sized).
新たな関数として[ 計算-対象の~sizeを計算式~自体から明示的に分離するもの ]を利用すれば、 `すべての事例^emで,滑らかな補間が得られるようになる。 ◎ Using a new function that explicitly separates the size you’re calculating with from the calculation itself lets us get smooth interpolation in all cases.
追加的な考慮として、[ ある要素が内在的に~sizeされるか確定的になるか ]に依存して, 小さくなったり大きくなるような多くの効果が在る。 `calc$f を利用することは、 “要素は内在的に~sizeされたか?” という問いに対する答えが, ある遷移の途中と終端で異なることを意味する ( 【 `min-content^v から `20px^v へ遷移させる事例では,進捗~率 0.8 の時点で:】 途中では `calc(min-content * .2 + 20px * .8))^v になり, “はい” になる一方で、 終端では `calc(20px)^v になり, “いいえ” になる)。 その結果、 他では滑らかな遷移が,終了~時には~layoutが急変するようになる。 ◎ An additional consideration is that there are many effects, some small and some large, that depend on whether an element is intrinsically sized or definite. Using calc() would mean that the answer to the question "is the element intrinsically-sized" can have one answer in the middle of a transition ("yes", for calc(min-content * .2 + 20px * .8))), but a different answer at the end of the transition ("no", for calc(20px)), causing the layout to jump at the end of an otherwise-smooth transition.
(これは、 `opacity$p を `1^v から `0^v へ~animateするときに生じ得る積層~層の変化に類似する — `1^v 以外の値は積層~文脈を強制するので。 `opacity$p においては、[ `1^v から視覚的に判別-不能でありながら積層~文脈を強制する `.999^v ]へ~animateすることにより対処できる。 が、 内在的か否かを維持することを確保するために, `calc(auto * .0001)^v へ~animateするよう人々に依頼することは、 それほど適理ではない。) ◎ (This is similar to the stacking-layer changes that can occur when animating from opacity:1 to opacity: 0; any non-1 value forces a stacking context. With opacity you can get around this by animating to .999, which is visually indistinguishable from 1 but forces a stacking context. It’s not as reasonable to ask people to animate to calc(auto * .0001) to ensure it retains its intrinsic-ness.)
`calc-size(auto, 20px)^v の様に,[ 自身が`内来的^emに内在的~sizeであるものとして識別される新たな関数 ]を利用することは、[ 実際の~sizeが確定的~長さであるとき ]でも[ ~layoutの挙動が時間~全体にわたり安定になるよう保守できる ]ことを意味する。 ◎ Again, using a new function that identifies itself as being inherently an intrinsic size, like calc-size(auto, 20px), means we can maintain stable layout behaviors the entire time, even when the actual size is a definite length.
10.1. `calc-size^f の単純~化-法
`~calc-size計算式$は (および、 `~calc-size基底s$が `calc-sum$t である場合は,それも)、[ `指定d値$, `算出d値$ ]どちらの時点でも,アリな限り単純~化される — `~math関数$と類似に, `~level 4$ の `§ 単純~化@~CSSVAL#calc-simplification$ にて定義されるとおりに。 ◎ Similar to math functions, at both specified value and computed value times the calc-size calculation (and the calc-size basis, if it’s a <calc-sum>) are simplified to the extent possible, as defined in CSS Values 4 § 10.10.1 Simplification.
`~calc-size関数を補間~用に正準-化する@ ときは、 所与の ( `calc-size$f 関数 %関数 ) に対し: ◎ To canonicalize for interpolation a calc-size() function:
- %基底s ~LET %関数 の`~calc-size基底s$
- %計算式 ~LET %関数 の`~calc-size計算式$
- %正準-化済み基底s ~LET %基底s
- %正準-化済み計算式 ~LET %計算式
- %挿入~値 ~LET ε
-
~IF[ %基底s は `calc-size$f 関数である ]:
- %正準-化済み基底s ~SET `~calc-size関数を補間~用に正準-化する$( %基底s の`~calc-size基底s$ )
- %挿入~値 ~SET %基底s の`~calc-size計算式$
-
~ELIF[ %基底s は `calc-sum$t である ]:
- ~IF[ %基底s の`型$は `length$t に`合致して$いる ( %基底s は百分率を包含しない) ] ⇒# %正準-化済み基底s ~SET `any$vC; %挿入~値 ~SET %基底s
- ~ELSE ⇒# %正準-化済み基底s ~SET `100%^v; %挿入~値 ~SET `~calc-size計算式を非~百分率~化する$( %基底s )
-
~IF[ %挿入~値 ~NEQ ε ]:
- %正準-化済み計算式 ~SET `~calc-size計算式の中へ代入する$( %計算式, %挿入~値 )
- ~IF[ %正準-化済み計算式 ~EQ `失敗^i ] ⇒ ~RET `失敗^i
- ~RET 次を伴う新たな `calc-size$f 関数 ⇒# その`~calc-size基底s$ ~SET %正準-化済み基底s その`~calc-size計算式$ ~SET %正準-化済み計算式
注記: %正準-化済み基底s は、[ ~keyword / `100%^v ]いずれかになる。 ◎ Note: After canonicalization, a calc-size() function will only have a calc-size basis that’s a keyword, or the value 100%.
なぜ百分率は,この仕方で単純~化されるか? ◎ Why are percentages simplified in this way?
この百分率~単純~化は、 遷移が線形に働くことを確保する。 ◎ This percentage simplification ensures that transitions work linearly.
例えば, `100%^v は — 単純にするため — `100px^v に等しくなるとする。 ◎ For example, say that 100% is 100px, for simplicity.
`calc-size(100px, size * 2)^v ( `200px^v に解決される) から `calc-size(50%, size - 20px)^v ( `30px^v に解決される) へ[ 両~引数(`~calc-size基底s$, `~calc-size計算式$)とも補間してから、 結果の `calc-size^f の[ 基底s, 計算式 ]に対し,計算式の中へ基底sを代入する ]ことにより遷移させた場合、 中間点では `calc-size(75px, size * 2 * .5 + (size - 20px) * .5)^v ( `102.5px^v へ解決される) になるが, それは `30px^v から `200px^v までの中間点( `115px^v )ではない。 そのように補間すると、 一般に,`二次^emな補間の挙動を与える†。 ◎ If you transitioned from `calc-size(100px, size * 2)` (resolves to 200px) to `calc-size(50%, size - 20px)` (resolves to 30px) by interpolating both the arguments, then at the halfway point you’d have `calc-size(75px, size * 2 * .5 + (size - 20px) * .5)` (resolves to 102.5px), which is *not* halfway between 30 and 200 (that would be 115px). Interpolating one argument, then substituting it into another calculation and interpolating that one too, generally gives quadratic interpolation behavior.
【† `size$vC ~keywordによる寄与に進捗~率が重ねて乗算され, 結果は進捗~率の二次式になる。 】
代わりに、 まず,【各 `calc-size^f に対し】基底s引数を計算式~引数の中へ代入する — その結果 `calc-size(percentage, 100px * 2)^v, `calc-size(percentage, (size * .5) - 20px)^v を中間点で補間することで, `calc-size(percentage, 100px * 2 * .5 + ((size * .5) - 20px) * .5)^v を取得する — それは、 期待されるとおり,~~実際に `115px^v に解決される。 遷移における他の地点も類似に線形になる。 ◎ Instead, we substitute the basis arg into the calculation arg, so you get `calc-size(percentage, 100px * 2)` and `calc-size(percentage, (size * .5) - 20px)`, and when interpolated, at the halfway point you get `calc-size(percentage, 100px * 2 * .5 + ((size * .5) - 20px) * .5)`, which does indeed resolve to 115px, as expected. Other points in the transition are similarly linear.
`~calc-size計算式を非~百分率~化する@ ときは、 所与の ( `~calc-size計算式$ %計算式 ) に対し: ◎ To de-percentify a calc-size calculation calc:
-
%計算式 を成す ~EACH( `percentage-token$t %百分率~token ) に対し:
- %N ~LET %百分率~token の.値 ~DIV 100
- %計算式 の中の %百分率~token を `(size * N)^v に置換する
- ~RET %計算式 ◎ Return calc.
注記: 例えば、 `50% + 20px^v は `(size * .5) + 20px^v になる。 ◎ Note: For example, 50% + 20px becomes (size * .5) + 20px.
`~calc-size計算式の中へ代入する@ ときは、 所与の ( `~calc-size計算式$ %計算式, 値 %挿入~値 ) に対し: ◎ To substitute into a calc-size calculation calc a value insertion value:
- ~IF[ %計算式 内には `size$vC ~keywordは無い ] ⇒ ~RET %計算式 ◎ If calc doesn’t have the size keyword in it, do nothing.
- %代入-済み計算式 ~LET %計算式 内の 各 `size$vC ~keywordを[ 丸括弧で括られた %挿入~値 ]に置換した結果 ◎ Otherwise, replace every instance of the size keyword in calc with insertion value, wrapped in parentheses.
-
~IF[ %代入-済み計算式 は,~UA定義な上限を超える値を生産する ] ⇒ ~RET `失敗^i ◎ If this substitution would produce a value larger than an UA-defined limit, return failure.
注記: これは、[ 変数の代入 ]用に定義される[ 代入に対する攻撃に抗する保護 ]と意図的に一致する — `CSS-VARIABLES-1$r `§ 長過ぎな代入に対する安全な取扱い@~CSSVAR#long-substitution$ を見よ。 しかしながら、 `calc-size$f 値が ごく長くなる利用事例は,`~custom~prop$よりもずっと少ないので、 ~UAは,より低い~size上限を課すよう望むかもしれない。 ◎ Note: This is intentionally identical to the protection against substitution attacks defined for variable substitution; see CSS Variables 1 § 3.3 Safely Handling Overly-Long Variables. However, the use-cases for very long calc-size() values are much less than for long custom properties, so UAs might wish to impose a smaller size limit.
- ~RET %代入-済み計算式 ◎ ↑
10.2. `calc-size^f の解決-法
`calc-size$f は — 以下、[ %基底s は その`~calc-size基底s$, %計算式 は その`~calc-size計算式$ ]を指すとする: ◎ ↓
- すべてに関して, %基底s であったかのように扱われる (未指定な`確定的~size$として動作する)。 ◎ A calc-size() is treated, in all respects, as if it were its calc-size basis (with any acting as an unspecified definite size).
- しかしながら,実際に~layout計算を遂行するときには、 %基底s が表現する~sizeは, %計算式 の値へ改変される — %計算式 内の各 `size$vC ~keywordを[ %基底s の元の~size ]に評価する下で。 ◎ When actually performing layout calculations, however, the size represented by its calc-size basis is modified to be the value of its calc-size calculation, with the size keyword evaluating to the calc-size basis’s original size.
- %基底s が `any@vC をとる場合、[ %計算式 に等しい長さ ]を与える`確定的~size$になる。 ◎ (If the calc-size basis is any, the calc-size() is a definite length, equal to its calc-size calculation.)
例えば, `height: calc-size(auto, round(up, size, 20px))$p を伴う要素は、 `height: auto^p を伴う要素と同じに扱われるが, その~sizeは,それ以上かつ最も近い `20px^v の整数倍へ丸められる。 ◎ For example, an element with height: calc-size(auto, round(up, size, 20px)) will be treated identically to an element with height: auto, but with its size rounded up to the nearest multiple of 20px.
`~calc-size計算式$を評価するときは、[ 所与の文脈において百分率は確定的でない場合 ]には `0px^v 解決され, 他の場合は通常通り解決される。 ◎ When evaluating the calc-size calculation, if percentages are not definite in the given context, they resolve to 0px. Otherwise, they resolve as normal.
( `~calc-size基底s$における百分率の扱いは他と異なる: `単純~化@#simplifying-calc-size$は、 百分率を`~calc-size計算式$の中へ移動すると伴に,それを `size$vC 参照で置換する。 その結果,`~calc-size基底s$は、 `100%^v になる。 それは、[ 何であれ,当の文脈における `100%^v に対する通常の挙動 ]と同じに挙動する — それが[ 場合によっては、 ~propは`~autoとして挙動する$ ]ようになる場合, 等々も含めて。) ◎ (A percentage in the calc-size basis is treated differently; simplification moves the percentage into the calc-size calculation and replaces it with size references. The calc-size basis then becomes 100%, behaving as whatever 100% would normally do in that context, including possibly making a property behave as auto, etc.)
注記: 基底sにおける百分率は,通常通り働くので、 常に,`どの~size^emへも — その値や挙動に関わらず — 滑らかに遷移させれる。 例えば、 `calc-size$f を伴わない下で, `100%^v から `0px^v へ遷移する場合、 それが滑らかに働くのは,百分率が`確定的~size$になる場合に限られる — そうでない場合, 当の~propは遷移~全体にわたって`~autoとして挙動する$かもしれず、 そうなる場合,~sizeは実際には まったく変化しなくなる。 ◎ Percentages in the basis work as normal so you can always smoothly transition to any size, regardless of its value or behavior. For example, without calc-size(), transitioning from 100% to 0px only works smoothly if the percentage is definite; if it’s not, then during the entire transition the property might behave as auto and not actually change size at all.
他方、 計算式における百分率は,不定なときには 0 へ解決される — `calc-size$f が 2 つの異なる仕方で動作するようになり得ることを避けるため。 `min-content$v ~sizeと `100%^v ~sizeで~layout効果が異なる結果になる事例もあり、 そこでの `calc-size^f は,どちらか一方として装う必要がある。 ◎ Percentages in the calculation, on the other hand, are resolved to 0 when indefinite to avoid making the calc-size() potentially act in two different ways; there are some cases where a min-content size will cause different layout effects than a 100% size, and so a calc-size() has to masquerade as one or the other.
10.3. `calc-size^f の補間-法
2 個の `calc-size$f 関数 %A, %B は、 以下に従って補間される: ◎ Two calc-size() functions can be interpolated if\
- ~Assert: %A, %B は`正準-化済み@#calc-size-canonicalize-for-interpolation$である (どちらかが `失敗^i であったならば %A, %B は補間し得ない)
- %基底s ~LET %A の`~calc-size基底s$
- ~IF[ %基底s ~NEQ %B の`~calc-size基底s$ ]~AND[ %基底s ~EQ `any$vC ] ⇒ %基底s ~SET %B の`~calc-size基底s$
- %計算式 ~LET %A, %B の`~calc-size計算式$を補間した結果
- ~RET 次を伴う新たな `calc-size$f 関数 ⇒# その`~calc-size基底s$ ~SET %基底s その`~calc-size計算式$ ~SET %計算式
注記: 補間に対する これらの制約は、[ `calc-size$f は,同時に 2 つの異なる仕方で動作するよう試行しない ]ことを確保する。 例えば,[ `min-content$v, `max-content$v ]が~layoutに対し異なる挙動を生産する事例もあるので、 `calc-size^f は,どちらか一方として装う必要がある。 あいにく,このことは、 `~autoS$v から `min-content^v へ行く様な~keywordどうしでは遷移し得ないことを意味する。 ◎ Note: These interpolation restrictions ensure that a calc-size() doesn’t try to act in two different ways at once; there are some cases where a min-content and max-content would produce different layout behaviors, for example, so the calc-size() has to masquerade as one or the other. This, unfortunately, means you can’t transition between keywords, like going from auto to min-content.
`calc-size$f 値には[
`length-percentage$t / `intrinsic-size-keyword$t
]値 %値 と補間できるものもある。
[
これらの値を補間できるかどうか, できる場合の補間の挙動
]を決定するときは、
%値 を[
%値 は `calc-sum$t として与えられた場合は
calc-size(`any$vC, %値 )
/
~ELSE_
calc-size( %値, `size$vC)
]として扱う下で,上の規則を適用する。
◎
Some calc-size() values can also be interpolated with a <length-percentage> or an <intrinsic-size-keyword>. To determine whether the values can interpolate and what the interpolation behavior is, treat the non-calc-size() value as calc-size(any, value ) if the value is a <calc-sum> or as calc-size( value , size) otherwise, and apply the rules above.
例えば、 `height$p においては, `calc-size$f と `auto^v の補間は許容される: ◎ For example, calc-size() allows interpolation to/from height: auto:
details { transition: height 1s; } details::details-content { display: block; } details[open]::details-content { height: auto; } details:not([open])::details-content { height: calc-size(any, 0px); }
これは、 暗黙的に[ `calc-size(auto, size)^v, `calc-size(any, 0px)^v ]の合間を補間することになる。 `details$e を開いてから 0.5 秒~後には、 `details-content^pe† の `height$p は, 開な~sizeの半分 `calc-size(auto, size * .5)^v になり、 その縦幅は,遷移~全体を通して滑らかに~animateすることになる。 ◎ This will implicitly interpolate between calc-size(auto, size) and calc-size(any, 0px). Half a second after opening the details, the ::details-content wrapper’s height will be calc-size(auto, size * .5), half its open size; thruout the transition it’ll smoothly animate its height.
【† この疑似要素を定義する仕様は現時点では無いが、[ `details$e 要素の要約( `summary^e )以外を成す部分を包装する~box ]になることが意図されると思われる。 】
注記:
`calc-size$f は、
calc-size(any, `確定的~size$)
と他の何かの間で
— “他の何か” がどう指定されたかに関わらず —
`常に^em滑らかに遷移することになるよう設計された。
◎
Note: calc-size() is designed such that transitioning to/from calc-size(any, definite length) will always work smoothly, regardless of how the other side of the transition is specified.
注記: この “素な値【上で述べた %値 】を `calc-size$f へ昇格する” 挙動は、 `~calc-size計算式$の中へ `length-percentage$t 値を置く。 これは,[ 百分率を伴う値と内在的~size~keyword ]を補間することを許容するが、 当の百分率は`確定的~size$でない場合, それは 0 へ解決されるようになることを意味する。 【作者は,】百分率が[ 要素の実際の~sizeを~~基準に解決される ]ようになることを求める場合には、 `calc-size^f の`~calc-size基底s$において,明示的に値を与えること — `calc-size(50%, size)^v の様に。 ◎ Note: This "upgrade a plain value into a calc-size()" behavior puts <length-percentage> values into the calc-size calculation. This allows values with percentages to interpolate with intrinsic size keywords, but does mean that when a percentage isn’t definite, it’ll resolve to zero. If you want to resolve to the actual size the percentage would make the element, explicitly write a calc-size() with the value in its calc-size basis, like calc-size(50%, size).
10.4. ~sizing~keywordの補間-法: `interpolate-size^p ~prop
注記: 過去に戻れたなら、 この~propは必要なかった。 これが存在するのは、 既存の多くの~stylesheetが[ 内在的~sizing~keyword( `~autoS$v, `min-content$v, 等々)は~animateし得ない ]ものと見做すからである。 したがって,この~propは、[ ~stylesheetが,期待される挙動を取得するよう選ぶ ]ことを許容するために存在する。 根~要素に `interpolate-size:allow-keywords$p を指定した場合、 ~page全体~用に新たな挙動を選ぶことになる。 互換性が課題にならないときは、 そうすることが示唆される。 ◎ Note: If we had a time machine, this property wouldn’t need to exist. It exists because many existing style sheets assume that intrinsic sizing keywords (such as auto, min-content, etc.) cannot animate. Therefore this property exists to allow style sheets to choose to get the expected behavior. Specifying interpolate-size: allow-keywords on the root element chooses the new behavior for the entire page. We suggest doing this whenever compatibility isn’t an issue.
◎名 `interpolate-size@p ◎値 `numeric-only$v | `allow-keywords$v ◎初 `numeric-only$v ◎適 すべての要素 ◎継 される ◎百 受容しない ◎算 指定されたとおり ◎順 文法に従う ◎ア ~animate不可 ◎表終- `numeric-only@v
- `intrinsic-size-keyword$t は、 補間できない。 ◎ An <intrinsic-size-keyword> cannot be interpolated.
- `allow-keywords@v
- `intrinsic-size-keyword$t は、 `length-percentage$t との間でも補間できる。 これは、 所与の `intrinsic-size-keyword$t %~keyword に対し,[ %~keyword は `calc-size(keyword, size)^v であった ]かのように扱う下で[ `calc-size$f の`補間-法@#interp-calc-size$を適用する ]ことにより行われる。 `length-percentage^t 以外の値とは,依然として補間できない。 ◎ Two values can also be interpolated if one of them is an <intrinsic-size-keyword> and the other is a <length-percentage>. This is done by treating the <intrinsic-size-keyword> keyword as though it is calc-size(keyword, size) and applying the rules in § 10.3 Interpolating calc-size(). In other cases, an <intrinsic-size-keyword> still cannot be interpolated.
`interpolate-size$p の値が問われるものは、 ~animationが開始するかもしれない時点における当の要素の【他の~propの】算出d値である。 ~CSS遷移~用には、 これは,`変化-後~style$における値を意味する。 ~animationは、 後で `interpolate-size^p が変化しても[ 停止される/開始される ]ことはない。 ◎ The value of interpolate-size that matters is the computed value on the element at the time the animation might start. For CSS transitions, this means the value in the after-change style. An animation is not stopped or started later because interpolate-size changes.
付録 A. 任意-代入~関数
`任意-代入~関数@ ( `arbitrary substitution function^en )とは、 解決されるとき,自身に[ 構文解析-時点では未知にもなり得る他の値 ]が`代入-$されることになる`関数-記法$である — したがって,その`算出d値$を解決する間に構文解析するモノトスル。 ◎ An arbitrary substitution function is a functional notation that will, when resolved, substitute itself with other values that are potentially unknowable at parse time—and must therefore be parsed while resolving its computed value.
注記: `任意-代入~関数$は,`算出d値$の時点で解決されるので、 代入された結果の値が無効になる場合, 当の~propは(本質的に) `unset$v の挙動へ~fall-backする — ~prop宣言が構文解析-時に無効になったときには, `~cascade$において より早い値【より優先度が低い宣言】へ~fall-backするが、 そうではなく。 `無効な代入@#invalid-substitution$を見よ。 ◎ Note: Since arbitrary substitution functions resolve at computed value time, if the resulting value after substitution is invalid, the property falls back (essentially) to unset behavior, rather than falling back to an earlier value in the cascade the way declarations invalid at parse time do. See Invalid Substitution.
他が指定されない限り,`任意-代入~関数$は、 どの~propの どの値においても, それを成す どの場所にも(他の`関数-記法$の中も含めて)利用できる — 他の文脈においては妥当でない。 ◎ Unless otherwise specified, arbitrary substitution functions can be used in place of any part of any property’s value (including within other functional notations); and are not valid in any other context.
これらの関数のうち,~propの外側の文脈においても妥当になるべきものはあるか? ◎ Should any of these functions be valid in contexts outside of properties?
次の~codeは、 ~prop名として変数を利用するよう試みるので,不正な例になる: ◎ For example, the following code incorrectly attempts to use a variable as a property name:
.foo { --side: margin-top; var(--side): 20px; }
これは、 `margin-top:20px$p を設定することに等価`でない^em。 2 個目の宣言は、 単に無効な~prop名として構文~errorにされ,棄てられる。 ◎ This is not equivalent to setting margin-top: 20px;. Instead, the second declaration is simply thrown away as a syntax error for having an invalid property name.
ある~propの値が`任意-代入~関数$たちを包含していて, いずれも構文として妥当である場合、 当の値~全体の文法は,構文解析-時には妥当であると見做すモノトスル。 ◎ If a property value contains one or more arbitrary substitution functions, and those functions are themselves syntactically valid, the entire value’s grammar must be assumed to be valid at parse time.
`任意-代入~関数$は、 値に対する他の[ 変形n/自己検分 ]が生じ得る前に, ~styleの`算出d値$を得る間に`代入-$される。 ある~prop【の値】が`代入$の後において, それの【当の~prop用に】宣言された文法に合致しない場合、 当の宣言は,`算出d値の時点で無効$になる。 ◎ Arbitrary substitution functions are substituted during style computation, before any other value transformations or introspection can occur. If a property, after substitution, does not match its declared grammar, the declaration is invalid at computed-value time.
ある~propの値が[ `代入$の後において, 1 個の`~CSS全域~keyword$(および,場合によっては空白)のみを包含する ]場合、 その値【`算出d値$】は,[ その`指定d値$は初めから当の~keywordであった ]かのように決定される。 ◎ If a property value, after substitution, contains only a single CSS-wide keyword (and possibly whitespace/comments), its value is determined as if that keyword were its specified value all along.
例えば,次の用法は、 構文の観点からは~~問題ないが、 変数が代入された後は無意味な結果になる: ◎ For example, the following usage is fine from a syntax standpoint, but results in nonsense when the variable is substituted in:
:root { --looks-valid: 20px; } p { background-color: var(--looks-valid); }
`20px^v は, `background-color$p 用の値としては妥当でないので、 この~propは,`算出d値の時点で無効$になる — 代わりに `transparent$v ( `background-color^p 用の`初期~値$)に解決される。 ◎ Since 20px is an invalid value for background-color, the property becomes invalid at computed-value time, and instead resolves to transparent (the initial value for background-color).
~propが既定で継承されるもの( `color$p など)ならば、 `初期~値$ではなく`継承d値$に算出される。 ◎ If the property was one that’s inherited by default, such as color, it would compute to the inherited value rather than the initial value.
`var$f 関数は、 `~custom~prop$からは`~CSS全域~keyword$を取得し得ない — `--foo: initial^p の様に指定するよう試行した場合、 単に,~custom~prop用に`明示的な~default法@~CASCADE#defaulting-keywords$を誘発することになる 【その結果,当の `var^f には `--foo^p の`初期~値$が代入される】。 が、 その~fallbackは`~CSS全域~keyword$をとり得る: ◎ While a var() function can’t get a CSS-wide keyword from the custom property itself—if you tried to specify that, like --foo: initial;, it would just trigger explicit defaulting for the custom property—it can have a CSS-wide keyword in its fallback:
p { color: var(--does-not-exist, initial); }
上の~codeでは, `--does-not-exist^p ~propが[ 存在しない/`算出d値の時点で無効$になる ]場合、 `var$f には代わりに `initial$v ~keywordが代入され, `color$p ~propは元から `initial^v であったかのように挙動する。 その結果、 `color^p は,その初期~値をとることになる。 一方で,~fallbackが与えられなかった場合、 `color^p は既定では継承するので,それに従うことになる。 ◎ In the above code, if the --does-not-exist property didn’t exist or is invalid at computed-value time, the var() will instead substitute in the initial keyword, making the property behave as if it was originally color: initial. This will make it take on the document’s initial color value, rather than defaulting to inheritance, as it would if there were no fallback.
各種 `任意-代入~関数$は、 それ用に `任意-代入~関数を解決する@ 方法を ( %結果, %~fallback ) が成す組を返すものとして定義しなければナラナイ†。 %結果 は ε でないならば,当の関数を置換するために利用される — 他の場合、 %~fallback が ε でないならば,それが利用される。 [ %結果 / %~fallback ]における ε は、 `代入$において,`無効が保証される値$として取扱われることになる。 ◎ Each arbitrary substitution function must define how to resolve an arbitrary substitution function for itself, returning optional result and fallback values. The result is used to replace the function as long as it does not contain the guaranteed-invalid value; the fallback is used otherwise. (The fallback does not need to be resolved in any way; substitution will handle that if it’s actually used.)
【† これは、 暗黙的な文脈として[ 当の関数を値に利用した~prop, それが適用される要素 ]も入力にとる (関数によっては、それらをとらないものもある)。 `var$f 関数~用に`解決する@~CSSVAR#resolve-a-var-function$ときなど (現時点では,`任意-代入~関数$は~prop以外の文脈では妥当でないので、 これらは常に存在する)。 したがって、 この~algoを呼出す~algoも,同様にそれを入力にとる。 】【 `任意-代入~関数を解決する$方法を指定する各~仕様では, ( ε ではなく)明示的に`無効が保証される値$を返すものもあるが、 それらの和訳では,どちらにも ε を利用することにする — どちらも`代入-$時には同じに扱われるので。 】
注記: 例えば, `var$f 関数を`解決する手続き@~CSSVAR#resolve-a-var-function$を見よ。 ◎ Note: See, for example, resolve a var() function.
所与の値 %値 内の `任意-代入~関数たちへ代入する@ ときは: ◎ To substitute arbitrary substitution functions in a value:
【 動詞 “~~代入する” の原語 `substitute^en は、 一般に, “その場限り” の含みがある~~置換を意味する — “~~永続的な” 含みがある “~~置換( `replace^en )” に比して。 “%x に %y を~~代入する” の様な句は、 日本語の都合に合わせた表現であり, 英語に則った解釈においては “%x を %y で `substitute^en する” の様に表現する方が適切になる (英語と一貫させる対訳として “~~代用する” も挙げられ、 ~CSS変数~以外の文脈においては,その方が適することもあるが)。 】
-
%値 を成す ~EACH( `任意-代入~関数$ %関数 ) に対し: ◎ For each arbitrary substitution function func in value:
-
( %結果, %~fallback ) ~LET %関数 用に`任意-代入~関数を解決する$
【 ここでは、 %関数 によっては, %値 を利用した~propが適用される要素も渡す必要がある。 】
◎ Resolve func. Let result be the returned result, and fallback be the returned fallback. - ~IF[ %結果 ~EQ ε ] ⇒ %結果 ~SET `無効が保証される値$ ◎ If no result was returned, set result to the guaranteed-invalid value.\
- ~IF[ %~fallback ~EQ ε ] ⇒ %~fallback ~SET `無効が保証される値$ ◎ If no fallback was returned, set fallback to the guaranteed-invalid value.
- ~IF[ %結果 は`無効が保証される値$を包含しない ] ⇒ %値 内の %関数 を %結果 で置換する ◎ If result does not contain the guaranteed-invalid value • Replace func in value with result.
- ~ELIF[ %~fallback は`無効が保証される値$を包含しない ] ⇒ %値 内の %関数 を %~fallback で置換する ◎ Otherwise, if fallback does not contain the guaranteed-invalid value • Replace func in value with fallback.
-
~ELSE:
- %値 全体を`無効が保証される値$で置換する
- ~RET
-
- ~IF[ %値 には`任意-代入~関数$が在る (すなわち,前~段における いずれかの[ %結果 / %~fallback ]は`任意-代入~関数$を包含していた) ] ⇒ ~GOTO 前~段 ◎ If there are still arbitrary substitution functions in value (due to substitution), repeat the previous step.
- ~IF[ %値 を通常通り文脈に則って文法を検査した結果, %値 は妥当でない ] ⇒ %値 全体を`無効が保証される値$で置換する ◎ Grammar-check value according to its context as normal. If it is not valid at this point, replace value with the guaranteed-invalid value.
注記: `代入$は、 ~CSS~token `css-syntax-3$r の~levelであり,~textな~levelではない — 一部分だけ変数から供されるような単独の~tokenを築くことはできない: ◎ Note that substitution takes place at the level of CSS tokens [css-syntax-3], not at a textual level; you can’t build up a single token where part of it is provided by a variable:
.foo { --gap: 20; margin-top: var(--gap)px; }
これは、 `margin-top:20px$p (長さ)を設定することに等価`ではない^em。 `margin-top:0 px^p と等価になり (値は、~spaceを挟んだ実数と識別子の並びになる), 単純に `margin-top$p ~propに対する無効な値になる。 このような場合、 `calc$f 式を利用すれば,同じものを妥当に得られる — 次の様に: ◎ This is not equivalent to setting margin-top: 20px; (a length). Instead, it’s equivalent to margin-top: 20 px; (a number followed by an ident), which is simply an invalid value for the margin-top property. Note, though, that calc() can be used to validly achieve the same thing, like so:
.foo { --gap: 20; margin-top: calc(var(--gap) * 1px); }
このことは、 代入~後の値も,そのままとして直に直列化-可能になるとは限らないことを含意する。 上と類似な次の例において: ◎ This also implies that the post-substitution value might not be directly serializable as-is. Here’s a similar example to the preceding:
.foo { --gap: 20; --not-px-length: var(--gap)px; }
`--not-px-length^p の算出d値(代入~後の値)の直列化は、 `20px^l にはならない — そうすると、 それを構文解析し直したとき,次元が結合された 1 個の~tokenになるので。 構文解析し直すときも別々な~tokenになることを施行するため、 代わりに, 2 個の~tokenの合間に~commentを挟んで — `20/**/px^l 【!px】の様に — 直列化されることになる。 ◎ The serialization of the computed (post-substitution) value of --not-px-length is not 20px, because that would parse back as the single combined dimension; instead, it will serialize with a comment between the two tokens, like px, to enforce that they are separate tokens even when re-parsing.
無効な代入
所与の~prop %~prop の値に対する`代入$の結果が`無効が保証される値$を包含するときは、 当の宣言は `算出d値の時点で無効@ になる。 これが起きた場合、 %~prop の`算出d値$は: ◎ When substitution results in a property’s value containing the guaranteed-invalid value, this makes the declaration invalid at computed-value time. When this happens, the computed value is one of the following depending on the property’s type:
- %~prop は登録-済みでない`~custom~prop$である場合 ◎ The property is a non-registered custom property
- %~prop は`全称~構文~定義$を伴う`登録-済み~custom~prop$である場合 ◎ The property is a registered custom property with universal syntax
- `無効が保証される値$になる。 ◎ The computed value is the guaranteed-invalid value.
- 他の場合 ◎ Otherwise
- [ %~prop は`継承d~prop$であるならば, %~prop の`継承d値$/ ~ELSE_ %~prop の`初期~値$ ]になる — %~prop の値として `unset$v ~keywordが指定されていたかのように。 ◎ Either the property’s inherited value or its initial value depending on whether the property is inherited or not, respectively, as if the property’s value had been specified as the unset keyword.
例えば、 次の~codeでは: ◎ For example, in the following code:
:root { --not-a-color: 20px; } p { background-color: red; } p { background-color: var(--not-a-color); }
`p^e 要素の背景は、 `red^v ではなく, `background-color$p の`初期~値$ `transparent$v (透明)になる。 `~custom~prop$自身が `unset$v されたり,無効な `var$f 関数を包含している場合も同じことが生じる。 ◎ the <p> elements will have transparent backgrounds (the initial value for background-color), rather than red backgrounds. The same would happen if the custom property itself was unset, or contained an invalid var() function.
このことと[ 作者が,~stylesheetに直に `background-color:20px$p と記しただけの場合に起こること ]との相違に注意されたし。 それは,通常の構文~errorなので、 その規則は 【`~cascadeの最初の段階@~CASCADE#filtering$で】 破棄される結果,規則 `background-color:red^p が代わりに利用されることになる。 ◎ Note the difference between this and what happens if the author had just written background-color: 20px directly in their stylesheet - that would be a normal syntax error, which would cause the rule to be discarded, so the background-color: red rule would be used instead.
注記: `算出d値の時点で無効$の概念は、 `任意-代入~関数$が他の構文~errorと異なり, “早期に失敗させ” 得ないがためにある。 ~prop値が無効であることが~UAに判明した時点では、 【より優先度が低い】 他の`~cascaded値$は,すでに棄てられている。 ◎ Note: The invalid at computed-value time concept exists because arbitrary substitution functions can’t "fail early" like other syntax errors can, so by the time the user agent realizes a property value is invalid, it’s already thrown away the other cascaded values.
略式~propにおける代入
`任意-代入~関数$は、 次に挙げる所で,ある複雑化をもたらす ⇒# `略式~prop$の値を その`下位prop$用の成分たちに構文解析するとき/ それら各~成分から`下位prop$を直列化するとき ◎ Arbitrary substitution functions produce some complications when parsing shorthand properties into their component longhands, and when serializing shorthand properties from their component longhands.
所与の`略式~prop$の値が,その ある`下位prop$用の成分として`任意-代入~関数$を包含する場合、 当の`下位prop$には,代わりに `代入待ちの値@ をあてがうモノトスル — この値は: ◎ If a shorthand property contains an arbitrary substitution function in its value, the longhand properties it’s associated with must instead be filled in with\
- 作者からは観測-不能な特別な値であり,[ 略式~propは`任意-代入~関数$を包含するので、 当の`下位prop$の値は,関数が`代入-$されるまで決定し得ない ]ことを指示する。 ◎ a special, unobservable-to-authors pending-substitution value that indicates the shorthand contains an arbitrary substitution function, and thus the longhand’s value can’t be determined until after substituted.
- 通常通り~cascadeするモノトスル。 ◎ This value must then be cascaded as normal,\
- 算出d値の時点で`代入-$された後に、 `略式~prop$の値を構文解析して,`下位prop$に適切な値をあてがうモノトスル。 ◎ and at computed-value time, after substitution, the shorthand must be parsed and the longhands must be given their appropriate values at that point.
【 該当する下位propは、 1 個の`任意-代入~関数$に対し複数個あり得る — 当の関数が成す略式~propの成分~値が,複数個の下位prop用の値を与えるものと定義されている場合や、 当の関数~自体が複数個の下位prop用の値を まとめて与えている場合など。 】
注記: ある`略式~prop$が`任意-代入~関数$を伴わずに記された場合、 その値は,構文解析-時点で`下位prop$用の成分たちに分離されるよう構文解析される。 各`下位prop$は、 その後に`~cascade$に関与する — それに伴い,当の`略式~prop$は概ね破棄される。 しかしながら,これは、 当の略式~propが`任意-代入~関数$【! `var$f 】を包含するときには行えない — それらの関数には、 何でも代入され得るので。 ◎ Note: When a shorthand is written without an arbitrary substitution function, it is parsed and separated out into its component longhand properties at parse time; the longhands then participate in the cascade, with the shorthand property more or less discarded. When the shorthand contains a var(), however, this can’t be done, as the var() could be substituted with anything.
`代入待ちの値$は、 それを観測することが~APIにより許容される所では, 空~文字列に直列化するモノトスル。 ◎ Pending-substitution values must be serialized as the empty string, if an API allows them to be observed.
`略式~prop$は、 その各`下位prop$用の成分の値を集めることにより直列化され, 同じ値~集合に構文解析されることになる値を合成することになる。 所与の`略式~prop$に対し: ◎ Shorthand properties are serialized by gathering the values of their component longhand properties, and synthesizing a value that will parse into the same set of values.
- すべての`下位prop$が`代入待ちの値$になる場合、 当の`略式~prop$は,その元の(`任意-代入~関数$を包含している)値に直列化するモノトスル。 ◎ If all of the component longhand properties for a given shorthand are pending-substitution values from the same original shorthand value, the shorthand property must serialize to that original (arbitrary substitution function-containing) value.
- 他の場合,いずれかの`下位prop$が[ `代入待ちの値$になる場合 / まだ`代入-$されていない自前の`任意-代入~関数$を包含する場合 ]、 当の`略式~prop$は,空~文字列に直列化するモノトスル。 ◎ Otherwise, if any of the component longhand properties for a given shorthand are pending-substitution values, or contain arbitrary substitution functions of their own that have not yet been substituted, the shorthand property must serialize to the empty string.
長過ぎな代入に対する安全な取扱い
素朴に実装された`任意-代入~関数$( `var$f など)は、 “`billion laughs^en 攻撃” 【十億の笑い】の一種に利用され得る: ◎ Naively implemented, some arbitrary substitution functions (such as var()) can be used in a variation of the "billion laughs attack":
.foo { --prop1: lol; /* 笑 */ --prop2: var(--prop1) var(--prop1); --prop3: var(--prop2) var(--prop2); --prop4: var(--prop3) var(--prop3); /* etc */ }
この短い例では、 `--prop4^p の算出d値は、 `lol lol lol lol lol lol lol lol^v になり,元の `lol^v の複製を 8 個 包含する。 追加される~levelごとに,識別子の個数は倍になり、 ほんの一手間,わずか 30 ~levelに拡張するだけで, `--prop30^p が包含する識別子は `およそ十億個^emになる。 ◎ In this short example, --prop4’s computed value is lol lol lol lol lol lol lol lol, containing 8 copies of the original lol. Every additional level added to this doubles the number of identifiers; extending it to a mere 30 levels, the work of a few minutes by hand, would make --prop30 contain nearly a billion instances of the identifier.
この類の攻撃を避けるため、 ~UAは,[ `任意-代入~関数$を展開した結果の~token~streamに許容される長さ ]に自身が定義する上限を課すモノトスル。 `任意-代入~関数$がこの上限より長い~token~streamに展開される場合、 代わりに,それを`無効が保証される値$に置換するとする。 ◎ To avoid this sort of attack, UAs must impose a UA-defined limit on the allowed length of the token stream that an arbitrary substitution function expands into. If an arbitrary substitution function would expand into a longer token stream than this limit, it instead is replaced with the guaranteed-invalid value.
この仕様は、 課すベキ上限~sizeは定義しない。 しかしながら, 1000 ~byte以上の~textを包含するような~custom~prop用の妥当な利用事例もあるので、 上限は多少高めに設定することが推奨される。 ◎ This specification does not define what size limit should be imposed. However, since there are valid use-cases for custom properties that contain a kilobyte or more of text, it’s recommended that the limit be set relatively high.
注記: [ ~UAには、 資源の拘束に因り標準に違反することが許容される ]とする一般~原則は、 ここにも一般に該当する。 ~UAは、 自身が~supportできる[ ~custom~propの~~長さ, 識別子の~~長さ ]に別々な上限を課すこともあろう。 この節が,この攻撃を特定的にとり挙げるのは、 それには長い歴史があり,初回の検分では巨大~過ぎな~~片は`無さそうに見える^emものでも行える事実があることによる。 ◎ Note: The general principle that UAs are allowed to violate standards due to resource constraints is still generally true here; a UA might, separately, have limits on how long of a custom property they can support, or how large of an identifier they can support. This section calls out this attack specifically because of its long history, and the fact that it can be done without any of the pieces seeming to be too large on first inspection.
付録 B. 真偽-論理
~CSSの将来の拡張を収容するため、 `boolean-expr[]$t 生成規則は,一般に[ その分岐 `general-enclosed$t 文法 ]を `未知^i として解釈する — この生成規則の真偽-論理は、 ~Kleeneの 3-値~論理【`参考@https://ja.wikipedia.org/wiki/3%E5%80%A4%E8%AB%96%E7%90%86#.E3.82.AF.E3.83.AA.E3.83.BC.E3.83.8D.E3.81.AE3.E5.80.A4.E8.AB.96.E7.90.86$】を利用して解決される。 一部の事例では( `supports$at など)、 `general-enclosed^t は,代わりに `偽^i に評価されるものと定義される — その事例では、 当の論理は,標準な真偽-代数へ委譲される。 ◎ In order to accommodate future extensions of CSS, <boolean-expr[]> productions generally interpret their <general-enclosed> grammar branch as unknown, and their boolean logic is resolved using 3-value Kleene logic. In some cases (such as @supports), <general-enclosed> is instead defined as false; in which case the logic devolves to standard boolean algebra.
3-値の真偽-論理は、 真偽-条件 %~test に対し,次のとおり再帰的に適用される: ◎ 3-value boolean logic is applied recursively to a boolean condition test as follows:
- ~~末端~levelの %~test は、 関連な仕様に定義されるとおり[ `真^i / `偽^i / `未知^i ]に解決される。 ◎ A leaf-level test resolves to true, false, or unknown, as defined by the relevant specification.
-
not %~test
を評価した結果は、 %~test を評価した結果に応じて ⇒# `偽^i ならば `真^i になる/ `真^i ならば `偽^i になる/ `未知^i ならば `未知^i になる ◎ not test evaluates to true if its contained test is false, false if it’s true, and unknown if it’s unknown. - `and^v で接続された複数個の %~test を評価した結果は、 各 %~test を評価した結果に応じて ⇒# `いずれも^em `真^i ならば `真^i になる/ `いずれかは^em `偽^i ならば `偽^i になる/ ~ELSE_(いずれかは `未知^i かつ他すべては `真^i ) `未知^i になる ◎ Multiple tests connected with and evaluate to true if all of those tests are true, false if any of them are false, and unknown otherwise (i.e. if at least one unknown, but no false).
- `or^v で接続された複数個の %~test を評価した結果は、 各 %~test を評価した結果に応じて ⇒# `いずれかは^em `真^i ならば `真^i になる/ `いずれも^em `偽^i ならば `偽^i になる/ ~ELSE_(いずれかは `未知^i かつ他すべては `偽^i ) `未知^i になる ◎ Multiple tests connected with or evaluate to true if any of those tests are true, false if all of them are false, and unknown otherwise (i.e. at least one unknown, but no true).
“~top-levelの” `boolean-expr[]$t に対しては、[ それが`未知^i に評価される ]かつ[ それを包含している文脈が `未知^i 条件を取扱う方法を他に定義しない ]ならば, `偽^i に評価される。 ◎ If a “top-level” <boolean-expr[]> is unknown, and the containing context doesn’t otherwise define how to handle unknown conditions, it evaluates to false.
注記: すなわち `未知^i は、 明示的に取扱われない限り, 3-値の真偽-式から “逃れる” ことはない — `NaN^i が`~top-levelの計算式$から “逃れる” ことはないのと類似に。 ◎ Note: That is, unknown doesn’t “escape” a 3-value boolean expression unless explicitly handled, similar to how NaN doesn’t “escape” a top-level calculation).
謝辞
まずは、 以前の~levelまでに対する`すべての貢献者たち@~CSSVAL#acknowledgments$に感謝する。 ◎ Firstly, the editors would like to thank all of the contributors to the previous level of this module.
[ 案, ~comment, 示唆 ]を寄せられ,この~level 5 を改善した次に挙げる各氏にも感謝する ⇒# `Guillaume Lebas^en, `L. David Baron^en, `Mike Bremford^en, `Sebastian Zartner^en, `とりわけ@~CSSissue/6245$ `Scott Kellum^en ◎ Secondly, we would like to acknowledge Guillaume Lebas, L. David Baron, Mike Bremford, Sebastian Zartner, and especially Scott Kellum for their ideas, comments, and suggestions for Level 5;
変更点
- `2024年 9月 17日 作業草案@~TR/2024/WD-css-values-5-20240917/$ からの変更点 ◎ Changes since the 17 September 2024 Working Draft:
- 【引数どうしを分離する】~semicolonを許容するための “~commaの昇格-法” の挙動を波括弧を利用する “~commaの括り法” 【`~commaを包含する生成規則$】に変更した。 ( `9539$issue ) ◎ Changed the “comma-upgrading” behavior of allowing semicolons to “comma-wrapping” using braces. (Issue 9539)
- `if$f を追加した。 ( `10064$issue, `5009$issue ) ◎ Added if(). (Issue 10064, Issue 5009)
- `inherit$f を追加した。 ( `2864$issue ) ◎ Added inherit(). (Issue 2864)
- `attr$f を設計し直した。 ( `10437$issue, `5092$issue, `5136$issue ) ◎ Redesigned attr(). (Issue 10437, Issue 5092, Issue 5136)
- 各種 `*-mix^f および `clamp$f との一貫性を得るため、 各種 `*-progress^f 関数は,引数どうしを~commaを利用して分離するよう変更した。 ( `10489$issue ) ◎ Changed *progress() functions to use commas for argument separation, for consistency with *mix() and clamp(). (Issue 10489)
- `値~定義の構文$用に新たな `boolean-expr[]$t 複化子を定義した。 ( `10457$issue ) ◎ Defined new <boolean-expr[]> multipler for the value definition syntax. (Issue 10457)
- `CSS-VARIABLES-1$r から`任意-代入~関数$の定義を~importした。 ( `10679$issue ) ◎ Imported definition of arbitrary substitution function from [CSS-VARIABLES-1]. (Issue 10679)
- `CSS-PROPERTIES-VALUES-API-1$r から `syntax$t 生成規則を~importした ( `attr$f において利用するため)。 ◎ Imported the <syntax> production from [CSS-PROPERTIES-VALUES-API-1] (for use in attr()).
- [ `media-progress$f, `container-progress$f ]の構文における誤りを正した。 ◎ Corrected errors in the syntax of media-progress() and container-progress().
- `最初の公な作業草案@~TR/2024/WD-css-values-5-20240913/$ からの変更点 ◎ Changes since the First Public Working Draft include:
- 【他の~moduleから】 `position$t の定義を組入れて,それが`~flow相対$な位置を取扱うよう拡張した。 ( `549$issue ) ◎ Incorporated the definition of <position>, extending it to handle flow-relative positions. (Issue 549)
- `~level 4$ からの追加 ◎ Additions Since Level 4 ◎ Additions since CSS Values and Units Level 4:
- 関数-記法~用に “~commaを昇格する” ための規則を追加した。 【この記法は廃され,`~commaを包含する生成規則$に取って代わられた。】 ◎ Added the “comma-upgrading” rules for functional notations.
- `url$t 関数~用にいくつかの `url-modifier$t を定義した。 ◎ Defined several <url-modifier>s for <url> functions.
- `~flow相対$な位置を取扱うよう `position$t を拡張した。 ( `549$issue ) ◎ Extended <position> to handle flow-relative positions. (Issue 549)
- 各種 `*-progress()@#progress$v 関数を追加した — 2 個の値の合間における補間~進捗を表現するため。 ◎ Added the *-progress() family of functions, to represent interpolation progress between two values.
- 各種 `*-mix()@#mixing$v 関数を追加した — 2 個の値の合間における実際の補間-法を表現するため。 ◎ Added the *-mix() family of functions, to represent actually interpolating between two values.
- `first-valid$f 関数を追加した — 妥当性が既知になるのは構文解析より`後^emになる所で,[ ~CSS構文解析の前方-互換な挙動 (無効なものは初めから無かったかのように~~扱う) を`~custom~prop$その他の文脈と伴に利用する ]ことを許容するため。 ◎ Added first-valid(), to allow CSS’s forward-compatible parsing behavior (drop invalid things, go with what’s left) to be used with custom properties and other contexts where validity isn’t known until after parsing.
- `toggle$f 関数, `attr$f 関数を追加した。 ◎ Added the toggle() and attr() functions.
- `random$f 関数, `random-item$f 関数を追加した。 ◎ Added the random() and random-item() functions.
- `sibling-count$f 関数, `sibling-index$f 関数を追加した。 ◎ Added the sibling-count() and sibling-index() functions.
- `calc-size$f 関数, それに関係する `interpolate-size$p ~propを追加した。 ◎ Added the calc-size() function, and the related interpolate-size property.
~securityの考慮点
この仕様は、 ~CSS `url$t 値に対し,それらによる要請を成す様々な側面が改変されることを許容する。 これは,~CSSにとっては新たなものであるが、 どの能も[ `img$e / `link$e ]において, および~JSを介して,すでに在る。 ◎ This specification allows CSS <url> values to have various aspects of their request modified. Although this is new to CSS, every ability is already present in img or link, as well as via JavaScript.
`attr$f 関数は、 ~HTML属性~値を~CSS値に利用することを許容する — それは、[ これまで~CSSを介して~access可能ではなかった敏感な情報 ]を公開するものになり得る。 `§ ~security@#attr-security$ を見よ。 ◎ The attr() function allows HTML attribute values to be used in CSS values, potentially exposing sensitive information that was previously not accessible via CSS. See § 7.7.2 Security.
~privacyの考慮点
この仕様は、 利用者の[ ~screen~size, 既定の~font~size ]を公開する単位を定義するが、 どちらも~JSから自明に観測-可能なので, 新たな~privacy~riskを成すことはない。 `media-progress$f 記法は,利用者の[ 環境, 選好 ]についての情報を公開するが、 類似に,すでに`媒体~query$を介して観測-可能である。 ◎ This specification defines units that expose the user’s screen size and default font size, but both are trivially observable from JS, so they do not constitute a new privacy risk. Similarly the media-progress() notation exposes information about the user’s environment and preferences that are already observiable via media queries.
`attr$f 関数は、 ~HTML属性~値を~CSS値に利用することを許容する — それは、[ これまで~CSSを介して~access可能ではなかった敏感な情報 ]を公開するものになり得る。 `§ ~security@#attr-security$ を見よ。 ◎ The attr() function allows HTML attribute values to be used in CSS values, potentially exposing sensitive information that was previously not accessible via CSS. See § 7.7.2 Security.