このウェブサイトはご利用の端末での閲覧に対応していません。
This website does not support your device.

“CSS Values and Units Module”

記事Sep.3rd, 2021
CSS3で多くのプロパティが受け付ける汎用的な値や単位に関する仕様を定義した“CSS Values and Units Module”について。

仕様書の概要

概要

CSS Values and Units Module”はCSSで使用される汎用的な値や単位についての仕様を定義している仕様書です。

多くのプロパティの値として使用することができる数量単位や数学関数による数学的表現、CSSの仕様書におけるプロパティの値を定義するための構文についても定義しています。

用語など

値の定義のための構文

CSSの仕様書ではそれぞれのCSSプロパティの値やその他のCSSの部分として有効な構文は以下の方法によって定義されています。値はそのように定義されていれば複数のコンポーネント値を含むことができます。

コンポーネント値のタイプ

コンポーネント値の種類は以下の方法で示されます。

“キーワード値(Keyword Values)
auto”などの引用符で囲まずにそのまま記述して示される値。
“基本データ型(Basic Data Types)
<length>値”などの“<”と“>”で囲んで示される値。数値形式のデータ型は角括弧(“[”と“]”)を使用した記法で値の範囲が限定されることがあります。
  • <'”と“'>”で囲まれた<'font-style'>”値などの同名のプロパティと同じ値の範囲を持つ値。共通キーワードは含まれず、最上位の階層にあるコンマ区切りのリストの数量子も含みません。
  • <”と“>”で囲まれ<line-width>”値などのプロパティ名とは異なる名前を持つ値。このような値の構文は他の場所で定義されます。

コンポーネント値にはスラッシュ(“/”)、コンマ(“,”)、括弧(“(”と“)”)が含まれることがあり、プロパティの値の文法の定義ではそのまま示されます。プラス(“+”)など、キーワードでない他の文字は単一引用符(“'”)で囲んで示されます。

文法の中に示されたコンマ(“,”)は任意である項目を隔てるために使用されている場合には暗黙的に省略することができます。プロパティやその他の値、関数の引数の文法の定義の中で最上位の階層にあるリストのコンマは以下の場合は省略しなければなりません。

  • コンマの前にあるアイテムがすべて省略された場合
  • コンマの後にあるアイテムがすべて省略された場合
  • コンマの間にあるアイテムが省略されてコンマが連続するかコンマ間にあるのがホワイトスペースかコメントだけである場合

また、プロパティの値の文法の定義では明示されませんが、すべてのCSSのプロパティはその値として共通キーワードを使用することができます。

コンポーネント値の結合子

コンポーネント値は以下の結合子によって組み合わせられ、プロパティの値の文法が示されます。

並置
並置して示されたコンポーネント値はすべて順番通りに記述されなければなりません。
2重のアンパサンド(“&&”)
結合子で結合されたコンポーネント値はすべて必要ですが、順序は問いません。
2重のバーティカルバー(“||”)
結合子で結合されたコンポーネント値はそれぞれ任意で、順序は問いません。
バーティカルバー(“|”)
結合子で結合されたコンポーネント値はいずれか1個だけ必要です。

角括弧(“[”、“]”)はコンポーネント値をグループ化し、結合子による関係性を明確にします。

複数の結合子が併用される場合は並置、“&&”、“||”、“|”の順により強く結びつきます。

コンポーネント値の数量子

すべてのコンポーネント値のタイプ、キーワード、もしくは角括弧(“[”、“]”)でグループ化されたコンポーネント値はその直後に記される数量子によって繰り返すことできる回数が示されます。

アスタリスク(“*”)
数量子の直前にあるタイプ、キーワード、もしくはグループは0回以上繰り返されます。
プラス(“+”)
数量子の直前にあるタイプ、キーワード、もしくはグループは1回以上繰り返されます。
疑問符(“?”)
数量子の直前にあるタイプ、キーワード、0回もしくは1回だけ必要です。
波括弧(“{”と“}”)で囲まれた数字
数量子の直前にあるタイプ、キーワードは括弧の中にある数字と同じ回数だけ繰り返されます。
波括弧(“{”と“}”)で囲まれたコンマ(“,”)で区切られた2つの数字
数量子の直前にあるタイプ、キーワードは最少で一つ目の数字、最大で二つ目の数字と同じ回数だけ繰り返されます。
ハッシュ(“#”)
数量子の直前にあるタイプ、キーワードはコンマ(“,”)で区切って1回以上繰り返されます。さらに後に波括弧(“{”と“}”)で囲まれた数字で繰り返される回数が指定される場合があります。
感嘆符(“!”)
数量子の直前にあるグループは少なくとも1個の値にならなければなりません。グループの中にあるアイテムの文法ですべてのコンポーネント値を省略することが認められていても少なくとも1個も必要です。

ユーザー・エージェントは“*”、“+”もしくは“#”で示されたコンポーネント値の繰り返しを最低でも20個まで対応することが求められています。ユーザー・エージェントが対応している数以上のコンポーネント値が値として含まれる場合、その宣言は無効なものとして扱われ、無視されます。

コンポーネント値とホワイトスペース

別途定義されていない限り、結合子と数量子を使用して示されているコンポーネント値をプロパティの値として記述する場合にはその前後、もしくは間にホワイトスペースを含むことができます。

また、多くの場面ではホワイトスペースはコンポーネント値を区切るために必須となります。

値の混合

遷移効果やアニメーションなどのいくつかの処理は2個のCSSのプロパティを混合します。2個の値の混合は以下の3通りの方法で行われ、2個の計算値(“Va”と“VB”)から1個の値(“Vresult”)を算出します。

補間(“Interpolation”)
Vresult”は“p”をもとに算出される“Va”と“VB”の間の値です。
ここで、“p”はイージング関数から出力される“Va”から“VB”への進捗度です。“p=0”の時の出力結果は“Va”、“p=1”の時の出力結果は“VB”と同じです。
加算(“Addition”)
Vresult”は“Va”と“VB”を加算して算出されます。
行列の加算など、交換可能でない計算では“Va”が1個目、“VB”が2個目の項です。
集積(“Accumulation”)
VB”は“Va”からの差分となるように“Vresult”を算出します。
長さが異なる変形のリストの集積など、交換可能でない計算では“Va”が1個目、“VB”が2個目の項です。

値の定義で加算の方法が定義されていない場合、もしくは“加算不可(Not Additive)”である場合は加算による出力結果(“Vresult”)は“Va”と等しくなります。

値の定義で集積の方法が定義されていない場合、集積の方法は加算と同じようになります。

補間の結果出力結果はプロパティの値として有効な範囲から外れたものとなる場合があります。補間や加算、集積の結果がその結果が使用される場所で有効な範囲の外であったとしても宣言は無効にはならず、範囲内に収まるように丸められます。

テキスト形式のデータ型

テキスト形式のデータ型(Textual Data Types)”にはあらゆるキーワード値や識別子、文字列(<string>”値)やURL(<url>”値)が含まれます。

<ident>”値として示される“CSS識別子(CSS Identifiers)”は“CSS Syntax Module”で定義されている<ident-token>の構文に準拠します。CSSのプロパティが受け付ける識別子は定義済キーワードと作者定義のキーワード(<custom-ident>”値)の2種類です。識別子は引用符で囲んではいけません。

あらかじめ意味を持って定義されているキーワード値は“定義済キーワード(Pre-defined Keywords)”と呼ばれます。定義済キーワードは値の定義のための構文ではそのまま文字通りに示され、英字の大文字と小文字は区別されません。

定義済キーワード以外のテキスト形式のデータ型では値の正規化処理は一切行われず、パースによって出力されるのは入力されたものと同じユニコードの値です。

テキスト形式のデータ型の補間の方法は離散で、加算不可です。

数値形式のデータ型

数値形式のデータ型(Numeric Data Types)”は数量や順番、位置などを表すために使用され、数値を表す<integer>”値<number>”値<percentage>”値や何らかの寸法を表す<dimension>”値があります。

<flex>”値 いずれにも一致しない場合は無効になります。

プロパティは数量形式の値を決められた範囲に制限することができ、別途定義されていない限り、範囲外の値を含む宣言は無効となります。

値の定義のための構文の中では“<”と“>”の中にあるデータ型の名前の直後に、角括弧(“[”と“]”)で囲まれたコンマ(“,”)区切りの2個の数字によって有効な範囲が示されます。例えば、“<integer[0,10]>”は“0”以上、“10”以下の<integer>”値を示します。最大値、もしくは最小値が無制限の場合は“”もしくは“-∞”で表されます。

CSSでは理論上はすべてのデータ型で取り得る値の範囲と精度は無制限ですが、現実的にはユーザー・エージェントが対応できる値の範囲と精度は様々な理由で制限され、ユーザー・エージェントは合理的と考えられる範囲で対応するように求められています。

指定された値がユーザー・エージェントが対応している範囲もしくは精度から外れる場合は対応可能な最も近い値が代わりに使用されます。その値が<angle>”値の場合はユーザー・エージェントが対応しているもっとも近い“360deg”の倍数に丸められます。

<dimension>”値

<dimension>”値は何らかの寸法を表す数値形式の値で、<number>”値とその直後に続く単位からなり、“CSS Values and Units Module”では距離を表す<length>”値、角度を表す<angle>”値、時間を表す<time>”値、周波数を表す<frequency>”値と解像度を表す<resolution>”値が定義されています。

<dimension>”値は“CSS Syntax Module”で定義されている<dimension-token>の構文に準拠します。単位を表す識別子は大文字と小文字は区別されません。

pxinなど、相互に変換可能な単位は“互換単位(Compatible Units)”と呼ばれます。それぞれの互換単位のグループではその中の一つの単位が1個の“規準単位(Canonical Unit)”として定められており、シリアル化の際には規準単位でない単位は規準単位に置き換えられます。

<dimension>”値の混合

互換単位同士の補間による出力結果(“Vresult”)は“(1 - p) * Va + p * VB”で表されます。

互換単位同士の加算による出力結果(“Vresult”)は“Va + VB”で表されます。

数学的表現の処理

値のタイプの判定

数学的表現は<length>”値<number>”値などのデータ型である“解決済タイプ(Resolved Type)”を持ち、同じデータ型が許容される場所であればいつでも使用することができます。

さらに<number>”値を表す数学関数は<integer>”値のみが認められる場所でも使用することができます。

数量を表す値や数式は“CSS Typed OM Level 1”の仕様で定義されているように、“«[ ”と“”で囲まれたベース・タイプと値の組であるタイプ、およびパーセント・ヒントに関連付けられ、それらによってどのデータ型と一致するのかが判断されます。

+”もしくは“-”による部分式
左右のタイプを加算した結果がそのタイプです。加算が失敗した場合、タイプの判定は失敗です。
*”による部分式
左右のタイプを乗算した結果がそのタイプです。
/”による部分式
左のタイプと右のタイプの逆数を乗算した結果がそのタイプです。

計算の他の部分は以下のようにタイプを判断します。

<number>”値<integer>”値
タイプは“«[ ]»
<number>”値
タイプは“«[ "length" → 1 ]»
<angle>”値
タイプは“«[ "angle" → 1 ]»
<time>”値
タイプは“«[ "time" → 1 ]»
<frequency>”値
タイプは“«[ "frequency" → 1 ]»
<resolution>”値
タイプは“«[ "resolution" → 1 ]»
<flex>”値
タイプは“«[ "flex" → 1 ]»
<calc-constant>”値
タイプは“«[ ]»
<percentage>”値
<percentage>”値が他のデータ型として解決される場所に置かれている計算ではそのデータ型のタイプ、そうでなければタイプは“«[ ]»”です。
上記以外
タイプの判定は失敗です。

すべての場合で、パーセント・ヒントは“null”です。

また、数学関数自体もタイプがあり、以下のように判断されます。

calc()”関数abs()”関数
引数となる計算のタイプをそのタイプとします。
min()”関数max()”関数clamp()”関数
コンマで区切られた引数のタイプを加算した結果をそのタイプとします。
sign()”関数
タイプは“«[ "number" → 1 ]»”です。
sin()”関数cos()”関数tan()”関数
タイプは“«[ "number" → 1 ]»”です。
asin()”関数acos()”関数atan()”関数atan2()”関数
タイプは“«[ "angle" → 1 ]»”です。
pow()”関数sqrt()”関数log()”関数exp()”関数
タイプは“«[ "angle" → 1 ]»”です。
hypot()”関数round()”関数mod()”関数rem()”関数
コンマで区切られた引数のタイプを加算した結果をそのタイプとします。

タイプの判定が失敗した場合はその数学関数は無効です。

最後に、タイプは以下の場合にそれぞれのデータ型に一致します。

<length>”値
値が“0”でないエントリが“«[ "length" → 1 ]»”のみであり、パーセント・ヒントが“null”の場合
<angle>”値
値が“0”でないエントリが“«[ "angle" → 1 ]»”のみであり、パーセント・ヒントが“null”の場合
<time>”値
値が“0”でないエントリが“«[ "time" → 1 ]»”のみであり、パーセント・ヒントが“null”の場合
<frequency>”値
値が“0”でないエントリが“«[ "frequency" → 1 ]»”のみであり、パーセント・ヒントが“null”の場合
<resolution>”値
値が“0”でないエントリが“«[ "resolution" → 1 ]»”のみであり、パーセント・ヒントが“null”の場合
<flex>”値
値が“0”でないエントリが“«[ "flex" → 1 ]»”のみであり、パーセント・ヒントが“null”の場合
<percentage>”値
値が“0”でないエントリが“«[ "percent" → 1 ]»”のみである場合
<length-percentage>”値
値が“0”でないエントリが“«[ "length" → 1 ]»”もしくは“«[ "percent" → 1 ]»”のみである場合
<frequency-percentage>”値
値が“0”でないエントリが“«[ "frequency" → 1 ]»”もしくは“«[ "percent" → 1 ]»”のみである場合
<angle-percentage>”値
値が“0”でないエントリが“«[ "angle" → 1 ]»”もしくは“«[ "percent" → 1 ]»”のみである場合
<time-percentage>”値
値が“0”でないエントリが“«[ "time" → 1 ]»”もしくは“«[ "percent" → 1 ]»”のみである場合
<number>”値
値が“0”でないエントリがないく、パーセント・ヒントが“null”の場合
<number-percentage>”値
値が“0”でないエントリがないか、“0”でないエントリが“«[ "percent" → 1 ]»”のみである場合

数学関数は必ず<number>”値<length>”値<angle>”値<time>”値<frequency>”値<resolution>”値<flex>”値<percentage>”値のうちの1個に解決され、いずれにも一致しない場合は無効になります。

“CSS Values and Units Module Level 3”までは…

パーセント値が指定できる場所でそのパーセント値が<number>”値以外の何らかのデータ型の相対値を表す場合、パーセント値はそのデータ型として扱われ、<percentage>”値のみが認められている場所に置かれた場合にのみ<percentage>”値として扱われます。

<percentage>”値の使用が認められていない場所でcalc()”関数の中でパーセント値を使用した場合、calc()”関数は無効になります。

計算の演算子は部分式を生成し、それぞれの引数によってタイプが判断されます。演算子は受け付けるタイプに制約がある場合があり、その制約を満たすかを判定したうえで、以下のようにタイプが判断されます。

+”もしくは“-”による部分式
演算子の両側が同じタイプであればそのタイプ、片側が<number>”値でもう一方の側が<integer>”値であれば<number>”値になります。
*”による部分式
片側が<number>”値であれば、もう一方の側のタイプ、両側が<integer>”値であれば<integer>”値になります。
/”による部分式
片側が<number>”値であれば、もう一方の側のタイプ、両側が<integer>”値であれば<number>”値になります。

演算子が以上の条件を満たさない場合はそれを含む数学的表現は無効です。また、ゼロ除算も無効です。

“0”や“∞”を含む計算

“0”を含む計算の扱いは以下のように定義されています。

正の値を“0”で除算した場合
結果は“+∞”です。
負の値を“0”で除算した場合
結果は“-∞”です。
“0”を“0”で除算した場合
結果は“NaN”です。

ゼロ除算の扱いは“IEEE 754”の標準に準拠します。

計算の中で単位のない“0”は常に<number>”値として扱われます。

“∞”を含む計算の扱いは以下のように定義されています。

何らかの値に“+∞”もしくは“-∞”を加算もしくは減算した場合
結果は“+∞”もしくは“-∞”です。ただし、追加の規則があれば“NaN”。
何らかの値を“+∞”もしくは“-∞”で乗算した場合
結果は“+∞”もしくは“-∞”です。ただし、追加の規則があれば“NaN”。
何らかの値を“+∞”もしくは“-∞”で除算した場合
結果は“0”です。ただし、追加の規則があれば“NaN”。
“0”を“+∞”もしくは“-∞”で乗算した場合
結果は“NaN”です。
“+∞”もしくは“-∞”に“+∞”もしくは“-∞”を乗算した場合
結果は“NaN”です。
“+∞”に“-∞”を加算、“+∞”もしくは“-∞”から同じ符号の“∞”を減算した場合
結果は“NaN”です。

“NaN”を1個でも含む数式の結果は“NaN”となります。ただし、他の数学関数の中に入れ子にされていない数学関数の計算結果である“NaN”は“+∞”であるように扱われます。

負のゼロ

この仕様では負のゼロ(“0”)が取り入れられています。“0”は負の値を1個だけ含む乗算もしくは除算などによって算出されます。

-1 * 0 = 0
“0-”に“0+”加算、もしくは“0-”から“0”を減算した場合
結果は“0-”です。これ以外の結果が“0”となる計算の結果は正のゼロです。
“0-”を正の値(“0+”も含む)で乗算もしくは除算した場合
結果は“0-”もしくは“-∞”です。
“0-”を負の値で乗算もしくは除算した場合
結果は“0+”もしくは“+∞”です。

“0+”と“0-”を比較した時、“0-”は“0+”よりも小さいものとして扱われます。

ただし、他の数学関数の中に入れ子にされていない数学関数の計算結果が“0-”である場合、単に“0”として扱われます。

値の範囲に制約がある場合

値が使用されるプロパティが許容する値の範囲の制約がある場合でも、計算結果がその範囲外になる数学関数は直ちにその宣言を無効にすることはありません。許容される範囲外の計算結果は値として認められる範囲内に収まるように丸められます。

例えば、width”プロパティでは負の値は無効ですが、計算結果が負の値となる数式は値が“0”として扱われるので無効ではありません。

以下の宣言はすべて同じ意味になります
width: calc(50px - 100px);
width: calc(-50px);
width: 0;

数式の混合

数式同士、もしくは数式と他の数値形式の値との補間による出力結果(“Vresult”)は“calc((1 - p) * Va + p * VB)”で表されます。

数式同士、もしくは数式と他の数値形式の値との加算による出力結果(“Vresult”)は“calc(Va + VB)”で表されます。

その他

ユーザー・エージェントは数字や定数を最低でも20個含んだ数式に対応するように仕様書に求められています。ユーザー・エージェントが対応しているものを超える場合には数式は無効となります。

テーブル・セルやテーブル要素における横幅と高さの計算の複雑さから、<percentage>”値を含む数式をテーブルの列、列グループ、行、行グループ、セルの横幅と高さの指定に用いると“auto”として扱われる場合があります。

定義されているCSSルール

データ型 説明
<custom-ident> 制作者定義の識別子
<dashed-ident> 明示的に制作者定義の識別子
<string> 文字列
<url> URL
<integer> 整数
<number> 実数
<percentage> パーセンテージ
<ratio> 比率
<length> 長さ
<angle> 角度
<time> 時間
<frequency> 周波数
<resolution> 画素密度

関数

関数 説明
url()
src()
toggle()
attr()
calc() 加減乗除の計算
min() 最小値を選択
max() 最大値を選択
clamp() 値の範囲を制限
round() 引数を指定した丸め幅で丸める
mod() 引数の剰余
rem() 引数の剰余
sin() 引数の正弦
cos() 引数の余弦
tan() 引数の正接
asin() 引数の逆正弦
acos() 引数の逆余弦
atan() 引数の逆正接
atan2() 2個の引数の逆正接
pow() 引数のべき乗
sqrt() 引数の平方根
hypot() 引数の二乗和の平方根
log() 引数の対数
exp() eのべき乗
abs() 引数の絶対値
sign() 引数の正負を調べる
一番上へ
トップにもどる
シェアする
シェアする
Facebookでシェアする
ツイート
Google+でシェア
Pocket
はてなブックマーク