1. はじめに
このセクションは規範的ではありません。
テスト
このセクションは規範的ではないため、テストは不要です。
このモジュールは、要素のテキスト内容の前景色と不透明度を指定するためのCSSプロパティを説明します。 また、CSSの<color>値型についても詳細に説明します。
このモジュールは、CSS1、CSS2、 およびCSS Color 3に既に存在する色関連のプロパティと値を定義するだけでなく、 新しいプロパティと値も定義します。
特に、sRGB以外の色空間での色指定を可能にします。 以前は、ディスプレイデバイスが対応していても、sRGBガマット外のより飽和した色はCSSで使用できませんでした。
ドラフト実装レポートが利用可能です。
1.1. 値の定義
この仕様は、CSSプロパティ定義の規約を[CSS2]から採用し、値定義構文を[CSS-VALUES-3]から使用します。 この仕様で定義されていない値型は、CSS Values & Units [CSS-VALUES-3]で定義されています。 他のCSSモジュールとの組み合わせにより、これらの値型の定義が拡張される場合があります。
プロパティ固有の値に加えて、 この仕様で定義されているすべてのプロパティは、 プロパティ値としてCSS全体のキーワードも受け入れます。 可読性を考慮し、それらは明示的に繰り返されていません。
2. 色彩の用語
テスト
このセクションは後で使用される定義を提供するものであり、テストは不要です。
色は、人間の視覚による光または光で照らされた物体の知覚を数値的または文字列的に表現したものです。 人間の色知覚の客観的な研究は、色彩計測と呼ばれます。
物理的な物体の色は、 各可視波長でどれだけの光を反射するか、 およびそれを照らす光の実際の色 (再び、各波長でどれだけの光があるか)に依存します。 これは分光光度計で測定されます。
光を放つもの(コンピュータ画面上の色を含む)の色は、 各可視波長でどれだけの光を放つかに依存します。 これは分光放射計で測定されます。
もし2つの物体が異なるスペクトルを持っていても、 それでも同じ物理的な感覚を生じる場合、 それらは同じ色を持つと言います。 スペクトルをCIE XYZ(三つの数値)に変換することで、 2つの色が同じかどうかを計算できます。
色空間は、 基礎となる色彩計測モデルに基づいて色を組織化したもので、 その色空間内の任意の色に対して明確で客観的に測定可能な意味を持たせるものです。 これにより、同じ色が複数の色空間で表現されたり、 一つの色空間から別の色空間へ変換されたりしても、 見た目が同じであることが可能になります。
葉を分光光度計で測定したところ、 色が lch(51.2345% 21.2 130) または lab(51.2345% -13.6271 16.2401) であることが判明しました。
同じ色はさまざまな色空間で表現できます:
color ( sRGB0.41587 0.503670 0.36664 ); color ( display-p30.43313 0.50108 0.37950 ); color ( a98-rgb0.44091 0.49971 0.37408 ); color ( prophoto-rgb0.36589 0.41717 0.31333 ); color ( rec20200.42210 0.47580 0.35605 );
加法的色空間とは、 座標系が光の強度において線形であることを意味します。 CIE XYZ色空間は加法的色空間です。 XYZのY成分は輝度で、単位面積あたりの光の強度、 つまり「どれだけ明るいか」です。輝度はカンデラ毎平方メートル (cd/m²)で測定され、ニットとも呼ばれます。
加法的色空間では、正確に予測できる色混合の計算を行うことができます。 ほとんどのRGB空間は加法的ではありません。 これは、成分がガンマエンコードされているためです。 このガンマエンコードを解消することで、線形光値が生成されます。
異なる色のスポットライトが2つ、ステージ上で照らしている場合、 一方が測定値 color(xyz 0.15 0.24 0.17) を持ち、もう一方が color(xyz 0.11 0.06 0.06) の場合、 その色の光束が重なるようにすると、 混合の色はXYZ成分値の合計となり、 color(xyz 0.26 0.30 0.23) になります。
色度とは、 明度成分を取り除いた色の測定値です。 上記の同一の光の例では、 1つの光におけるu',v'色度は (0.2537, 0.5268) であり、 両方の光で色度は同じです (色は同じで、ただ明るさが増加しているだけです)。
色度は加法的であるため、 混合の色度を正確に予測することができます (ただし、結果として得られる明度は除きます)。 二次元であるため、色度は色度図で簡単に表現でき、 色混合の色度を予測することができます。 任意の2つの色を混合すると、結果の色は 図上でそれらを結ぶ直線上に位置します。 3つの色は平面を形成し、結果の色は 図上でそれらが形成する三角形内に位置します。
したがって、線形化されると、RGB色空間は加法的であり、 そのガマットは 赤、緑、青の原色の色度、 および白色点 (3つの原色がすべて最大強度で形成する色)の色度によって定義されます。
ほとんどの色空間は、いくつかの昼光を模した 白色点のいずれかを使用します。 これらは、対応する黒体放射体の相関色温度(CCT)[Understanding_CCT] によって命名されています。 例えば、D65は相関色温度 6500ケルビンに対応する昼光白色点です (実際には6504、 プランク定数の値が色が最初に定義された時から変更されたためです)。
累積的な往復誤差を避けるためには、 計算のすべての箇所で 同一の色度値が一貫して使用されることが重要です。 したがって、最大限の互換性のために、 この仕様では以下の2つの標準的な昼光を模した 白色点が定義されています:
名称 | x | y | CCT |
---|---|---|---|
D50 | 0.345700 | 0.358500 | 5003K |
D65 | 0.312700 | 0.329000 | 6504K |
測定された物理的特性 (使用する原色の色度 や、特定の入力セットに応じて生成される色など)が 色空間または 色を生成するデバイスに既知の場合、 それは特性化されたと言います。
さらに、デバイスが白色点、グレーの中立性、トーン応答の予測可能性と一貫性などの キャリブレーション目標を満たすように調整された場合、 それはキャリブレーションされたと言います。
実際の物理デバイスはまだ人間の目が見ることのできるすべての色を生成することはできません。 特定のデバイスが生成できる色の範囲はガマット (ガンマと混同しないでください)と呼ばれます。 ガマットが限られているデバイスでは、 虹に見られるような非常に飽和した色を生成できません。
異なる色空間のガマットは、 表現できる色の体積(立方Lab単位)を比較することで評価できます。 以下の表は、CSSで利用可能な事前定義された色空間を調査しています。
色空間 | 体積(百万Lab単位) |
---|---|
sRGB | 0.820 |
display-p3 | 1.233 |
a98-rgb | 1.310 |
prophoto-rgb | 2.896 |
rec2020 | 2.042 |
CSSにおける色は、以下で説明する各構文形式に従い、 無効な色 または有効な色のいずれかです。
無効な色でない色はすべて、 有効な色です。
色は有効な色である場合でも、 出力デバイス(画面、プロジェクター、またはプリンター)で生成可能な範囲外にあることがあります。
その場合、それはガマット外と呼ばれます。
各有効な色は、特定の出力デバイス(画面やプリンター)に対して ガマット内であるか、 ガマット外であるかのいずれかです。
color ( prophoto-rgb0.88 0.45 0.10 )
display-p3で表現すると、 1つ以上の座標が1.0を超えるか0.0未満であるためです:
color ( display-p31.0844 0.43 0.1 )
この色は有効であり、 例えばグラデーションの停止点として使用できますが、 表示のためにはCSSガマットマッピングが必要であり、 似た外観ながら彩度の低い色(飽和度が低い色)に変換されます。
3. CSSにおける色の適用
3.1. アクセシビリティと色を用いた情報伝達
テスト
このセクションは作成ガイダンスを提供するものであり、テストは不要です。
色は文書に重要な情報を付加し、読みやすくすることができますが、 それ自体のみで重要な情報を伝える手段であってはなりません。 作成者は、文書で色を使用する際にW3Cのウェブコンテンツアクセシビリティガイドライン [WCAG21] を考慮する必要があります。
1.4.1 色の使用: 色は情報を伝達する唯一の視覚的手段として、 行動を示す、応答を促す、または視覚的要素を区別するために使用されません
3.2. 前景色: color プロパティ
名称: | color |
---|---|
値: | <color> |
初期値: | CanvasText |
適用対象: | すべての要素とテキスト |
継承プロパティ: | はい |
パーセンテージ: | 該当なし |
計算値: | 計算された色、色の値解決を参照 |
正規順序: | 文法による |
アニメーションタイプ: | 計算値タイプに基づく |
テスト
このプロパティは要素の主要な前景色を指定します。 これはそのテキスト内容の塗りつぶし色として使用されるだけでなく、 currentcolorが解決される際の使用値も指定します。 これにより、この前景色への間接的な参照が可能となり、 border-colorやtext-emphasis-colorのような 他のさまざまな色プロパティの初期値にも影響を与えます。
- <color>
- 指定された<color>に主要な前景色を設定します。
em{ color : lime; } /* 色キーワード */ em{ color : rgb ( 0 255 0 ); } /* RGB 範囲 0-255 */ em{ color : rgb ( 0 % 100 % 0 % ); } /* RGB 範囲 0%-100% */ em{ color : color ( sRGB0 1 0 ); } /* sRGB 範囲 0.0-1.0 */
テキストに適用された場合、このプロパティ(アルファ成分を含む)は、
「色付きグリフ」(一部のフォントの絵文字など)には影響を与えません。
それらは組み込みパレットによって着色されています。
しかし、一部のカラーフォントは文脈的な「前景色」を参照することが可能です。
例えば、OpenTypeのCOLR
テーブル内のパレットエントリ0xFFFFや、
SVG-in-OpenTypeのcontext-fill値によって設定される場合です。
そのような場合、このプロパティによって前景色が設定され、
currentcolorの値を設定する場合と同じです。
3.3. 透明性: opacity プロパティ
Opacityは後処理操作として考えることができます。 概念的には、要素(その子孫を含む)がRGBAのオフスクリーン画像にレンダリングされた後、 opacityの設定によって、そのオフスクリーンレンダリングが現在の合成レンダリングへどのようにブレンドされるかが指定されます。 詳細は単純アルファ合成を参照してください。
名前: | opacity |
---|---|
値: | <opacity-value> |
初期値: | 1 |
適用対象: | すべての要素 |
継承: | いいえ |
パーセンテージ: | [0,1] の範囲にマップされる |
算出値: | 指定された数値で、[0,1]の範囲にクランプされる |
標準順序: | 文法順 |
アニメーション型: | 算出値型による |
テスト
- clip-opacity-out-of-flow.html (ライブテスト) (ソース)
- t32-opacity-basic-0.0-a.xht (ライブテスト) (ソース)
- t32-opacity-basic-0.6-a.xht (ライブテスト) (ソース)
- t32-opacity-basic-1.0-a.xht (ライブテスト) (ソース)
- t32-opacity-clamping-0.0-b.xht (ライブテスト) (ソース)
- t32-opacity-clamping-1.0-b.xht (ライブテスト) (ソース)
- t32-opacity-offscreen-b.xht (ライブテスト) (ソース)
- t32-opacity-offscreen-multiple-boxes-1-c.xht (ライブテスト) (ソース)
- t32-opacity-offscreen-multiple-boxes-2-c.xht (ライブテスト) (ソース)
- t32-opacity-offscreen-with-alpha-c.xht (ライブテスト) (ソース)
- t32-opacity-zorder-c.xht (ライブテスト) (ソース)
- opacity-computed.html (ライブテスト) (ソース)
- opacity-valid.html (ライブテスト) (ソース)
- opacity-invalid.html (ライブテスト) (ソース)
- composited-filters-under-opacity.html (ライブテスト) (ソース)
- filters-under-will-change-opacity.html (ライブテスト) (ソース)
- color-composition.html (ライブテスト) (ソース)
- opacity-interpolation.html (ライブテスト) (ソース)
- canvas-change-opacity.html (ライブテスト) (ソース)
- opacity-animation-ending-correctly-001.html (ライブテスト) (ソース)
- opacity-animation-ending-correctly-002.html (ライブテスト) (ソース)
- <opacity-value>
-
要素に適用される不透明度です。
得られる不透明度は、特定の色ではなく、要素全体に適用されます。
[0,1]の範囲外のopacity値は無効ではなく、指定値として保持されますが、 算出値では[0,1]の範囲にクランプされます。
CSSにおけるopacityは、<opacity-value> 構文で表現されます。例えばopacityプロパティで使用されます。
<opacity-value> = <number> | <percentage>
<number>として表現された場合、 有用な値の範囲は0(完全な透明)から1(完全な不透明)です。 また、<percentage>として記述することもできます。 これは、算出値として同等の<number>(0%は0、100%は1)に変換されます。
opacityプロパティは、指定された不透明度を要素全体に適用します。 内容も含めて、各子孫に個別に適用するのではありません。 つまり、例えば、不透明な子要素が要素の背景の一部を隠していても、opacityが1未満でもそのまま隠し続けますが、 要素と子要素全体が下層のページを透かして表示します。
また、要素内のすべての文字に対応するグリフも全体として扱われます。 重なり合った部分があっても、不透明度は増加しません。
各グリフごとに個別の不透明度が必要な場合は、 opacityプロパティを設定するのではなく、 アルファ値を含む色値を使用することで実現できます。
ボックスのopacityが1未満の場合、 その子要素のためのスタッキングコンテキストを形成します。 (これにより、その内容がZ軸で外側のコンテンツと混在するのを防ぎます。)
さらに、ボックスにz-index プロパティが適用されている場合、 auto値はその要素に対して0として扱われます。 それ以外は、親のスタッキングコンテキスト内で積層レベル0の配置要素と同じレイヤーに描画されます (z-index:0の配置済み要素として扱われるかのように)。
スタッキングコンテキストについての詳細は、section 9.9およびAppendix Eを参照してください。[CSS2]
これらのz-orderに関する規則はSVG要素には適用されません。 SVGは独自のレンダリングモデル([SVG11]、第3章)を持っています。
3.4. タグ付き画像の色空間
タグ付き画像とは、画像フォーマットによって明示的にカラープロファイルが割り当てられている画像のことです。 これは通常、International Color Consortium(ICC)プロファイル [ICC] を含めることで行われます。
例えば、JPEG [JPEG]、PNG [PNG]、TIFF [TIFF] のいずれもICCプロファイルを埋め込む手段を定めています。
画像フォーマットは、簡潔さのために他の同等の方法を使う場合もあります。
例えばPNGでは、sRGBチャンク により、sRGBカラースペースであることを明示的にタグ付けする方法が規定されていますが、 sRGB ICCプロファイル自体は含まれていません。
同様に、PNGはよりコンパクトな方法として (cICPチャンク)を規定しており、 ICCプロファイルを含めずにDisplay P3やBT.2100 HLGなど さまざまなSDRまたはHDR色空間のいずれかであることを明示的にタグ付けできます。
タグ付きRGB画像や、YCbCrのようなRGBの変換を利用したタグ付き画像は、 カラープロファイルや他の識別情報が有効であれば、指定された色空間として扱わなければなりません。
テスト
例えば、Display P3モニターを搭載したシステム上のブラウザーが、 ITU Rec BT.2020 [Rec.2020] 色空間としてタグ付けされたJPEG画像を表示する場合、 色をITU Rec BT.2020からDisplay P3に変換して正しく表示しなければなりません。 ITU Rec BT.2020の値をDisplay P3の値として扱ってはならず、そうすると色が正しく表示されません。
カラープロファイルや他の識別情報が無効な場合、画像はタグなし画像として記載された方法で扱われます。
3.5. タグなし色の色空間
互換性のため、HTMLで指定された色や、 タグなし画像は 特に指定がない限りsRGB色空間([SRGB])として扱わなければなりません。
タグなし画像とは、 画像フォーマットによって明示的にカラープロファイルが割り当てられていない画像のことです。
この規則はタグなし動画には適用されません。タグなし動画はITUで定義された色空間にあると推定すべきです。
-
720p未満では、Recommendation ITU-R BT.601 [ITU-R-BT.601]
-
720pでは、SMPTE ST 296(709と同じ色度)[SMPTE296]
-
1080pでは、Recommendation ITU-R BT.709 [ITU-R-BT.709]
-
4k(UHDTV)以上では、SDR動画の場合はITU-R BT.2020 [Rec.2020]
4. 色の表現: <color> 型
テスト
この節では型について説明していますが、主にその型が使われている場所でテストされています。
CSSの色は、色空間の軸を表す色成分のリストとして表現されます。 これらは「チャンネル」と呼ばれることもあり、 色空間内の各軸を表します。 各成分には最小値と最大値があり、 その間の任意の値をとることができます。 さらに、すべての色には どれだけ透明かを示すアルファ成分が付属しており、 これによって色を通してどれだけ背景が見えるかが決まります。
CSSでは色値を指定するための構文が複数あります:
-
RGBおよびアルファ成分を16進数表記で表すsRGBの16進カラー表記
-
様々な色空間や座標系で色を表現できるカラー関数
-
定数として定義された色名キーワード
-
変数として利用する<system-color>キーワードや、currentColorキーワード
カラー関数は、 CSSの関数型表記を使って、各成分座標を指定することで 様々な色空間の色を表現します。 そのうちのいくつかは円筒極座標の色モデルを使い、 色相角<hue>、 明度(黒〜白)を示す中心軸、 彩度またはクロマ(色がニュートラルグレーからどれだけ離れているか)を示す半径で色を指定します。 その他は直交座標の色モデルを使い、 3本の直交成分軸で色を指定します。
カラー関数で Level 4で利用できるものは次の通りです:
-
rgb()とrgba()エイリアス。 (16進カラー表記と同様に)、 赤・緑・青・アルファの成分で直接sRGB色を指定します。
-
lab()。 CIE LAB直交座標モデルを使い、 CIEの明度とa軸・b軸の色相座標(赤/緑と黄/青)でCIELAB色を指定します。
-
lch()。 CIE LCH円筒座標モデルを使い、 CIE明度・クロマ・色相でCIELAB色を指定します。
-
oklab()。 Oklab直交座標モデルを使い、 Oklab明度とa軸・b軸の色相座標(赤/緑と黄/青)でOklab色を指定します。
-
oklch()。 OKLCh円筒座標モデルを使い、 Oklab明度・クロマ・色相でOklab色を指定します。
-
color()。 sRGB、リニアsRGB、Display P3、A98 RGB、ProPhoto RGB、ITU-R BT.2020-2、 CIE XYZなど、様々な色空間で色を指定できます。
他の仕様書で参照しやすいよう、不透明な黒はrgb(0 0 0 / 100%)として定義されています。また、透明な黒は同じ色ですが、 完全に透明、すなわちrgb(0 0 0 / 0%)です。
テスト
4.1. <color>構文
テスト
この節は後で使用される定義を提供するものであり、テストは不要です。
CSSの色は<color>型で表現されます:
<color> = <color-base> | currentColor | <system-color> <color-base> = <hex-color> | <color-function> | <named-color> | transparent <color-function> = <rgb () > | <rgba () > | <hsl () > | <hsla () > | <hwb () > | <lab () > | <lch () > | <oklab () > | <oklch () > | <color () >
絶対色とは、算出値が絶対的な色度解釈を持つ<color>です。 これは、値が以下ではないことを意味します:
-
currentColor(colorプロパティの値に依存)
-
<system-color>(カラーモードに依存)
sRGBに解決される色は次の通りです:
レガシーカラー構文をサポートする関数は次の通りです:
<hsl()>、<hsla()>、<hwb()>、<lch()>、<oklch()>はカラー関数であり、円筒極座標の色 表現で<hue>角度を使います。 その他のカラー関数は直交座標の色表現を使います。
4.1.1. モダン(空白区切り)カラー関数構文
この仕様で初めて定義されたすべての絶対色 関数型はモダンカラー構文を使用します。 これは以下を意味します:
-
色成分は空白で区切られる
-
オプションのアルファ値はスラッシュ("/")で区切られる
-
シリアライズ時の最小精度(color値のシリアライズ時)が定められており、 8ビット/成分以上の場合もある
-
<percentage>と<number>を自由に混在指定できる
4.1.2. レガシー(カンマ区切り)カラー関数構文
Web互換性のため、 rgb()、rgba()、hsl()、hsla()の構文 (従来仕様で定義されたもの)は 次のような違いがあるレガシーカラー構文もサポートします:
-
色成分がカンマ区切り(空白が前後にあってもよい)
-
非不透明形式では別の表記(例えばhsla()はhsl()とは別)で、 アルファ値もカンマ区切り(空白が前後にあってもよい)
-
最小精度は低く、8ビット/成分
-
none値は許可されない
-
色成分はすべて<percentage>またはすべて<number>で指定しなければならず、混在不可
この仕様または後続レベルで導入されたカラー関数 について、Web互換性の問題がない場合は レガシーカラー構文は無効です。
4.2. 色の透明度の表現: <alpha-value>構文
テスト
この節は後で使用される定義を提供するものであり、テストは不要です。
<alpha-value> = <number> | <percentage>
特に指定がない限り、 色の<alpha-value>成分は省略時に100%となります。 [0,1]の範囲外の値は無効ではありませんが、パース時にその範囲へクランプされます。
4.3. 円筒座標系の色相の表現: <hue>構文
テスト
この節は後で使用される定義を提供するものであり、テストは不要です。
色相は色環の角度で表現されます (虹を輪にねじったものと考え、紫色が赤とすみれの間に追加されます)。
<hue> = <number> | <angle>
この値は度数で指定されることが非常に多いため、 引数を数値で指定することもでき、 これは度数として解釈され 標準単位となります。
この数値は [0,360) の範囲に正規化されます。
hsl(360 0 0)では<hue>成分は0度に正規化されます。
hsl(calc(-infinity) 0 0) や hsl(calc(infinity) 0 0)では <hue>成分も0度に正規化されます。
注: 特定の色相に対応する角度や間隔は 色空間によって異なります。 例えば、sRGB色空間を使うHSLやHWBでは sRGBの緑は120度です。 LCHではsRGBの緑は134.39度、 display-p3の緑は136.01度、 a98-rgbの緑は145.97度、 prophoto-rgbの緑は141.04度です (これらはすべて異なるグリーンの色調になるためです)。
<hue> 成分は無効成分となる最も一般的な成分です。 中心の無彩色軸に十分近い色は 無効な色相成分になります。
4.4. 「欠落」した色成分とnoneキーワード
場合によっては、 色には1つ以上の欠落色成分が存在することがあります。
この仕様では、 一部の色(例えば白)の色相補間によって 自動的に発生します。 他の仕様で成分が自動的に欠落する追加の状況を定義することもできます。
また、色関数の成分に noneキーワードを指定することで、 明示的に指定することもできます。 すべての色関数 (レガシーカラー構文を使用するものは除く) で、任意の成分をnoneとして指定可能です。
この指定は慎重に行うべきであり、 特定の効果が必要な場合のみに使用してください。
テスト
- color-computed-color-function.html (ライブテスト) (ソース)
- color-computed-hsl.html (ライブテスト) (ソース)
- color-computed-hwb.html (ライブテスト) (ソース)
- color-computed-lab.html (ライブテスト) (ソース)
- color-computed-relative-color.html (ライブテスト) (ソース)
- color-computed-rgb.html (ライブテスト) (ソース)
- color-invalid-hsl.html (ライブテスト) (ソース)
- color-invalid-rgb.html (ライブテスト) (ソース)
- color-valid-color-function.html (ライブテスト) (ソース)
- color-valid-color-mix-function.html (ライブテスト) (ソース)
- color-valid-hsl.html (ライブテスト) (ソース)
- color-valid-hwb.html (ライブテスト) (ソース)
- color-valid-lab.html (ライブテスト) (ソース)
- color-valid-relative-color.html (ライブテスト) (ソース)
- color-valid-rgb.html (ライブテスト) (ソース)
欠落成分の扱いについて 2色を組み合わせる場合(色補間など)は § 12.2 欠落成分での補間を参照してください。
その他の目的では、欠落成分はその成分に適した単位のゼロ値として扱われます: 0、0%、または0deg。 これには色を直接レンダリングする場合、 別の色空間に変換する場合、 色成分値で演算する場合などが含まれます。
欠落成分を持つ色をシリアライズしたり著者に直接提示する場合、 レガシーカラー構文ではゼロ値として表現され、 それ以外ではnoneキーワードとして表現されます。
結果は、本当に緑と白を混ぜたような色になり、 もし白の色相が0degにデフォルトされた場合のように 赤みがかった色になることはありません。
例えば、どんな色でも「グレースケール」へアニメーションしたい場合、 oklch(none 0 none)と補間すれば可能です。 これにより、開始色の色相と明度は保ったまま、 クロマだけを0へアニメーションし、 明度一定・色相一定のグレーに変化させることができます。
手動で行う場合、開始色の色相や明度を明示的に合わせる必要があります。
4.4.1. 「無効」な色成分
個々の色構文は、場合によっては、 その構文の特定の成分が無効色成分になることを指定できます。 これは、その成分の値がレンダリングされる色に影響しないことを示します。 どんな値を指定しても、画面上に表示される色は同じになります。
例えば、hsl()では、彩度成分が0%のとき色相成分は無効となります。 0%の彩度はグレースケール色を示し、 色相はまったく持たないため、 0degでも180degでも、他のどんな角度でも 結果は全く同じになります。
無効成分が手動で指定された場合は、通常通り動作します。 無効だからといって、特別な効果はありません。
しかし、色空間変換によって自動的に色が生成された場合は、 結果の無効成分は変換処理で得られた値ではなく、 欠落として設定しなければなりません。
円筒極座標色空間へ色空間変換を行う場合、 ユーザーエージェントは、色相成分が クロマ(またはhslの彩度など色度の指標)が その色空間で指定されたイプシロン(ε)未満であれば、 無効として扱うべきです。 例えば、グレーをoklch()に変換した場合、 数値誤差により、クロマが正確に0%ではなく極めて小さい値になることがありますが、 その場合も色相成分は無効となります。
4.5. <color>値の構文解析
テスト
この節は他で参照される定義を提供するものであり、テストは不要です。
注: このアルゴリズムは CSSスタイルシートやCSSOMインターフェースで指定された CSSの<color>値を構文解析することを意図したものではなく、 HTML属性やCanvasインターフェースなど 他の場所で使われることを目的としています。
5. sRGBカラー
sRGB色空間のCSSカラーは、 sRGB色空間内の1点を示す値(赤、緑、青の三つ組)で表現されます[SRGB]。 これは国際的に認められたデバイス非依存の色空間であり、 コンピュータ画面に色を表示するためだけでなく、 プリンタなど他の種類のデバイスの色指定にも有用です。
CSSでは、sRGB以外の色空間も § 10 定義済み色空間で説明されている通り利用可能です。
CSSはsRGBカラーを直接指定するために、16進カラー、rgb()/rgba()のカラー関数、hsl()/hsla()カラー関数、hwb()カラー関数、色名カラー、 およびtransparentキーワードなど複数の方法を提供します。
5.1. RGB関数: rgb() と rgba()
rgb() と rgba() 関数は r, g, b(赤、緑、青)の成分を直接指定することでsRGBカラーを定義します。 その構文は以下の通りです:
rgb () =[ <legacy-rgb-syntax> | <modern-rgb-syntax>] rgba () =[ <legacy-rgba-syntax> | <modern-rgba-syntax>] <legacy-rgb-syntax> =rgb ( <percentage>#{ 3 } , <alpha-value>?) |rgb ( <number>#{ 3 } , <alpha-value>?) <legacy-rgba-syntax> =rgba ( <percentage>#{ 3 } , <alpha-value>?) |rgba ( <number>#{ 3 } , <alpha-value>?) <modern-rgb-syntax> =rgb ( [ <number> | <percentage> | none] { 3 } [ /[ <alpha-value> | none] ] ?) <modern-rgba-syntax> =rgba ( [ <number> | <percentage> | none] { 3 } [ /[ <alpha-value> | none] ] ?)
パーセンテージ | r, g, bで利用可能 |
---|---|
パーセント基準範囲 | r, g, b: 0% = 0.0, 100% = 255.0 alpha: 0% = 0.0, 100% = 1.0 |
テスト
- rgb-001.html (ライブテスト) (ソース)
- rgb-002.html (ライブテスト) (ソース)
- rgb-003.html (ライブテスト) (ソース)
- rgb-004.html (ライブテスト) (ソース)
- rgb-005.html (ライブテスト) (ソース)
- rgb-006.html (ライブテスト) (ソース)
- rgb-007.html (ライブテスト) (ソース)
- rgb-008.html (ライブテスト) (ソース)
- out-of-gamut-legacy-rgb.html (ライブ テスト) (ソース)
- color-valid.html (ライブテスト) (ソース)
- color-computed-rgb.html (ライブ テスト) (ソース)
- color-invalid-rgb.html (ライブ テスト) (ソース)
- color-valid-rgb.html (ライブテスト) (ソース)
最初の3つの引数は、それぞれ色のr, g, b(赤、緑、青)成分を指定します。0%はsRGB色域における最小値、 100%は最大値を表します。
色成分のパーセンテージ基準範囲は、 多くのグラフィックエンジンが内部的に色成分を1バイト整数(0〜255)で保存していたという歴史的事実に由来します。 実装はできる限り著者や計算された成分の精度を維持すべきです。 それができない場合は、+∞方向に丸めるべきです。
最後の引数<alpha-value>は色のアルファを指定します。 省略された場合は100%がデフォルトです。
テスト
これらの範囲外の値は無効ではありませんが、 パース時にここで定義された範囲にクランプされます。
歴史的理由により、rgb() および rgba() はレガシーカラー構文もサポートしています。
テスト
5.2. RGB16進数表記: #RRGGBB
CSSの16進カラー表記は、sRGBカラーの成分を16進数で指定することができ、 これはコンピューターコードで色を書く方法とよく似ています。 また、同じ色をrgb()表記で書くよりも短くなります。
<hex-color>の構文は、値が3、4、6、または8桁の16進数で構成される<hash-token>トークンです。 つまり、16進カラーはハッシュ記号「#」に続いて、0〜9またはa〜fの桁がいくつか並びます (文字の大文字小文字は区別しません。#00ff00は#00FF00と同じ色を表します)。
指定された16進数の桁数によって、16進数表記をRGBカラーにデコードする方法が決まります:
- 6桁
- 最初の2桁を16進数として解釈し、赤成分を指定します。 00は最小値、 ff(10進で255)は最大値です。 次の2桁が緑、最後の2桁が青成分です。 アルファ成分は完全不透明です。
- 8桁
- 最初の6桁は6桁表記と同じように解釈されます。 最後の2桁を16進数として解釈し、色のアルファ成分を指定します。 00は完全な透明色、 ffは完全な不透明色です。
- 3桁
- 6桁表記の短縮形です。 最初の1桁が赤成分を16進数として指定し、 0は最小値、 fは最大値です。 次の2桁が緑、青成分です。 アルファ成分は完全不透明です。
- 4桁
- 8桁表記の短縮形で、 3桁表記と同様に「展開」されます。 最初の1桁が赤成分を16進数として指定し、 0は最小値、 fは最大値です。 次の3桁が緑、青、アルファ成分になります。
テスト
- hex-001.html (ライブテスト) (ソース)
- hex-002.html (ライブテスト) (ソース)
- hex-003.html (ライブテスト) (ソース)
- hex-004.html (ライブテスト) (ソース)
- border-bottom-color.xht (ライブテスト) (ソース)
- border-left-color.xht (ライブテスト) (ソース)
- border-right-color.xht (ライブテスト) (ソース)
- border-top-color.xht (ライブテスト) (ソース)
- color-valid.html (ライブテスト) (ソース)
- color-computed-hex-color.html (ライブ テスト) (ソース)
- color-invalid-hex-color.html (ライブ テスト) (ソース)
6. カラーキーワード
さまざまな数値構文による<color>指定に加え、 CSSでは用途や利点ごとに複数のカラーキーワードセットが定義されています。
6.1. 名前付きカラー
CSSは多数の名前付きカラーを定義しており、 よく使われる色を簡単に書けて読みやすくなっています。 <named-color>は<ident>として記述され、 <color>が使える場所ならどこでも利用できます。 CSSで定義される<ident>はすべて ASCII大文字小文字を区別しません。
名前はsRGBの色に解決されます。
CSSの名前付きカラーのうち16色はVGAパレット由来で、HTMLにも採用されました: aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white, yellow。 その他の多くはUnix系システムのコンソール色指定に使われたX11カラ―システム由来で、 SVGにも採用されています。
注:これらの色名は良いからではなく、 長年広く使われ実装されてきた現実を標準化で反映するためにここで標準化されています。 実際、名前だけではどんな色か想像しづらい場合も多く(下記リスト参照)、 名前の分布はsRGB色空間全体に均等ではなく、 名前の内部整合性もありません ( darkgrayは grayより明るく、 lightpinkは pinkより暗い)、 一部の名前( indianredなど)は 不快とされることもあります。 したがって、これらの使用は推奨されません。
(特別な色値transparentとcurrentcolorは それぞれ独自の節で定義されています。)
次の表は、すべての不透明な名前付きカラーについて、 他の色構文での同等の数値指定を示します。
名前付き | 数値 | カラー名 | 16進rgb | 10進数 |
---|---|---|---|---|
aliceblue | #f0f8ff | 240 248 255 | ||
antiquewhite | #faebd7 | 250 235 215 | ||
aqua | #00ffff | 0 255 255 | ||
aquamarine | #7fffd4 | 127 255 212 | ||
azure | #f0ffff | 240 255 255 | ||
beige | #f5f5dc | 245 245 220 | ||
bisque | #ffe4c4 | 255 228 196 | ||
black | #000000 | 0 0 0 | ||
blanchedalmond | #ffebcd | 255 235 205 | ||
blue | #0000ff | 0 0 255 | ||
blueviolet | #8a2be2 | 138 43 226 | ||
brown | #a52a2a | 165 42 42 | ||
burlywood | #deb887 | 222 184 135 | ||
cadetblue | #5f9ea0 | 95 158 160 | ||
chartreuse | #7fff00 | 127 255 0 | ||
chocolate | #d2691e | 210 105 30 | ||
coral | #ff7f50 | 255 127 80 | ||
cornflowerblue | #6495ed | 100 149 237 | ||
cornsilk | #fff8dc | 255 248 220 | ||
crimson | #dc143c | 220 20 60 | ||
cyan | #00ffff | 0 255 255 | ||
darkblue | #00008b | 0 0 139 | ||
darkcyan | #008b8b | 0 139 139 | ||
darkgoldenrod | #b8860b | 184 134 11 | ||
darkgray | #a9a9a9 | 169 169 169 | ||
darkgreen | #006400 | 0 100 0 | ||
darkgrey | #a9a9a9 | 169 169 169 | ||
darkkhaki | #bdb76b | 189 183 107 | ||
darkmagenta | #8b008b | 139 0 139 | ||
darkolivegreen | #556b2f | 85 107 47 | ||
darkorange | #ff8c00 | 255 140 0 | ||
darkorchid | #9932cc | 153 50 204 | ||
darkred | #8b0000 | 139 0 0 | ||
darksalmon | #e9967a | 233 150 122 | ||
darkseagreen | #8fbc8f | 143 188 143 | ||
darkslateblue | #483d8b | 72 61 139 | ||
darkslategray | #2f4f4f | 47 79 79 | ||
darkslategrey | #2f4f4f | 47 79 79 | ||
darkturquoise | #00ced1 | 0 206 209 | ||
darkviolet | #9400d3 | 148 0 211 | ||
deeppink | #ff1493 | 255 20 147 | ||
deepskyblue | #00bfff | 0 191 255 | ||
dimgray | #696969 | 105 105 105 | ||
dimgrey | #696969 | 105 105 105 | ||
dodgerblue | #1e90ff | 30 144 255 | ||
firebrick | #b22222 | 178 34 34 | ||
floralwhite | #fffaf0 | 255 250 240 | ||
forestgreen | #228b22 | 34 139 34 | ||
fuchsia | #ff00ff | 255 0 255 | ||
gainsboro | #dcdcdc | 220 220 220 | ||
ghostwhite | #f8f8ff | 248 248 255 | ||
gold | #ffd700 | 255 215 0 | ||
goldenrod | #daa520 | 218 165 32 | ||
gray | #808080 | 128 128 128 | ||
green | #008000 | 0 128 0 | ||
greenyellow | #adff2f | 173 255 47 | ||
grey | #808080 | 128 128 128 | ||
honeydew | #f0fff0 | 240 255 240 | ||
hotpink | #ff69b4 | 255 105 180 | ||
indianred | #cd5c5c | 205 92 92 | ||
indigo | #4b0082 | 75 0 130 | ||
ivory | #fffff0 | 255 255 240 | ||
khaki | #f0e68c | 240 230 140 | ||
lavender | #e6e6fa | 230 230 250 | ||
lavenderblush | #fff0f5 | 255 240 245 | ||
lawngreen | #7cfc00 | 124 252 0 | ||
lemonchiffon | #fffacd | 255 250 205 | ||
lightblue | #add8e6 | 173 216 230 | ||
lightcoral | #f08080 | 240 128 128 | ||
lightcyan | #e0ffff | 224 255 255 | ||
lightgoldenrodyellow | #fafad2 | 250 250 210 | ||
lightgray | #d3d3d3 | 211 211 211 | ||
lightgreen | #90ee90 | 144 238 144 | ||
lightgrey | #d3d3d3 | 211 211 211 | ||
lightpink | #ffb6c1 | 255 182 193 | ||
lightsalmon | #ffa07a | 255 160 122 | ||
lightseagreen | #20b2aa | 32 178 170 | ||
lightskyblue | #87cefa | 135 206 250 | ||
lightslategray | #778899 | 119 136 153 | ||
lightslategrey | #778899 | 119 136 153 | ||
lightsteelblue | #b0c4de | 176 196 222 | ||
lightyellow | #ffffe0 | 255 255 224 | ||
lime | #00ff00 | 0 255 0 | ||
limegreen | #32cd32 | 50 205 50 | ||
linen | #faf0e6 | 250 240 230 | ||
magenta | #ff00ff | 255 0 255 | ||
maroon | #800000 | 128 0 0 | ||
mediumaquamarine | #66cdaa | 102 205 170 | ||
mediumblue | #0000cd | 0 0 205 | ||
mediumorchid | #ba55d3 | 186 85 211 | ||
mediumpurple | #9370db | 147 112 219 | ||
mediumseagreen | #3cb371 | 60 179 113 | ||
mediumslateblue | #7b68ee | 123 104 238 | ||
mediumspringgreen | #00fa9a | 0 250 154 | ||
mediumturquoise | #48d1cc | 72 209 204 | ||
mediumvioletred | #c71585 | 199 21 133 | ||
midnightblue | #191970 | 25 25 112 | ||
mintcream | #f5fffa | 245 255 250 | ||
mistyrose | #ffe4e1 | 255 228 225 | ||
moccasin | #ffe4b5 | 255 228 181 | ||
navajowhite | #ffdead | 255 222 173 | ||
navy | #000080 | 0 0 128 | ||
oldlace | #fdf5e6 | 253 245 230 | ||
olive | #808000 | 128 128 0 | ||
olivedrab | #6b8e23 | 107 142 35 | ||
orange | #ffa500 | 255 165 0 | ||
orangered | #ff4500 | 255 69 0 | ||
orchid | #da70d6 | 218 112 214 | ||
palegoldenrod | #eee8aa | 238 232 170 | ||
palegreen | #98fb98 | 152 251 152 | ||
paleturquoise | #afeeee | 175 238 238 | ||
palevioletred | #db7093 | 219 112 147 | ||
papayawhip | #ffefd5 | 255 239 213 | ||
peachpuff | #ffdab9 | 255 218 185 | ||
peru | #cd853f | 205 133 63 | ||
pink | #ffc0cb | 255 192 203 | ||
plum | #dda0dd | 221 160 221 | ||
powderblue | #b0e0e6 | 176 224 230 | ||
purple | #800080 | 128 0 128 | ||
rebeccapurple | #663399 | 102 51 153 | ||
red | #ff0000 | 255 0 0 | ||
rosybrown | #bc8f8f | 188 143 143 | ||
royalblue | #4169e1 | 65 105 225 | ||
saddlebrown | #8b4513 | 139 69 19 | ||
salmon | #fa8072 | 250 128 114 | ||
sandybrown | #f4a460 | 244 164 96 | ||
seagreen | #2e8b57 | 46 139 87 | ||
seashell | #fff5ee | 255 245 238 | ||
sienna | #a0522d | 160 82 45 | ||
silver | #c0c0c0 | 192 192 192 | ||
skyblue | #87ceeb | 135 206 235 | ||
slateblue | #6a5acd | 106 90 205 | ||
slategray | #708090 | 112 128 144 | ||
slategrey | #708090 | 112 128 144 | ||
snow | #fffafa | 255 250 250 | ||
springgreen | #00ff7f | 0 255 127 | ||
steelblue | #4682b4 | 70 130 180 | ||
tan | #d2b48c | 210 180 140 | ||
teal | #008080 | 0 128 128 | ||
thistle | #d8bfd8 | 216 191 216 | ||
tomato | #ff6347 | 255 99 71 | ||
turquoise | #40e0d0 | 64 224 208 | ||
violet | #ee82ee | 238 130 238 | ||
wheat | #f5deb3 | 245 222 179 | ||
white | #ffffff | 255 255 255 | ||
whitesmoke | #f5f5f5 | 245 245 245 | ||
yellow | #ffff00 | 255 255 0 | ||
yellowgreen | #9acd32 | 154 205 50 |
注: このカラーリストと定義は SVG 1.1で定義された名前付きカラーのリストの上位集合です。
歴史的な理由で、これはX11カラ―セットとも呼ばれます。注: X11カラ―システムの歴史は興味深く、 Alex Sextonによる "Peachpuffs and Lemonchiffons" 講演で見事にまとめられています。
テスト
6.2. システムカラー
一般的に、<system-color>キーワードは ユーザー、ブラウザー、OSによって選択されたデフォルトの色を反映します。 そのため、ブラウザーのデフォルトスタイルシートでよく使われます。
可読性を維持するため、 <system-color>キーワードはライトモードやダークモードの変更にも対応します。
可読なリンクテキスト
不可読なリンクテキスト
可読なリンクテキスト
ただし、強制カラーモードでは、 ページ上のほとんどの色が制限されたユーザー選択パレットに強制されます。 <system-color>キーワードは これらのユーザー選択色を公開し、 ページ全体がこの制限されたパレットと統合できるようにします。
forced-colors メディア特性がactiveのとき、 著者は<system-color>キーワードを CSS Color Adjustment 1 § 3.1 強制カラーで影響を受けるプロパティに記載されたもの以外のプロパティ値として使用すべきです。 これにより、ページ全体の可読性と一貫性を確保し、 ユーザー強制色とページ選択色が混在することを避けられます。
テスト
<system-color>キーワードの値がブラウザー由来の場合 (OSのデフォルトやユーザー選択ではなく)、ブラウザーは対応する 前景/背景ペアがWCAG AAコントラストを満たすようにするべきです。 ただし、ユーザーの好み(高コントラストや低コントラスト)はブラウザーの設定、ユーザースタイルシート、 OSのデフォルトの変更などでこの要件より優先されます。
著者はこれらのキーワードをいつでも使ってもかまいませんが、 適切なコントラストを確保するために対応する背景-前景ペアで色を使うよう すべきです。 非対応ペア間(例:CanvasとButtonTextなど)の コントラスト関係は保証されません。
<system-color>キーワードは次の通り定義されます:
- AccentColor
- アクセント付きUIコントロールの背景。
- AccentColorText
- アクセント付きUIコントロールのテキスト。
- ActiveText
- アクティブリンクのテキスト。明るい背景では従来赤色。
- ButtonBorder
- プッシュボタンの基本ボーダーカラー。
- ButtonFace
- プッシュボタンのフェイス背景色。
- ButtonText
- プッシュボタン上のテキスト。
- Canvas
- アプリケーションコンテンツやドキュメントの背景。
- CanvasText
- アプリケーションコンテンツやドキュメントのテキスト。
- Field
- 入力フィールドの背景。
- FieldText
- 入力フィールドのテキスト。
- GrayText
- 無効化されたテキスト。 (多くの場合グレーですが必ずしもそうではありません。)
- Highlight
- 選択されたテキストの背景(例:::selection)。
- HighlightText
- 選択されたテキストの文字色。
- LinkText
- 非アクティブ・非訪問済みリンクのテキスト。明るい背景では従来青色。
- Mark
-
特別にマークされたテキストの背景(HTML
mark
要素など)。 - MarkText
-
特別にマークされたテキストの文字色(HTML
mark
要素など)。 - SelectedItem
- 選択された項目(例:選択済みチェックボックス)の背景。
- SelectedItemText
- 選択された項目のテキスト。
- VisitedText
- 訪問済みリンクのテキスト。明るい背景では従来紫色。
テスト
注: 他のキーワード同様、 これらの名前はASCII大文字小文字を区別しません。 可読性のためここでは混在した大文字小文字で表示しています。
特定のシステムUI概念が存在しないシステムでは、 指定値は最も関連性の高いシステムカラー値にマッピングされるべきです。 次のシステムカラー組み合わせは 可読な背景-前景色を形成すると期待されます:
-
Canvas背景+ButtonBorderボーダーと隣接する色Canvas
-
ButtonFace背景+ButtonText前景。
-
ButtonFaceまたはField背景+ButtonBorderボーダーと隣接する色Canvas'
-
Highlight背景+HighlightText前景。
さらに、GrayTextは どの背景でも読めることが期待されますが、 コントラスト評価は低い場合もあります。
Canvas+CanvasText: CanvasText
Canvas+LinkText: LinkText
Canvas+VisitedText: VisitedText
Canvas+ActiveText: ActiveText
Canvas+GrayText: GrayText
Canvas+ButtonBorder+隣接Canvas: CanvasTextAdjacent
ButtonFace+ButtonText: ButtonText
ButtonFace+ButtonText+ButtonBorder: ButtonText
ButtonFace+GrayText: GrayText
Field+FieldText: FieldText
Field+GrayText: GrayText
Mark+MarkText: MarkText
Mark+GrayText: GrayText
Highlight+HighlightText: HighlightText
Highlight+GrayText: GrayText
SelectedItem+SelectedItemText: SelectedItemText
AccentColor+AccentColorText: AccentColorText
AccentColor+GrayText: GrayText
CSSの過去バージョンでは追加の<system-color>が定義されていましたが、 すでに廃止されています。 詳細は付録A: 廃止CSSシステムカラーを参照してください。
注: <system-color>には§ 21 プライバシーの考慮や§ 20 セキュリティの考慮で説明されているように 一部プライバシー・セキュリティリスクがあります。
ユーザーエージェントは、 指紋取得などのプライバシー・セキュリティリスクを軽減するために、 システムカラーの使用値として固定値を返し、 ユーザーによるカスタマイズやテーマ選択を反映しないことを選択することができます。
6.3. transparentキーワード
transparentキーワードは透明な黒を指定します。 <named-color>型の一種です。
テスト
6.4. currentcolorキーワード
currentcolorキーワードは、同じ要素上のcolorプロパティの値を表します。 <named-color>とは異なり、sRGBに限定されません。 値は任意の<color>型となりえます。 使用値は色値の解決により決定されます。
テスト
- border-color-currentcolor.html (ライブテスト) (ソース)
- color-mix-currentcolor-nested-for-color-property.html (ライブテスト) (ソース)
- currentcolor-001.html (ライブテスト) (ソース)
- currentcolor-002.html (ライブテスト) (ソース)
- currentcolor-003.html (ライブテスト) (ソース)
- currentcolor-004.html (ライブテスト) (ソース)
- currentcolor-visited-fallback.html (ライブテスト) (ソース)
- color-valid.html (ライブテスト) (ソース)
.foo{ color : red; background-color : currentcolor; }
これは次のように書くのと同じです:
.foo{ color : red; background-color : red; }
< p >< em > Some< strong > really</ strong > emphasized text.</ em > < style > p { color : black ; } em { text-emphasis : dot ; } strong { color : red ; } </ style >
上記の例では、「Some」や「emphasized text」部分の強調記号は黒ですが、「really」部分は赤になります。
注: CSSの複数語キーワードは通常ハイフンで区切られます。currentcolorは例外で(理由は…)、 もともとSVGでプロパティ値「current-color」として導入されました。 (通常のCSS表記)その後、他のプロパティ値とともに プレゼンテーション属性や属性値としても使われ、 XSLTでの生成を容易にするためでした。 その後、すべてのプレゼンテーション属性がハイフン表記からキャメルケースへ変更されましたが、 DOMではハイフンが「マイナス」を意味する問題があったためです。 しかしCSSの慣例とは合わなくなったので、 すでにCSS側に存在していたものは再びハイフン表記に戻されました! currentcolorは当時CSSにはなかったためキャメルケースのまま。 その後CSSに採用され、大文字小文字が重要でなくなり、 CSSキーワードはASCII大文字小文字を区別しませんとなりました。
7. HSLカラー: hsl() と hsla()関数
RGB方式による色指定は、 機械やグラフィックライブラリには便利ですが、 人間が直感的に理解するのは非常に難しいとよく言われます。 例えば、RGBの色をどう変更すれば同じ色相のより明るいバリエーションになるのかを 判断するのは容易ではありません。
他にもいくつかの色体系が考案されています。 そのひとつがHSL [HSL]色体系です。 これはより直感的に使える一方で、 RGB色にも容易に変換できます。
HSLカラーは 色相・彩度・明度の3つ組で指定します。 hsl()およびhsla()関数の構文は次の通りです:
hsl () =[ <legacy-hsl-syntax> | <modern-hsl-syntax>] hsla () =[ <legacy-hsla-syntax> | <modern-hsla-syntax>] <modern-hsl-syntax> =hsl ( [ <hue> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ /[ <alpha-value> | none] ] ?) <modern-hsla-syntax> =hsla ( [ <hue> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ /[ <alpha-value> | none] ] ?) <legacy-hsl-syntax> =hsl ( <hue>, <percentage>, <percentage>, <alpha-value>?) <legacy-hsla-syntax> =hsla ( <hue>, <percentage>, <percentage>, <alpha-value>?)
パーセンテージ | SとLで利用可能 |
---|---|
パーセント基準範囲 | SとL: 0% = 0.0, 100% = 100.0 |
無効色相ε | S <= 0.001 |
テスト
- hsl-001.html (ライブテスト) (ソース)
- hsl-002.html (ライブテスト) (ソース)
- hsl-003.html (ライブテスト) (ソース)
- hsl-004.html (ライブテスト) (ソース)
- hsl-005.html (ライブテスト) (ソース)
- hsl-006.html (ライブテスト) (ソース)
- hsl-007.html (ライブテスト) (ソース)
- hsl-008.html (ライブテスト) (ソース)
- hsl-clamp-negative-saturation.html (ライブ テスト) (ソース)
- background-color-hsl-001.html (ライブ テスト) (ソース)
- background-color-hsl-002.html (ライブ テスト) (ソース)
- background-color-hsl-003.html (ライブ テスト) (ソース)
- background-color-hsl-004.html (ライブ テスト) (ソース)
- color-computed-hsl.html (ライブ テスト) (ソース)
- color-invalid-hsl.html (ライブ テスト) (ソース)
- color-valid-hsl.html (ライブ テスト) (ソース)
最初の引数は色相角度を指定します。
HSL(およびHWB)では、0degはsRGB主赤色を表します (360deg、720deg等も同様)、 他の色相は円周上に配置されるので 120degはsRGB主緑、240degはsRGB主青などを表します。
次の2つの引数は、彩度と明度です。 彩度については、100%または100が完全に鮮やかな明るい色、 0%または0が完全に無彩色のグレーです。 明度については、50%または50が「標準」色、 100%または100が白、0%または0が黒です。
歴史的理由により、 彩度が0%未満の場合はパース時に0%へクランプされ、 sRGB色に変換されます。
最後の引数は色のアルファ成分を指定します。 rgb()関数の第4引数と同様に解釈されます。 省略時は100%がデフォルトです。
HSLカラーはsRGBに解決されます。
HSLカラーの彩度が0%または0なら、 色相成分は無効です。
HSLの利点はRGBよりも直感的であることです。 欲しい色を推測して微調整できます。
hsl ( 120 deg 100 % 50 % ) ライムグリーンhsl ( 120 deg 100 % 25 % ) ダークグリーンhsl ( 120 deg 100 % 75 % ) ライトグリーンhsl ( 120 deg 75 % 85 % ) パステルグリーン
HSLの欠点はOKLChと比べて 色相操作で見た目の明度が変化すること、 色相が均等に分布していないことです。
HSLでは色相を固定して彩度・明度だけ変化させることで セットの色を作りやすく、 sRGB成分値を操作するよりも簡単です。 ただし、明度はガンマ補正後の赤・緑・青成分の平均値なので、 色相全体で見た目の明度と一致しません。
OKLChでは、sRGB青はoklch(0.452 0.313 264.1)、 sRGB黄色はoklch(0.968 0.211 109.8)であり、 OKLCh明度0.452と0.968は見た目の明度差を正確に反映しています。
HSLの色相角は知覚的に均一ではなく、 一部の領域では色が密集し、 他の領域では広く分布します。
OKLChでは、同じ色のペア oklch(0.533 0.26 262.6)と oklch(0.462 0.306 268.9)は 色相差6.3度、 もう一方のペア oklch(0.882 0.181 94.24)と oklch(0.91 0.245 129.9)は 色相差35.66度となり、見た目の分離を正しく反映しています。
歴史的理由により、hsl()およびhsla()はレガシーカラー構文もサポートします。
テスト
- hsla-001.html (ライブテスト) (ソース)
- hsla-002.html (ライブテスト) (ソース)
- hsla-003.html (ライブテスト) (ソース)
- hsla-004.html (ライブテスト) (ソース)
- hsla-005.html (ライブテスト) (ソース)
- hsla-006.html (ライブテスト) (ソース)
- hsla-007.html (ライブテスト) (ソース)
- hsla-008.html (ライブテスト) (ソース)
- hsla-clamp-negative-saturation.html (ライブ テスト) (ソース)
- color-valid.html (ライブ テスト) (ソース)
7.1. HSLカラーからsRGBへの変換
HSLカラーをsRGBに変換することは数学的に簡単です。 こちらは変換アルゴリズムのJavaScriptによるサンプル実装です。 配列で赤・緑・青成分(sRGBガマット内の場合は[0, 1]範囲)を返します。
このコードは、パース時に負の彩度のクランプ処理が既に適用されていることを前提とします。
/** * @param {number} hue - 色相(度数 0..360) * @param {number} sat - 彩度(基準範囲 [0,100]) * @param {number} light - 明度(基準範囲 [0,100]) * @return {number[]} sRGB成分の配列。ガマット内は[0..1] */ function hslToRgb( hue, sat, light) { sat/= 100 ; light/= 100 ; function f( n) { let k= ( n+ hue/ 30 ) % 12 ; let a= sat* Math. min( light, 1 - light); return light- a* Math. max( - 1 , Math. min( k- 3 , 9 - k, 1 )); } return [ f( 0 ), f( 8 ), f( 4 )]; }
7.2. sRGBカラーからHSLへの変換
逆方向の変換も同様に行います。
sRGBガマット外の色では中間値に負の彩度が生じる場合があるため、 その処理に注意します。
/** * @param {number} red - 赤成分 0..1 * @param {number} green - 緑成分 0..1 * @param {number} blue - 青成分 0..1 * @return {number[]} HSL値の配列: 色相は度数0..360、彩度と明度は参照範囲[0,100] */ function rgbToHsl( red, green, blue) { let max= Math. max( red, green, blue); let min= Math. min( red, green, blue); let [ hue, sat, light] = [ NaN , 0 , ( min+ max) / 2 ]; let d= max- min; let epsilon= 1 / 100000 ; // このコードでは最大彩度は1 if ( d!== 0 ) { sat= ( light=== 0 || light=== 1 ) ? 0 : ( max- light) / Math. min( light, 1 - light); switch ( max) { case red: hue= ( green- blue) / d+ ( green< blue? 6 : 0 ); break ; case green: hue= ( blue- red) / d+ 2 ; break ; case blue: hue= ( red- green) / d+ 4 ; } hue= hue* 60 ; } // ガマット外の色は負の彩度になる場合がある // その場合、色相を180度回転し、正の彩度を使う // 詳細:https://github.com/w3c/csswg-drafts/issues/9222 if ( sat< 0 ) { hue+= 180 ; sat= Math. abs( sat); } if ( hue>= 360 ) { hue-= 360 ; } if ( sat<= epsilon) { hue= NaN ; } return [ hue, sat* 100 , light* 100 ]; }
7.3. HSL色の例
このセクションは規範的ではありません。
テスト
このセクションは規範的ではないため、テストは不要です。
以下の表は、さまざまなHSL色の幅広いバリエーションを示しています。 各表は1つの色相を表しており、 30°ごとに選択されています。 これは一般的な「コア」色相を示すためです: 赤、 黄、 緑、 シアン、 青、 マゼンタ、 そしてこれらの間に位置する6つの中間色です。
各表では、X軸は彩度を、 Y軸は明度を表しています。
0° レッド | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
30° レッド-イエロー(=オレンジ) | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
60° イエロー | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
90° イエローグリーン | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
120° グリーン | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
150° グリーン-シアン | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
180° シアン | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
210° シアン-ブルー | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
240° ブルー | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
270° ブルー・マゼンタ | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
300° マゼンタ | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
330° マゼンタ-レッド | ||||||
---|---|---|---|---|---|---|
100% | 80% | 60% | 40% | 20% | 0% | |
100% | ||||||
90% | ||||||
80% | ||||||
70% | ||||||
60% | ||||||
50% | ||||||
40% | ||||||
30% | ||||||
20% | ||||||
10% | ||||||
0% |
8. HWB色: hwb() 関数
HWB(Hue-Whiteness-Blacknessの略)[HWB] は、sRGB色を指定するもうひとつの方法であり、 HSLに似ていますが、しばしば人間にとってさらに扱いやすいものです。 最初に色相を指定し、 その基本色相に白さと黒さの度合いを混ぜることで色を表します。
多くのカラーピッカーはHWBカラーモデルを基にしており、 その直感的な使いやすさが理由です。
HWB色はsRGBに解決されます。

< input type = "color" >
を操作した際に表示されます。
外側のホイールで色相を選択し、
内側の三角形をクリックすることで白と黒の割合を選択します。
hwb() 関数の構文は次の通りです:
hwb () =hwb ( [ <hue> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ /[ <alpha-value> | none] ] ?)
パーセンテージ | WとBで使用可能 |
---|---|
パーセント参照範囲 | WとB:0% = 0.0、100% = 100.0 |
無効色相 ε | W + B >= 99.999 |
最初の引数は色相を指定し、 hsl()と同じ定義です; つまり同じ欠点(色相の均一性など)を持ちます。
2番目の引数は、混ぜる白の量をパーセンテージで指定します。0%(白なし)から100%(完全に白)までです。 同様に、3番目の引数は混ぜる黒の量を指定し、 0%(黒なし)から100%(完全に黒)までです。
これらの範囲外の値は 無効ではありません; 色相角が[0,360)の範囲外ならその範囲に正規化され、 白と黒の値の合計が100%以上の場合は 以下に記載するように無彩色が生成されます。
得られる色は、選択した色相の絵の具、白の絵の具、黒の絵の具を混ぜた混合物と概念的に考えることができます。 各割合はパーセンテージで決まります。
white+blackの合計が100%以上の場合、 それは無彩色(グレーの一種)を定義します。 sRGBに変換した場合、R・G・Bの値はすべて同じになり、 値は white / (white + black) となります。
無彩色のHWB色は、選択した色相の情報を持ちません。 この場合、色相成分は無効です。
4番目の引数は色のアルファ成分を指定します。 rgb()関数の4番目の引数と同じ解釈です。 省略した場合は 100% になります。
hwb は 勧告案の新しい機能であり、Web互換性の問題はありません。 したがって hwb() は、引数をすべてカンマで区切るレガシーカラー構文をサポートしません。 hwb() 内でカンマを使うとエラーになります。
テスト
8.1. HWB色をsRGBに変換する
HWB色をsRGBに変換するのは簡単で、 HSLをRGBに変換する方法と関連しています。 以下のJavascriptによるアルゴリズム実装は まず白と黒の成分を正規化し、 その合計が100%を超えないようにします。
/** * @param {number} hue - 色相(度数 0..360) * @param {number} white - 白さ(参照範囲 [0,100]) * @param {number} black - 黒さ(参照範囲 [0,100]) * @return {number[]} RGB成分の配列(0..1) */ function hwbToRgb( hue, white, black) { white/= 100 ; black/= 100 ; if ( white+ black>= 1 ) { let gray= white/ ( white+ black); return [ gray, gray, gray]; } let rgb= hslToRgb( hue, 100 , 50 ); for ( let i= 0 ; i< 3 ; i++ ) { rgb[ i] *= ( 1 - white- black); rgb[ i] += white; } return rgb; }
8.2. sRGB色をHWBに変換する
逆方向の変換も同様に進みます。
/** * @param {number} red - 赤成分(0..1) * @param {number} green - 緑成分(0..1) * @param {number} blue - 青成分(0..1) * @return {number} 色相(度数 0..360) */ function rgbToHue( red, green, blue) { // rgbToHslと似ていますが、彩度と明度は計算せず、 // 負の彩度になる可能性は無視します。 let max= Math. max( red, green, blue); let min= Math. min( red, green, blue); let hue= NaN ; let d= max- min; if ( d!== 0 ) { switch ( max) { case red: hue= ( green- blue) / d+ ( green< blue? 6 : 0 ); break ; case green: hue= ( blue- red) / d+ 2 ; break ; case blue: hue= ( red- green) / d+ 4 ; } hue*= 60 ; } if ( hue>= 360 ) { hue-= 360 ; } return hue; } /** * @param {number} red - 赤成分(0..1) * @param {number} green - 緑成分(0..1) * @param {number} blue - 青成分(0..1) * @return {number[]} HWB値の配列: 色相(度数 0..360)、白さと黒さ(参照範囲 [0,100]) */ function rgbToHwb( red, green, blue) { let epsilon= 1 / 100000 ; // 100倍を考慮 var hue= rgbToHue( red, green, blue); var white= Math. min( red, green, blue); var black= 1 - Math. max( red, green, blue); if ( white+ black>= 1 - epsilon) { hue= NaN ; } return ([ hue, white* 100 , black* 100 ]); }
8.3. HWB色の例
このセクションは規定ではありません。
テスト
このセクションは規定ではないため、テストは不要です。
0° レッド | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
30° レッド-イエロー(オレンジ) | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
60° イエロー | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
90° イエロー-グリーン | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
120° グリーン | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
150° グリーン-シアン | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
180° シアン | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
210° シアン-ブルー | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
240° ブルー | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
270° ブルー・マゼンタ | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
300° マゼンタ | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
330° マゼンタ-レッド | ||||||
---|---|---|---|---|---|---|
白\黒 | 0% | 20% | 40% | 60% | 80% | 100% |
0% | ||||||
20% | ||||||
40% | ||||||
60% | ||||||
80% | ||||||
100% |
9. デバイス非依存色:CIE LabおよびLCH、OklabおよびOKLCh
9.1. CIE LabとLCH
このセクションは規定ではありません。
テスト
このセクションは規定ではないため、テストは不要です。
色の物理測定値は、通常CIE L*a*b* [CIELAB] 色空間で表されます。 これは1976年にCIEによって作成され、一般的にLabと呼ばれています。 デバイス間の色変換でもLabが中間ステップとして使われることがあります。 人の視覚実験に基づいて派生したLabは、人間が見える色の全範囲を表現しています。
Labは、中央に明度(L)軸を持つ直交座標系です。 この値は通常単位なしの数値として記述されますが、 CSSの互換性のためにパーセンテージとして記述することもできます。 100%はL値が100を意味し、1.0ではありません。 L=0%または0は完全な黒(光がまったくない)、 L=100%または100は拡散白です。
便利なことに、L=50%または50は設計上中間のグレーであり、 Lの等間隔の増分は視覚的にも均等です。 Lab色空間は知覚的に均一を意図しています。
a軸とb軸は色相を表します。 a軸の正の値は紫がかった赤、 負の値は補色である緑を示します。 同様に、b軸の正の値は黄色、 負の値は補色の青/バイオレットを示します。 脱彩色の色はaとbの値が小さくL軸に近く、 彩度の高い色はL軸から遠くにあります。
光源はD50ホワイトであり、色温度5000Kの標準化された昼光スペクトルです。 完全拡散反射体で反射されたものとして定義され、晴天の日の太陽光の色に近似します。 D50はICC色変換におけるプロファイル接続空間のホワイトポイントでもあり、 Lab編集を提供する画像編集ソフトのホワイトポイント、 物理測定機器(分光光度計や分光放射計)がLabで測色値を報告するときも使われる値です。
他のホワイトポイントで指定された色からの変換は色順応変換と呼ばれます。 これは新しい照明条件に人の視覚が順応する変化をモデル化します。 線形Bradfordアルゴリズム [ICC](元のBradfordアルゴリズム[Bradford-CAT]の単純化版)は 業界標準の色順応変換であり、単なる行列乗算なので計算は容易です。
CIE LCHはLabと同じL軸を持ちますが、 極座標C(彩度)とH(色相)を使い、 極円筒座標系となっています。 CはL軸からの幾何学的距離、 Hは正のa軸から正のb軸方向への角度です。
注意: LabやLCHのL軸は、HSLのL軸と混同しないでください。 例えば、HSLではsRGBの青(#00F)と黄色(#FF0)は同じL値(50%)ですが、視覚的には青の方がずっと暗いです。 Labではより明確です: sRGB青は lab(29.567% 68.298 -112.0294)、 sRGB黄色は lab(97.607% -15.753 93.388) です。 LabやLCHでL値が同じ2色は、視覚的な明度が同じです。 HSLや関連する極座標RGBモデルは、 LabのLCHが提供した使いやすさをRGBに持ち込むために開発されましたが、 精度は大きく劣ります。
CIE LabやLCHは広く使われていますが、 いくつかの問題が知られています。特に:
- 色相の線形性
- 青領域(LCH色相270°から330°)で、視覚的色相がLCHの予測から外れます。 同じ色相でChromaのみ異なる青をプロットすると、 本来ニュートラル軸から直線になるはずが、 曲線になります。 言い換えると、 彩度の高い青のChromaを徐々に減らしていくと、 目立って紫がかってきます。
- 色相の均一性
- LCHの色相は概ね均等間隔ですが (HSLやHWBより遥かに良い)、 完全な均一性ではありません。
- 高Chroma差の過大予測
- Chromaが高い色では Chromaの変化は中間色と比べて 視覚的に目立ちません。
これらの欠点は、たとえば 均等間隔グラデーションの作成や 色空間間のガマットマッピング、 2色間の視覚的差分計算などに影響します。
これへの対処として、 2色間の視覚的差分(ΔE)算出式は より正確に進化してきました (計算も複雑化しています)。 現在の業界標準式は ΔE2000で、 LabやLCHの問題をある程度緩和します。 実装例は § 19.1 ΔE2000 に示されています。
ただし、色相の曲がりには対応できません。
9.2. OklabとOKLCh
このセクションは規定ではありません。
テスト
このセクションは規定ではないため、テストは不要です。
最近、Oklabという 改良型Lab類似空間が開発されました [Oklab]。 極座標形はOKLChと呼ばれます。 大規模な視覚的類似色データセットの数値最適化によって作られ、 従来のCIE LCHに比べ 色相の線形性、 色相の均一性、 彩度の均一性が改善されています。
CIE Labと同様、中央に明度L軸があり 通常は[0,1]範囲の単位なし数値で記述されますが、 CSS互換のためパーセンテージ記述も可能です。100%はL値1.0を意味します。 L=0%または0.0は完全な黒、L=100%または1.0は拡散白です。
注意: CIE Labが拡散白への順応を仮定するのに対し、 Oklabは定義される色への順応を仮定し、 スケール不変性を持たせることを意図しています。
CIE Labと同様、a軸とb軸が色相を伝えます。 a軸正は紫がかった赤、 負は補色の緑です。 b軸正は黄色、 負は補色の青/バイオレットです。
光源はD65で、 ほとんどのRGB色空間と同じホワイトポイントです。
OKLChはOklabと同じL軸を持ち、 極座標C(彩度)とH(色相)で表します。
注意: CIE LCHではChromaが200以上になることもありますが、 OKLChのChromaは0.5程度までです。 CIE LCHとOKLChの色相角は大まかに似ていますが、 完全一致ではありません。


OklabはCIE Labより知覚的均一性が高いため、 色差は3次元空間の単純な距離(2乗和の平方根)になります。 実装は trivial ですが、 サンプルは § 19.2 ΔEOK に示されています。
9.3. LabおよびLCHの指定:lab() および lch() 関数表記
CSSではLabおよびLCHで色を直接表現できます。
lab () =lab ( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ /[ <alpha-value> | none] ] ?)
パーセンテージ | L、a、bで使用可能 |
---|---|
パーセント参照範囲 | L: 0% = 0.0, 100% = 100.0 a, b: -100% = -125, 100% = 125 |
テスト
- lab-001.html (ライブテスト) (ソース)
- lab-002.html (ライブテスト) (ソース)
- lab-003.html (ライブテスト) (ソース)
- lab-004.html (ライブテスト) (ソース)
- lab-005.html (ライブテスト) (ソース)
- lab-006.html (ライブテスト) (ソース)
- lab-007.html (ライブテスト) (ソース)
- lab-008.html (ライブテスト) (ソース)
- lab-l-over-100-1.html (ライブテスト) (ソース)
- lab-l-over-100-2.html (ライブテスト) (ソース)
- color-valid.html (ライブテスト) (ソース)
- color-computed-lab.html (ライブ テスト) (ソース)
- color-invalid-lab.html (ライブ テスト) (ソース)
- color-valid-lab.html (ライブ テスト) (ソース)
Labでは、 最初の引数はCIE明度Lを指定します。 これは0%または0から 100%または100までの数値です。 0%または0未満の値は解析時に0%に丸められます。 100%または100より大きい値は解析時に100%に丸められます。
2番目と3番目の引数はLab色空間の「a」「b」軸方向の距離です(前節参照)。 これらは符号付き(正・負どちらも可)で、理論上は制限されません (実際は±160を超えません)。
4番目の引数として、スラッシュで区切られたオプションの<alpha-value>成分があります。 これはアルファ成分を表します。
Lab色の明度(丸め後)が0%または100%の場合、 ディスプレイへのガマットマッピングにより、それぞれ黒または白で表示されます。
lab ( 29.2345 % 39.3825 20.0664 ); lab ( 52.2345 40.1645 59.9971 ); lab ( 60.2345 -5.3654 58.956 ); lab ( 62.2345 % -34.9638 47.7721 ); lab ( 67.5345 -8.6911 -41.6019 ); lab ( 29.69 % 44.888 % -29.04 % )
lch () =lch ( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ /[ <alpha-value> | none] ] ?)
パーセンテージ | L、Cで使用可能 |
---|---|
パーセント参照範囲 | L: 0% = 0.0, 100% = 100.0 C: 0% = 0, 100% = 150 |
無効色相 ε | C <= 0.0015 |
テスト
- lch-001.html (ライブテスト) (ソース)
- lch-002.html (ライブテスト) (ソース)
- lch-003.html (ライブテスト) (ソース)
- lch-004.html (ライブテスト) (ソース)
- lch-005.html (ライブテスト) (ソース)
- lch-006.html (ライブテスト) (ソース)
- lch-007.html (ライブテスト) (ソース)
- lch-008.html (ライブテスト) (ソース)
- lch-009.html (ライブテスト) (ソース)
- lch-010.html (ライブテスト) (ソース)
- lch-l-over-100-1.html (ライブテスト) (ソース)
- lch-l-over-100-2.html (ライブテスト) (ソース)
- color-valid.html (ライブテスト) (ソース)
CIE LCHでは最初の引数がCIE明度Lを指定し、 lab() の明度引数と同じ解釈です。
2番目の引数はクロマC (「色の量」を大まかに表す)。 最小値は0で、 最大値は理論上は制限されません (実用上は230を超えません)。 負の値は解析時に0に丸められます。
3番目の引数は色相角Hです。 <hue>引数やhsl()と類似の解釈ですが、 CIE LCHは知覚的均一性で均等になるため RGBの色相角とは一致しません。 0degは正のa軸(赤紫方向)で、 360degや720degも同じ方向です。 90degは正のb軸(マスタードイエロー方向)、 180degは負のa軸(シアン方向)、 270degは負のb軸(空色方向)です。
4番目の引数として、スラッシュで区切られたオプションの<alpha-value>成分があります。 これはアルファ成分を表します。
LCH色のクロマが0%の場合、 色相成分は無効です。 LCH色の明度(丸め後)が0%または100%の場合、 ディスプレイへのガマットマッピングにより、それぞれ黒または白で表示されます。
lch ( 29.2345 % 44.2 27 ); lch ( 52.2345 % 72.2 56.2 ); lch ( 60.2345 59.2 95.2 ); lch ( 62.2345 % 59.2 126.2 ); lch ( 67.5345 % 42.5 258.2 ); lch ( 29.69 % 45.553 % 327.1 )
labやlchは勧告案の新機能であり、Web互換性の問題はありません。 したがってlab()やlch()は、引数をカンマ区切りするレガシーカラー構文をサポートしません。 これらの関数内でカンマを使用するとエラーとなります。
9.4. OklabおよびOKLChの指定:oklab() と oklch() 関数表記
CSSではOklabおよびOKLChで色を直接表現できます。
oklab () =oklab ( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ /[ <alpha-value> | none] ] ?)
パーセンテージ | L、a、bで使用可能 |
---|---|
パーセント参照範囲 | L: 0% = 0.0, 100% = 1.0 a, b: -100% = -0.4, 100% = 0.4 |
テスト
- oklab-001.html (ライブテスト) (ソース)
- oklab-002.html (ライブテスト) (ソース)
- oklab-003.html (ライブテスト) (ソース)
- oklab-004.html (ライブテスト) (ソース)
- oklab-005.html (ライブテスト) (ソース)
- oklab-006.html (ライブテスト) (ソース)
- oklab-007.html (ライブテスト) (ソース)
- oklab-008.html (ライブテスト) (ソース)
- oklab-009.html (ライブテスト) (ソース)
- oklab-l-almost-0.html (ライブテスト) (ソース)
- oklab-l-almost-1.html (ライブテスト) (ソース)
- oklab-l-over-1-1.html (ライブテスト) (ソース)
- oklab-l-over-1-2.html (ライブテスト) (ソース)
- color-valid.html (ライブテスト) (ソース)
Oklabでは、最初の引数がOklabの明度を指定します。 これは0%または0から 100%または1.0までの数値です。
0%または0.0未満の値は解析時に0%に丸められます。 100%または1.0より大きい値は解析時に100%に丸められます。
2番目と3番目の引数はOklab色空間の「a」「b」軸方向の距離です(前節参照)。 これらは符号付き(正・負どちらも可)で、理論上は制限されません (実際は±0.5を超えません)。
4番目の引数として、スラッシュで区切られたオプションの<alpha-value>成分があります。 これはアルファ成分を表します。
Oklab色の明度が0%または0、 100%または1.0の場合、 ディスプレイへのガマットマッピングにより、それぞれ黒または白で表示されます。
oklab ( 40.101 % 0.1147 0.0453 ); oklab ( 59.686 % 0.1009 0.1192 ); oklab ( 0.65125 -0.0320 0.1274 ); oklab ( 66.016 % -0.1084 0.1114 ); oklab ( 72.322 % -0.0465 -0.1150 ); oklab ( 42.1 % 41 % -25 % )
oklch () =oklch ( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ /[ <alpha-value> | none] ] ?)
パーセンテージ | L、Cで使用可能 |
---|---|
パーセント参照範囲 | L: 0% = 0.0, 100% = 1.0 C: 0% = 0.0 100% = 0.4 |
無効色相 ε | C <= 0.000004 |
テスト
- oklch-001.html (ライブテスト) (ソース)
- oklch-002.html (ライブテスト) (ソース)
- oklch-003.html (ライブテスト) (ソース)
- oklch-004.html (ライブテスト) (ソース)
- oklch-005.html (ライブテスト) (ソース)
- oklch-006.html (ライブテスト) (ソース)
- oklch-007.html (ライブテスト) (ソース)
- oklch-008.html (ライブテスト) (ソース)
- oklch-009.html (ライブテスト) (ソース)
- oklch-010.html (ライブテスト) (ソース)
- oklch-011.html (ライブテスト) (ソース)
- oklch-l-almost-0.html (ライブテスト) (ソース)
- oklch-l-almost-1.html (ライブテスト) (ソース)
- oklch-l-over-1-1.html (ライブテスト) (ソース)
- oklch-l-over-1-2.html (ライブテスト) (ソース)
- color-valid.html (ライブテスト) (ソース)
OKLChでは、最初の引数がOKLChの明度Lを指定し、 oklab() の明度引数と同じ解釈です。
2番目の引数はクロマCです。 最小値は0で、 最大値は理論上は制限されません (実用上は0.5を超えません)。 負の値は解析時に0に丸められます。
3番目の引数は色相角Hです。 <hue>引数やhsl()、lch()と類似ですが、 RGBやLCHの色相角とは一致しません。0degは正のa軸(赤紫方向)で、 360degや720degも同じ方向です。 90degは正のb軸(マスタードイエロー方向)、 180degは負のa軸(シアン方向)、 270degは負のb軸(空色方向)です。
4番目の引数として、スラッシュで区切られたオプションの<alpha-value>成分があります。 これはアルファ成分を表します。
OKLCh色のクロマが0%または0の場合、 色相成分は無効です。 OKLCh色の明度が0%または0、 100%または1.0の場合、 ディスプレイへのガマットマッピングにより、それぞれ黒または白で表示されます。
oklch ( 40.101 % 0.12332 21.555 ); oklch ( 59.686 % 0.15619 49.7694 ); oklch ( 0.65125 0.13138 104.097 ); oklch ( 0.66016 0.15546 134.231 ); oklch ( 72.322 % 0.12403 247.996 ); oklch ( 42.1 % 48.25 % 328.4 )
oklabやoklchは勧告案の新機能であり、Web互換性の問題はありません。 したがってoklab()やoklch()は、引数をカンマ区切りするレガシーカラー構文をサポートしません。 これらの関数内でカンマを使用するとエラーとなります。
9.5. LabやOklab色をLCHやOKLCh色に変換する
極座標形への変換は簡単です:
- C = sqrt(a^2 + b^2)
- if (C > epsilon) H = atan2(b, a)、それ以外はHは欠落
- Lは同じ
aとbが非常に小さい値(ほぼゼロのクロマ)の場合、 視覚的な色はニュートラル軸上から変化しませんが、 値がわずかに変化するだけで報告される色相角が大きく揺れ、 ほぼランダムになります。 CSSではこの色相は無効となり、 LCHやOKLChに変換された際は欠落として扱われます。 CSS以外の文脈ではNaNなど欠落値として反映されることもあります。
9.6. LCHやOKLCh色をLabやOklab色に変換する
直交座標形への変換は簡単です:
- Hが欠落の場合、a = b = 0
-
それ以外は、
- a = C cos(H)
- b = C sin(H)
- Lは同じ
10. 定義済み色空間
CSSは複数の定義済み色空間を提供しています。 例えば、display-p3 [Display-P3]は勧告案の広色域モニターで典型的な広色域空間であり、 prophoto-rgbは写真家に広く使われています。 また、rec2020 [Rec.2020]は放送業界標準の超広色域空間で、ほぼすべての現実世界の可視色を表現できます。
10.1. 定義済み色の指定:color() 関数
color() 関数は、 特定の色空間(他の色関数は暗黙のsRGB色空間)で色を指定できます。 構文は以下の通りです:
color () =color ( <colorspace-params>[ /[ <alpha-value> | none] ] ?) <colorspace-params> =[ <predefined-rgb-params> | <xyz-params>] <predefined-rgb-params> = <predefined-rgb>[ <number> | <percentage> | none] { 3 } <predefined-rgb> = srgb | srgb-linear | display-p3 | a98-rgb | prophoto-rgb | rec2020 <xyz-params> = <xyz-space>[ <number> | <percentage> | none] { 3 } <xyz-space> = xyz | xyz-d50 | xyz-d65
テスト
color関数は、明示的にリストされた色空間で色のパラメータを指定します。
パラメータの形式は以下の通りです:
-
<ident>は 定義済み色空間のいずれか(例:display-p3) 個々の定義済み色空間は、<number>や<percentage> あるいは両方の使用可否を個別に制限する場合があります。
-
色空間が取る3つのパラメータ値(RGBまたはXYZ値)。
ガマット外色は成分値が 0や0%未満、1や100%超です。 これらは無効ではなく、中間計算のため保持されます。 ただし表示時にはcssガマットマッピングにより色空間(ディスプレイ空間)で 0/0%~1/100%に収まるよう相対色域マッピングで値が調整されます(actual-value時)。
-
スラッシュ区切りのオプションの<alpha-value>
color()は 勧告案の新機能であり、Web互換性の問題はありません。 したがってcolor()は、引数をカンマ区切りするレガシーカラー構文をサポートしません。 この関数内でカンマを使うとエラーとなります。
指定した色が表示できる場合 (無効色でもガマット外でもない場合)、 それがcolor()関数のactual valueとなります。
指定した色が 有効色だが表示できない場合、 actual valueは指定色のcssガマットマッピング後の値となります。
color ( rec20200.42053 0.979780 0.00579 );
LCHではこの色は
lch ( 86.6146 % 160.0000 136.0088 );
display-p3ではこの色は
color ( display-p3-0.6112 1.0079 -0.2192 );
であり、display-p3ではガマット外です (赤と青が負、緑が1超)。 display-p3画面を持っている場合、この色は:
- 有効
- ガマット内(rec.2020では)
- ガマット外(自分の画面では)
- よって表示できません
color ( profoto-rgb0.4835 0.9167 0.2188 )
10. 定義済みsRGB色空間:sRGB キーワード
sRGB 定義済み色空間は 以下に定義されており、 レガシーsRGB色(rgb()など)で使われるものと同一です。
- srgb
-
srgb
[SRGB]
色空間は3つの数値パラメータを受け取り、
色の赤・緑・青成分を表します。
ガマット内色は3成分とも[0, 1]の範囲です。
ホワイトポイントはD65です。
[SRGB] では「エンコーディング」と「典型」の2つの視聴条件を規定しています。[ICC]は色変換や最適視聴には「エンコーディング」条件の値(下記表)を推奨しています。
sRGBはCSSのデフォルト色空間であり、 レガシー色関数すべてに使われます。
特徴は次の通りです:
x y 赤色度 0.640 0.330 緑色度 0.300 0.600 青色度 0.150 0.060 白色度 D65 伝達関数 下記参照 白輝度 80.0 cd/m2 黒輝度 0.20 cd/m2 画像状態 display-referred(ディスプレイ基準) パーセンテージ R, G, Bで使用可能 パーセント参照範囲 R,G,B: 0% = 0.0, 100% = 1.0 let sign= c< 0 ? - 1 : 1 ; let abs= Math. abs( c); if ( abs<= 0.04045 ) { cl= c/ 12.92 ; } else { cl= sign* ( Math. pow(( abs+ 0.055 ) / 1.055 , 2.4 )); } cはガンマエンコードされたR, G, B成分です。 clは対応する線形光成分です。
LCHで可視化したsRGB色空間。基本色と補色を示す。
テスト
10.3. 定義済み線形光sRGB色空間:srgb-linear キーワード
sRGB-linear 定義済み色空間は srgb と同じですが、 伝達関数が線形光(ガンマエンコードなし)です。
- srgb-linear
-
srgb-linear [SRGB]
色空間は3つの数値パラメータを受け取り、
色の赤・緑・青成分を表します。
ガマット内色は3成分とも[0, 1]の範囲です。
ホワイトポイントはD65です。
特徴は次の通りです:
x y 赤色度 0.640 0.330 緑色度 0.300 0.600 青色度 0.150 0.060 白色度 D65 伝達関数 恒等(unity)、下記参照 白輝度 80.0 cd/m2 黒輝度 0.20 cd/m2 画像状態 display-referred(ディスプレイ基準) パーセンテージ R, G, Bで使用可能 パーセント参照範囲 R,G,B: 0% = 0.0, 100% = 1.0 cl
= c; cは赤・緑・青成分。 clは対応する線形光成分で、同じ値です。
バンディング(階調の縞模様)を防ぐため、srgb-linearは srgb-linear の方が srgb よりも高い精度が必要です。
テスト
10.4. 定義済みDisplay P3色空間:display-p3 キーワード
- display-p3
-
display-p3 [Display-P3] 色空間は3つの数値パラメータを受け取り、
色の赤・緑・青成分を表します。
ガマット内色は3成分とも[0, 1]の範囲です。
[DCI-P3]と同じ主色度を使いますが、
ホワイトポイントはD65であり、伝達曲線はsRGBと同じです。
現代のディスプレイ、テレビ、ノートPCやスマートフォンの画面は display-p3のガマットをすべて、またはほぼすべて表示できます。
特徴は次の通りです:
x y 赤色度 0.680 0.320 緑色度 0.265 0.690 青色度 0.150 0.060 白色度 D65 伝達関数 srgbと同じ 白輝度 80.0 cd/m2 黒輝度 0.80 cd/m2 画像状態 display-referred(ディスプレイ基準) パーセンテージ R, G, Bで使用可能 パーセント参照範囲 R,G,B: 0% = 0.0, 100% = 1.0 LCHで可視化したP3色空間。 基本色と補色を表示(ただしsRGBで、正しい色ではありません)。 比較のため、sRGBの基本色・補色も破線の円として表示。 P3の基本色はより高いクロマを持つ。
テスト
- predefined-005.html (ライブテスト) (ソース)
- predefined-006.html (ライブテスト) (ソース)
- display-p3-001.html (ライブテスト) (ソース)
- display-p3-002.html (ライブテスト) (ソース)
- display-p3-003.html (ライブテスト) (ソース)
- display-p3-004.html (ライブテスト) (ソース)
- display-p3-005.html (ライブテスト) (ソース)
- display-p3-006.html (ライブテスト) (ソース)
- 2d.color.space.p3.fillText.html (ライブテスト) (ソース)
- 2d.color.space.p3.fillText.shadow.html (ライブテスト) (ソース)
- 2d.color.space.p3.strokeText.html (ライブテスト) (ソース)
- 2d.color.space.p3.to.p3.html (ライブテスト) (ソース)
- 2d.color.space.p3.to.srgb.html (ライブテスト) (ソース)
- 2d.color.space.p3.toBlob.p3.canvas.html (ライブテスト) (ソース)
- 2d.color.space.p3.toBlob.with.putImageData.html (ライブテスト) (ソース)
- 2d.color.space.p3.toDataURL.jpeg.p3.canvas.html (ライブテスト) (ソース)
- 2d.color.space.p3.toDataURL.p3.canvas.html (ライブテスト) (ソース)
- 2d.color.space.p3.toDataURL.with.putImageData.html (ライブテスト) (ソース)
10.5. 定義済みA98 RGB色空間:a98-rgb キーワード
- a98-rgb
-
a98-rgb 色空間は3つの数値パラメータを受け取り、
色の赤・緑・青成分を表します。
ガマット内色は3成分とも[0, 1]の範囲です。
伝達曲線はガンマ関数で、1/2.2に近いが正確ではありません。
特徴は次の通りです:
x y 赤色度 0.6400 0.3300 緑色度 0.2100 0.7100 青色度 0.1500 0.0600 白色度 D65 伝達関数 256/563 白輝度 160.0 cd/m2 黒輝度 0.5557 cd/m2 画像状態 display-referred(ディスプレイ基準) パーセンテージ R, G, Bで使用可能 パーセント参照範囲 R,G,B: 0% = 0.0, 100% = 1.0 LCHで可視化したA98色空間。 基本色と補色を表示(ただしsRGBで、正しい色ではありません)。 比較のため、sRGBの基本色・補色も破線の円として表示。 a98の基本色はとくに黄色・緑・シアンが高いクロマとなる。
テスト
10.6. 定義済みProPhoto RGB色空間:prophoto-rgb キーワード
- prophoto-rgb
-
prophoto-rgb 色空間は3つの数値パラメータを受け取り、
色の赤・緑・青成分を表します。
ガマット内色は3成分とも[0, 1]の範囲です。
伝達曲線は
1/1.8のガンマ関数で、黒付近には小さな線形部分があります。
ホワイトポイントはD50で、CIE Labと同じです。よって、
CIE Labへの変換にクロマティックアダプテーションは不要です。
ProPhoto RGB空間は、物理的に実現不可能な超高彩度の主色を使っています。 これは広い色域と、特にトーン操作時の色相シフトを最小にするために選ばれました。 デジタル写真でアーカイブ用の広色域色空間としてよく用いられます。prophoto-rgb色空間により、CSSで同じRGB値を持つ画像の色に一致する色を指定できます。
ProPhoto RGBは元々Kodakが開発し、 [Wolfe]に記載されています。 ISOで[ROMM],[ROMM-RGB]として標準化されました。
白輝度は範囲で示され、 視聴フレア(黒輝度)はその0.5%~1.0%です。
特徴は次の通りです:
x y 赤色度 0.734699 0.265301 緑色度 0.159597 0.840403 青色度 0.036598 0.000105 白色度 D50 伝達関数 下記参照 白輝度 160.0~640.0 cd/m2 黒輝度 本文参照 画像状態 display-referred(ディスプレイ基準) パーセンテージ R, G, Bで使用可能 パーセント参照範囲 R,G,B: 0% = 0.0, 100% = 1.0 const E= 16 / 512 ; let sign= c< 0 ? - 1 : 1 ; let abs= Math. abs( c); if ( abs<= E) { cl= c/ 16 ; } else { cl= sign* Math. pow( c, 1.8 ); } cはガンマエンコードされたR, G, B成分です。 clは対応する線形光成分です。
LCHで可視化したprophoto-rgb色空間。基本色と補色を表示(ただしsRGBで、正しい色ではありません)。 比較のため、sRGBの基本色・補色も破線の円として表示。 prophoto-rgbの基本色・補色は非常に高いクロマを持ちますが、 この超広色域の多くは物理的に実現可能な色とは限りません。
テスト
10.7. 定義済みITU-R BT.2020-2色空間:rec2020 キーワード
- rec2020
-
rec2020 [Rec.2020]
色空間は3つの数値パラメータを受け取り、
色の赤・緑・青成分を表します。
ガマット内色は3成分とも[0, 1]の範囲です(ビデオ用語で「フルレンジ」)。
ITU Reference 2020は
超高精細、4K・8Kテレビで使われます。
主色は物理的に実現可能ですが、 スペクトル軌跡に非常に近いため実現は難しいです。
現行ディスプレイはrec2020の全ガマット再現はできません。 技術進歩とともにカバレッジ拡大が期待されます。
特徴は次の通りです:
x y 赤色度 0.708 0.292 緑色度 0.170 0.797 青色度 0.131 0.046 白色度 D65 伝達関数 下記参照([Rec.2020] 表4) 画像状態 display-referred(ディスプレイ基準) パーセンテージ R, G, Bで使用可能 パーセント参照範囲 R,G,B: 0% = 0.0, 100% = 1.0 const α= 1.09929682680944 ; const β= 0.018053968510807 ; let sign= c< 0 ? - 1 : 1 ; let abs= Math. abs( c); if ( abs< β* 4.5 ) { cl= c/ 4.5 ; } else { cl= sign* ( Math. pow(( abs+ α- 1 ) / α, 1 / 0.45 )); } cはガンマエンコードされたR, G, B成分です。 clは対応する線形光成分です。
LCHで可視化したrec2020色空間。基本色と補色を表示(ただしsRGBで、正しい色ではありません)。 比較のため、sRGBの基本色・補色も破線の円として表示。 rec2020の基本色は非常に高いクロマを持つ。
テスト
10.8. 定義済みCIE XYZ色空間:xyz-d50、xyz-d65、 xyz キーワード
- xyz-d50、xyz-d65、xyz
-
xyz
色空間は3つの数値パラメータを受け取り、
X,Y,Z値を表します。
これはCIE XYZ[COLORIMETRY]色空間を表し、
拡散白が輝度(Y)1.0となるようスケールされます。
必要に応じて、参照白に対してクロマティックアダプテーションされます。
xyz-d50の参照白はD50、 xyz-d65およびxyzの参照白はD65です。
1.0/100%を超える値も許容され、丸めてはなりません。 Yが1.0を超える色は拡散白より明るい色を表します。 0/0%未満の値はまれですが、クロマティックアダプテーションの結果として現れることがあり、同様に丸めてはなりません。
特徴は次の通りです:
パーセンテージ X,Y,Zで使用可能 パーセント参照範囲 X,Y,Z: 0% = 0.0, 100% = 1.0
テスト
- predefined-016.html (ライブテスト) (ソース)
- xyz-001.html (ライブテスト) (ソース)
- xyz-002.html (ライブテスト) (ソース)
- xyz-003.html (ライブテスト) (ソース)
- xyz-004.html (ライブテスト) (ソース)
- xyz-005.html (ライブテスト) (ソース)
- xyz-d50-001.html (ライブテスト) (ソース)
- xyz-d50-002.html (ライブテスト) (ソース)
- xyz-d50-003.html (ライブテスト) (ソース)
- xyz-d50-004.html (ライブテスト) (ソース)
- xyz-d50-005.html (ライブテスト) (ソース)
- xyz-d65-001.html (ライブテスト) (ソース)
- xyz-d65-002.html (ライブテスト) (ソース)
- xyz-d65-003.html (ライブテスト) (ソース)
- xyz-d65-004.html (ライブテスト) (ソース)
- xyz-d65-005.html (ライブテスト) (ソース)
- color-valid.html (ライブテスト) (ソース)
10.9. 定義済み色空間からLabやOklabへの変換
すべての定義済みRGB色空間について、 Labへの変換には複数ステップが必要ですが、実際は最初以外のステップは線形計算でまとめられます。
- ガンマエンコードされたRGBから線形光RGBへ変換(ガンマ解除)
- 線形RGBからCIE XYZへ変換
- 必要ならD65ホワイトポイント (sRGB、display-p3、a98-rgb、 rec2020で使用) をLabが使うD50ホワイトポイントに 線形Bradford変換で合わせる。prophoto-rgbは最初からD50ホワイトポイント。
- D50適応XYZからLabへ変換
Oklabへの変換も同様ですが、 クロマティックアダプテーションは prophoto-rgbのみ必要です。
- ガンマエンコードされたRGBから線形光RGBへ変換(ガンマ解除)
- 線形RGBからCIE XYZへ変換
- 必要ならD50ホワイトポイント(prophoto-rgbで使用)をOklabが使うD65ホワイトポイントに 線形Bradford変換で合わせる。
- D65適応XYZからOklabへ変換
これら変換のサンプルJavaScriptコードは § 18 色変換のサンプルコードにあります。
10.10. LabやOklabから定義済みRGB色空間への変換
Labからdisplay-p3やrec2020などの定義済み空間への変換も 複数ステップが必要で、実際は最後以外のステップは線形計算でまとめられます。
- Labを(D50適応済み)XYZへ変換
- 必要ならLabが使うD50ホワイトポイントを D65ホワイトポイント(sRGBやほとんどのRGB空間で使用)に 線形Bradford変換で合わせる。prophoto-rgbは不要。
- (D65適応済み)CIE XYZから線形RGBへ変換
- 線形光RGBからRGBへ変換(ガンマエンコード)
Oklabからの変換も同様ですが、 クロマティックアダプテーションは prophoto-rgbのみ必要です。
- Oklabを(D65適応済み)XYZへ変換
- 必要ならOklabが使うD65ホワイトポイントを D50ホワイトポイント(prophoto-rgbで使用)に 線形Bradford変換で合わせる。
- (D65適応済み)CIE XYZから線形RGBへ変換
- 線形光RGBからRGBへ変換(ガンマエンコード)
これら変換のサンプルJavaScriptコードは § 18 色変換のサンプルコードにあります。
実装はこの手順以外の方法(ICCプロファイルの相対的色域レンダリングなど)でも、 ソース・宛先ガマット内の色で結果が一致する限り選択可能です。
10.11. 定義済みRGB色空間間の変換
定義済みRGB色空間間の変換も 複数ステップが必要で、 ホワイトポイントが異なる場合のみ必要なステップがあります。 srcからdestに変換する場合:
- ガンマエンコード済みsrcRGBから線形光srcRGBへ変換(ガンマ解除)
- 線形srcRGBからCIE XYZへ変換
- srcとdestでホワイトポイントが異なる場合、 XYZ値をsrcWhiteからdestWhiteへ 線形Bradford変換で合わせる。
- CIE XYZから線形destRGBへ変換
- 線形光destRGBからdestRGBへ変換(ガンマエンコード)
これら定義済みRGB色空間の変換サンプルJavaScriptコードは § 18 色変換のサンプルコードにあります。
10.12. シンプルなアルファ合成
描画時、実装は Compositing Level 1 §5.1 シンプルなアルファ合成([Compositing])の規則に従ってアルファを扱わなければなりません。
11. 色変換
テスト
このセクションは後続のアルゴリズムを示すもので、テストは不要です。
色はある色空間から別の色空間へ変換できます。 ガマットマッピングがなく、各色空間がガマット外色も表現できる場合 (RGB空間では伝達関数が拡張範囲でも定義されていること)、 (数値精度や丸め誤差に依存するものの) 二つの色は同じ見え方・同じ色感を表します。
ソース色空間srcのホワイトポイントsrc-whiteでの色col1を、 宛先色空間destのホワイトポイントdest-whiteでの色col2に変換する際の手順:
- もしsrcが円筒極座標色表現なら、 まずcol1を対応する直交座標色表現に変換し、 これを新しいcol1とする。欠落成分は0で埋める。
- もしsrcが線形光表現でない場合、 線形光に変換(ガンマ解除)し、新しいcol1とする。
- col1をCIE XYZ(ホワイトポイントsrc-white)に変換し、これをxyzとする。
- dest-whiteがsrc-whiteと異なる場合、 線形Bradford色順応変換でxyzをdest-whiteへ順応させ、 これを新しいxyzとする。
- もしdestが円筒極座標色表現なら、 dest-rectを対応する直交座標色表現とする。 それ以外はdest-rectをdestとする。
- xyzをdestへ変換し、 必要な伝達関数(ガンマエンコード)を適用してcol2を得る。
- もしdestがディスプレイのような物理的出力色空間なら、 col2はcssガマットマッピングされ、 表示可能な値となる。
- dest-rectがdestと異なる場合、 すなわちdestが円筒極座標色表現なら、 dest-rectからdestへ変換し、これをcol2とする。 この際欠落成分が生じることがある。
12. 色補間
色補間は、 グラデーション、 合成、 フィルター、 トランジション、 アニメーション、 色混合や色修正関数で発生します。
二つの<color>値間の補間は、次の手順で行われます:
- 二つの色の類似成分を確認し、持ち越しとする
- 指定した色空間へ変換 (以下、補間色空間と呼ぶ)。 どちらか一方または両方がすでに補間色空間の場合、 この変換で無効成分は欠落値になる
- (必要なら)変換後の色に持ち越し値を再挿入
- (必要なら)色相を補正(選択した<hue-interpolation-method>に応じて)
- 色成分をプリマルチプライド形式に変換
- 各色成分を個別に線形補間
- プリマルチプライドを解除
currentcolorとの補間も可能です。 この場合の数値はused valueが使われます。
12.1. 補間用色空間
CSSの様々な機能で色補間が必要です。
色の混合や合成は 使用する補間色空間によって結果が変わります。 そのため、補間用途ごとに適切な色空間が異なります。
-
物理的な光の混色結果が欲しい場合、 CIE XYZやsrgb-linear色空間が適しています。これらは光強度に対して線形です。
-
知覚的均等間隔が必要な場合(例:グラデーション)、 Oklab(および従来のLab)は知覚的均一性を持つよう設計されています。
-
混色でグレイアウトを避けたい、つまり補間中も最大限クロマを保ちたい場合は、 OKLCh(および従来のLCH)が有効です。
-
最後に、Web互換性が最重要な場合もあります。 sRGB色空間は線形光でも知覚的均一でもありませんが、 互換性維持のため選択されます(結果は暗すぎ・グレーがかりやすい)。
これら機能をまとめてホスト構文と呼びます。
ホスト構文が補間色空間を指示できるようにするため、 本仕様はcolor-interpolation-method生成規則を公開します。 本仕様自身では使いませんが、 他仕様が利用できるよう公開しています。例:CSS Images 4 § 3.1 線形グラデーション:linear-gradient()構文参照。
ホスト構文は 各ケースごとにデフォルトの補間色空間を定義し、 できれば作者がこのデフォルトを上書きできる構文も提供すべきです。 そのような構文がプロパティ値の一部であれば、color-interpolation-method生成規則を使うべきです。 これによりCSS全体で一貫性が保たれ、 色補間のカスタマイズがCSS全体に自動的に反映されます。
<color-space> = <rectangular-color-space> | <polar-color-space> <rectangular-color-space> = srgb | srgb-linear | display-p3 | a98-rgb | prophoto-rgb | rec2020 | lab | oklab | xyz | xyz-d50 | xyz-d65 <polar-color-space> = hsl | hwb | lch | oklch <hue-interpolation-method> =[ shorter | longer | increasing | decreasing] hue <color-interpolation-method> = in[ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>?]
<rectangular-color-space>と<polar-color-space>の定義で使われているキーワードは、 それぞれ対応する色空間を指します。 CSSでは同名の関数表記があればそれで、なければ<ident>として color() 関数内で表現します。
テスト
- gradients-with-transparent.html (ライブテスト) (ソース)
- gradient-eval-001.html (ライブテスト) (ソース)
- gradient-eval-002.html (ライブテスト) (ソース)
- gradient-eval-003.html (ライブテスト) (ソース)
- gradient-eval-004.html (ライブテスト) (ソース)
- gradient-eval-005.html (ライブテスト) (ソース)
- gradient-eval-006.html (ライブテスト) (ソース)
- gradient-eval-007.html (ライブテスト) (ソース)
- gradient-eval-008.html (ライブテスト) (ソース)
- gradient-eval-009.html (ライブテスト) (ソース)
- gradient-none-interpolation.html (ライブテスト) (ソース)
- legacy-color-gradient.html (ライブテスト) (ソース)
- oklab-gradient.html (ライブテスト) (ソース)
- srgb-gradient.html (ライブテスト) (ソース)
- srgb-linear-gradient.html (ライブテスト) (ソース)
- xyz-gradient.html (ライブテスト) (ソース)
- gradient-interpolation-method-valid.html (ライブテスト) (ソース)
- gradient-interpolation-method-invalid.html (ライブテスト) (ソース)
- gradient-interpolation-method-computed.html (ライブテスト) (ソース)
ホスト構文が補間すべき色空間を定義していない場合、 デフォルトはOklabとなります。
特定のケースでsRGBで補間したい作者は、 そのインスタンスでsRGBを補間色空間として明示指定することで 旧挙動に切り替えられます(例:特定のグラデーションのみなど)。
補間対象の色が補間色空間のガマット外の場合、 その色空間に変換されると範囲外値となります。
これらは切り捨て(クリップ)されず、そのまま補間されます。
12.2. 欠落成分を含む補間
二つの色を補間色空間に変換する過程で、 欠落成分は値0で置き換えられます。
したがって、色補間の第一段階は 入力色の欠落成分を分類し、 補間色空間の成分と比較することです。 欠落成分である類似成分が見つかった場合、 それらは持ち越しとして変換後の色に再挿入され、 プリマルチプライドと線形補間の前に行われます。
類似成分は以下の通り:
カテゴリ | 成分 |
---|---|
赤 | r,x |
緑 | g,y |
青 | b,z |
明度 | L |
鮮やかさ | C, S |
色相 | H |
対抗a | a |
対抗b | b |
アルファ | alpha |
注: この分類の目的では、 XYZ空間は超彩度RGB空間とみなします。 また、彩度Sは明度依存ですがここではクロマCと同カテゴリです。 HWBの白さ・黒さ成分には他色空間の類似成分はありません。
lch ( 50 % 0.02 none) color ( display-p30.7 0.5 none)
これらは変換後
oklch ( 56.897 % 0.0001 0 ) oklch ( 63.612 % 0.1522 78.748 )
持ち越し欠落成分を再挿入した補間色は:
oklch ( 56.897 % 0.0001 none) oklch ( 63.612 % 0.1522 78.748 )
持ち越し欠落成分を含む色と その成分が欠落していない色を補間する場合、 欠落成分は もう一方の色の成分値として扱います。
したがって、 持ち越し処理は無効成分処理の前に実施する必要があります。
oklch ( 78.3 % 0.108 326.5 ) oklch ( 39.2 % 0.4 none)
実際に補間される色は
oklch ( 78.3 % 0.108 326.5 ) oklch ( 39.2 % 0.4 326.5 )
であり、
とはなりません。oklch ( 78.3 % 0.108 326.5 ) oklch ( 39.2 % 0.4 0 )
持ち越し欠落成分がアルファの場合、 色はこの持ち越し値でプリマルチプライドされ、 色変換時の0値ではありません。
oklch ( 0.783 0.108 326.5 /0.5 ) oklch ( 0.392 0.4 0 / none)
実際に補間される色は
oklch ( 78.3 % 0.108 326.5 /0.5 ) oklch ( 39.2 % 0.4 0 /0.5 )
プリマルチプライドOKLCh値は [0.3915, 0.054, 326] と [0.196, 0.2, 0] となります。
両方の色が特定成分を欠落している場合、 補間後の色もその成分が欠落となります。
12.3. アルファを含む補間
補間対象の色が完全不透明でない場合、 以下のようにまずプリマルチプライドされます:
-
アルファ値がnoneの場合、プリマルチプライド値は元の値のまま。 それ以外の場合、
-
いずれかの成分値がnoneの場合、プリマルチプライド値もnone。
-
直交座標色では全成分値がアルファ値で乗算されます。
-
円筒極座標色では色相角は乗算されず、他の二軸のみ乗算されます。
プリマルチプライド値から色値を得るには:
-
補間後のアルファ値が0またはnoneの場合、 非プリマルチプライド値はプリマルチプライド値のまま。それ以外は、
-
いずれかの成分値がnoneの場合、 非プリマルチプライド値もnone。
-
それ以外は、プリマルチプライドされた各成分値を補間後アルファ値で割ります。
プリマルチプライドアルファはなぜ有用か?
プリマルチプライド表現で色を補間すると、 非プリマルチプライド表現よりも見栄えの良い遷移となることが多いです。 特に完全不透明から完全透明への遷移時に顕著です。
色や透明度のいずれか一方のみが一定の場合
(例:
(不透明な赤)と
(不透明な青)や、
(不透明な赤)と
(透明な赤)の補間は、プリマルチプライド・非プリマルチプライドいずれでも結果は同じです。
両端点で色と透明度の両方が異なる場合のみ違いが生じます。
linear-gradient ( 90 deg , red, transparent, blue)
プリマルチプライド色では、 transparentへの遷移は常に美しくなります:
一方、非プリマルチプライド空間で誤って補間すると、 グラデーション中央は明らかにグレーがかります。 これはtransparentがrgba(0,0,0,0)(透明な黒)であり、 赤は透明度が減るにつれ黒に、 青も同様です:
線形補間の中点は[23.4% 10.2% 38.8%]で、 アルファ値0.5でプリマルチプライド解除すると rgb(46.8% 20.4% 77.6% / 0.5) となります。
線形補間の中点は [29.4365% 25.776 3.554] で、アルファ値0.5時プリマルチプライド解除すると lab(58.873% 51.552 7.108) / 0.5) となります。
短い色相弧(デフォルト)で線形補間の中点は [29.4365% 40.563 31.82] で、アルファ値0.5時プリマルチプライド解除すると lch(58.873% 81.126 31.82) / 0.5) となります。
アルファのプリマルチプライド/解除のJavaScriptサンプルコードは § 18 色変換のサンプルコードにあります。
12.4. 色相補間
色相角(LCH、HSL、HWB等)を持つ色関数の補間には複数の方法があります。 360°を超える弧で補間することはほとんど望ましくないため、 補間前に色相角を調整し、 個別成分補間が360°未満、しばしば180°未満で行われるようにします。
ホスト構文は色相補間のアルゴリズムを以下から指定できます (以下の角度は度ですが、表現方法に関わらず論理は同じ)。 色相補間方針の指定は、<color-interpolation-method>構文の <hue-interpolation-method>トークンを通じて既に行えます。
指定がない場合、ホスト構文で明示的な色相補間アルゴリズムが選ばれていなければ、 デフォルトはshorterです。
注: 補足として、 補間対象の色が指定された補間色空間にまだなっていない場合、 変換により無効成分は欠落成分となります。
12.4.1. shorter
色相角は始点と終点間の短い弧で補間されます。
角度は θ₂ - θ₁ ∈ [-180, 180] となるよう調整します。疑似Javascript:
if( θ₂ - θ₁ >180 ) { θ₁ +=360 ; } else if( θ₂ - θ₁ <-180 ) { θ₂ +=360 ; }
12.4.2. longer
色相角は始点と終点間の長い弧で補間されます。
角度は θ₂ - θ₁ ∈ {(-360, -180], [180, 360)} となるよう調整します。疑似Javascript:
if( 0 < θ₂ - θ₁ <180 ) { θ₁ +=360 ; } else if( -180 < θ₂ - θ₁ <=0 ) { θ₂ +=360 ; }
12.4.3. increasing
色相角は、始点から終点まで増加し続けるように補間されます。 角度が360に達したら0にリセットし、 その後も増加し続けます。
二角度の差によってはshorterやlongerと同じ見え方になりますが、 もし片方の色相角がアニメーションして180度を越える場合でも、 補間は他方の弧へ切り替わりません。
ただし、二つ目の色相がアニメーションして oklch(0.7 0.1 230)になる場合、 補間の中点は(30 + 230) * 0.5 = 130度となり 同じ増加方向に進み、 別の緑色 oklch(0.6 0.1 130)となり、 アニメーション途中で対抗色には切り替わりません。
角度は θ₂ - θ₁ ∈ [0, 360) となるよう調整します。疑似Javascript:
if( θ₂ < θ₁) { θ₂ +=360 ; }
12.4.4. decreasing
色相角は、始点から終点まで減少し続けるように補間されます。 角度が0に達したら360にリセットし、 その後も減少し続けます。
二角度の差によってはshorterやlongerと同じ見え方になりますが、 もし片方の色相角がアニメーションして180度を越える場合でも、 補間は他方の弧へ切り替わりません。
ただし、二つ目の色相がアニメーションして oklch(0.7 0.1 230)になる場合、 補間の中点は(30 + 360 + 230) * 0.5 = 310度となり 同じ減少方向に進み、 別の紫色 oklch(0.6 0.1 310)となり、 アニメーション途中で対抗色には切り替わりません。
角度は θ₂ - θ₁ ∈ (-360, 0] となるよう調整します。疑似Javascript:
if( θ₁ < θ₂) { θ₁ +=360 ; }
13. ガマットマッピング
13.1. ガマットマッピング入門
注: このセクションは文書の他の箇所で記述されている具体的な要件の重要な前提を提供します。
このセクションは規範的ではありません
テスト
このセクションは規範的でないため、テストは不要です。
元の色空間の色を 別の、ガマットがより狭い宛先色空間に変換する際、 一部の色は宛先ガマット外になります。
中間的な色計算では これらガマット外値は保持されます。 しかし、宛先がディスプレイデバイス (画面やプリンター)の場合は ガマット外値をガマット内色に変換する必要があります。
ガマットマッピングとは、見た目の変化が最小限となるガマット内色を見つける処理です。
13.1.1. クリッピング
最も単純で、最も受け入れがたい方法は、 単に成分値を表示可能範囲に切り詰めることです。 これはRGBディスプレイでは 三原色の比率が変化し、 色相シフトが生じます。
color ( srgb-linear 0.5 1 3 )
を考えます。
これは線形光色空間なので、
三成分の強度比較ができます。
青光は緑の3倍、
赤光は緑の半分です。
赤の6倍の青成分になります。
OKLChではこの色相角は265.1°
これをsRGBガマット内にクリップすると、
となり、
青と緑の光量が等しくなります。
OKLChの色相角は196.1°、
69°もの大きな変化となります。
13.1.2. 最も近い色(MINDE)
より良い方法は、 知覚的均一色空間で ガマット内の最も近い色(最小ΔE、MINDE)を探すことです。 この手法の成否は ガマットマッピング色空間の均一性や deltaE関数の予測精度に左右されます。
しかしガマットマッピング時、 色相の変化は特に好ましくありません。 クロマの変化はまだ受け入れやすく、 明度の小さな変化も許容範囲です (クロマ減少が大きくなる場合は特に)。 MINDEは各次元の変化を均等に重み付けするため、 最適な結果にはなりません。
13.1.3. クロマ減少
MINDEアルゴリズムを改善するため、 知覚的均一な極座標色空間で 色相を固定し、 クロマを減らして色がガマット内になるまで調整します。
color ( display-p3 1 1 0 )
をsRGBディスプレイにマッピングする場合。
ガマットマッピング色空間はOKLChです。
color ( display-p31 1 0 )
は
color ( srgb1 1 -0.3463 )
であり
color ( oklch0.96476 0.24503 110.23 )
クロマ成分を徐々に減らして sRGBガマット内(成分が負や1超にならない)になると ガマットマッピング色が得られます。
color ( oklch0.96476 0.21094 110.23 )
これは
color ( srgb0.99116 0.99733 0.00001 )
実装では線形減少より高速に収束させるため、 二分探索や、 色相・明度一定の直線とガマット境界の幾何学的交点計算を用いる場合があります。
13.1.4. 過度なクロマ減少
この単純な手法は、特定の色、主に非常に明るい黄色やシアンなどで ガマット境界の上端が浅い、またはやや凹んでいる場合に 最適でない結果、過度のクロマ減少となることがあります。
選択する色空間によって、ガマットマッピング色の受容性が変わります。
color ( display-p3 1 1 0
)
をCIE LCH色空間でクロマを徐々に減らす場合。
color ( display-p3 1 1 0
)
を今回はOKLCh色空間でクロマを徐々に減らす場合。
13.1.5. 局所クリップ付きクロマ減少
単純なクロマ減少アルゴリズムの改良として: 各ステップで、現在のマッピング色と そのクリップ版の色との差を計算します。 現在の色がガマット外でも、 クリップ版との色差が知覚できる差(JND)の閾値未満なら、 クリップ版色をマッピング結果として返します。 実質的には各段階でMINDEマッピングしますが、 色相・明度変化は極めて小さく、 知覚できません。
color ( display-p3 1 1 0
)
をCIE LCH色空間でクロマ減少&局所クリップする場合。
color ( display-p3 1 1 0
)
を今回はOKLCh色空間&局所クリップでクロマ減少する場合。
13.1.6. 知覚的均一性からの逸脱:色相カーブ
CIE LCH色空間+deltaE2000距離測定では 270°~330°の色相範囲で かなりの色相シフトが生じ、 最適でない結果となることが知られています。

OKLCh色空間+deltaEOK距離測定は この問題を全色相角で回避します。

13.2. CSSガマットマッピング(RGB宛先への)
テスト
色のactual valueはスクリプトから参照できず、自動テストが困難です。
CSSガマットマッピングアルゴリズムは、 個々の標準ダイナミックレンジ(SDR)CSS色で RGBディスプレイのガマット外となり cssガマットマッピングが必要な場合に適用されます。
これは相対的な色域基準インテントを実装し、 宛先ガマット内の色は変更されません。
注: 他の状況、特にプリンターガマットへのマッピングでは 最大黒レベルが0より大幅に高いため、 黒・白ポイントの整合が必要となり、 クロマが減ると明度も変化します。
注: このアルゴリズムは個々の色用です。 色画像のように隣接ピクセル間の関係や 細部・質感の保持が重要な場合は 知覚的レンダリングインテントが適しており、 その場合はガマット内の色も変更されることがあります。
CSSガマットマッピングはOKLCh色空間で行われ、 色差式はdeltaEOKを用います。 local-MINDE改良も使われます。
明度軸が範囲外の色については、 明度が1.0以上なら宛先色空間で白、 0.0以下なら宛先色空間で黒を返します。
二分探索実装では、 毎ステップで現在のマッピング色とそのクリップ版のdeltaEOKを計算します。 現在の色がガマット境界外にあり、 クリップ版とのdeltaEOKが知覚可能差(JND)閾値未満なら、 クリップ版色をマッピング結果として返します。
幾何学的実装では、 交点を見つけたら 明度一定の線上でクロマを増やしつつ外側へ投影し、 以下いずれかで終了します:
-
投影点とそのクリップ版のdeltaEOKがJND超となる、または
-
投影点のクロマが元の色のクロマと等しくなる(元の色を超えて投影しない)
その後クリップ版色をマッピング結果として返します。
OKLCh色空間では JNDはOKLCh差で0.02です。
注: CIE Lab色空間(明度0〜100)+deltaE2000では JNDは2です。 OklabやOKLCh(明度0〜1)+deltaEOKでは JNDは100分の1になります。
13.2.1. 二分探索ガマットマッピングアルゴリズム(local MINDE付き)の疑似コード例
- もしdestinationがガマット制限を持たない場合(XYZ-D65, XYZ-D50, Lab, LCH, Oklab, OKLCh)、originをdestinationに変換してガマットマッピング色として返す
- origin_OKLChをorigin color spaceからOKLCh色空間に変換
- origin_OKLChの明度が100%以上なら、`oklab(1 0 0 / origin.alpha)`をdestinationに変換してガマットマッピング色として返す
- origin_OKLChの明度が0%以下なら、`oklab(0 0 0 / origin.alpha)`をdestinationに変換してガマットマッピング色として返す
- inGamut(color)関数は、その色がdestinationガマット内ならtrueを返す。HSLやHWBの場合はsRGBガマット内か判定。
- inGamut(origin_OKLCh)がtrueなら、origin_OKLChをdestinationに変換して返す
- それ以外の場合、delta(one, two)関数は色oneとtwoのdeltaEOKを返す
- JNDを0.02とする
- epsilonを0.0001とする
- clip(color)関数はcolorをdestinationに変換し、各成分を基準範囲内に丸めて返す
- currentにorigin_OKLChをセット
- clippedにclip(current)をセット
- Eにdelta(clipped, current)をセット
-
E < JNDなら
- clippedをガマットマッピング色として返す
- minを0にセット
- maxをorigin_OKLChのOKLChクロマにセット
- min_inGamutはminがガマット内かの真偽値で、trueで初期化
-
(max - min > epsilon)の間、次を繰り返す
- chroma = (min + max) /2
- currentのクロマ成分をchromaに設定
- min_inGamutがtrueかつinGamut(current)がtrueならmin = chromaとして繰り返し
-
それ以外は以下を実施:
- clipped = clip(current)
- E = delta(clipped, current)
-
E < JNDなら
- (JND - E < epsilon)ならclippedをガマットマッピング色として返す
-
それ以外は
- min_inGamut = false
- min = chroma
- それ以外はmax = chromaとして繰り返し
- clippedをガマットマッピング色として返す
14. <color>値の解決
特定のプロパティに別途指定がない限り、指定された色は、算出色に解決され、さらに使用 色へと下記のように解決されます。
テスト
14.1. sRGB値の解決
これは以下に適用されます:
以下には適用されません:
-
color()値のうち、srgbやsrgb-linear 色空間を使うもの。
著者が明示的に名前付き色やシステム色としてsRGB色を指定した場合、 宣言値はその名前付き色・システム色をASCII小文字に変換したものとなります。 算出値および使用値は対応するsRGB色となり、 指定アルファ成分([0, 1]に丸めたもの)と組み合わせ、 未指定の場合は不透明がデフォルトとなります。
それ以外の場合、宣言値・算出値・使用値は 対応するsRGB色と指定アルファ成分([0, 1]に丸め、不指定なら不透明)との組み合わせです。
歴史的経緯により、sRGB色でcalc()が単一値に解決される場合、 宣言値は"calc(" ")"ラッパーなしで直列化されます。
また歴史的経緯により、 calc()が単一値に簡約されると 色値は[0.0, 255.0]に丸められます。
この丸めはInfinity、-Infinity、NaNなども それぞれ255, 0, 0に丸めます。
テスト
14.2. LabとLCH値の解決
宣言値・算出値・使用値は 対応するCIE LabまたはLCH色 (L, C, Hの丸め後) と指定アルファ成分の組み合わせ (<number>型。<percentage>型ではない。不指定なら不透明がデフォルト)。
14.3. OklabとOKLCh値の解決
宣言値・算出値・使用値は 対応するOklabまたはOKLCh色 (L, C, Hの丸め後) と指定アルファ成分の組み合わせ (<number>型。<percentage>型ではない。不指定なら不透明がデフォルト)。
14.4. color()関数値の解決
宣言値・算出値・使用値は 指定色空間の色 と指定アルファ成分の組み合わせ (<number>型。<percentage>型ではない。不指定なら不透明がデフォルト)。
xyz 色空間で指定された色の場合、 これはxyz-d65 色空間のエイリアスなので、 算出値・使用値はxyz-d65 色空間で表されます。
14.5. その他の色の解決
これはシステム色(<deprecated-color>含む)、transparent、 currentcolorに適用されます。
各<system-color>キーワードおよび<deprecated-color>キーワードの宣言値はそのもの。 算出値は対応する色空間の色です。 ただし、これらの色は「強制色モード」で変更されてはなりません。
< button style = "color: ButtonText; background: ButtonFace" ></ button >
colorプロパティの宣言値は"ButtonText"、 算出値は例えば rgb(0, 0, 0)となります。
transparentの宣言値は"transparent"、 算出値・使用値は透明な黒となります。
currentcolorキーワードの算出値は自身です。
colorプロパティの場合、 currentcolorの使用値は 解決された継承値です。 他プロパティの場合、 使用値は同じ要素のcolorプロパティの使用値となります。
注: つまりcurrentcolor値を継承する場合、 キーワードとして継承され、 colorプロパティの値として継承されるわけではないので、 子孫要素は自身のcolorプロパティで解決します。
< div > < p > このサンプルテキストが複数行に折り返すと仮定します。</ p > </ div >
css:
div{ color : forestgreen; text-shadow : currentColor; } p{ color : mediumseagreen; } p::firstline{ color : yellowgreen; }
最初の行フラグメントのtext-shadowプロパティの使用値はyellowgreenとなります。
テスト
15. <color>値のシリアル化
このセクションはCSSオブジェクトモデルの CSS値のシリアル化のうち、 <color>値のシリアル化に関する部分を更新・置き換えます。
このセクションで仕様に使用される文字列と対応する文字は以下の通りです。
文字列 | 文字 |
---|---|
" " | U+0020 スペース |
"#" | U+0023 ナンバー記号 |
"," | U+002C コンマ |
"-" | U+002D ハイフンマイナス |
"." | U+002E ピリオド |
"/" | U+002F スラッシュ |
"none" | U+006E ラテン小文字N U+006F ラテン小文字O U+006E ラテン小文字N U+0065 ラテン小文字E |
文字列 "." は小数点区切りとして使用し、ロケールに関係なく千位区切りは使用しません。
構文形式が欠落色成分をサポートする場合、 none(NONE, nOnEなども等価)は 全て小文字"none"でシリアル化します。
15.1. アルファ値のシリアル化
これは任意の<color>値で、オプションのアルファ値を持つものに適用されます。 opacityプロパティには適用されません。
アルファが[0, 1]に丸められた後で1であれば、 シリアル化時には省略します。暗黙の値1(完全不透明)がデフォルトです。
アルファが1以外なら、下記のように明示的にシリアル化されます。
値が0~255の整数(8ビット符号なし整数)で内部表現されている場合、次の手順に従います:
- alphaをその整数値とする。
- 0~100の整数で、2.55倍して四捨五入(同値の場合は切り上げ)した結果がalphaになるものがあれば、その整数を100で割ったものをroundedとする。
- なければ、alphaを0.255で割って四捨五入(同値の場合は切り上げ)し、1000で割ったものをroundedとする。
- roundedを<number>としてシリアル化した結果を返す。
その他の場合は、与えられた値を <number>としてシリアル化して返します(<percentage>ではない)。
例: アルファが8ビット整数237なら、整数93が条件を満たし Math.round(93 * 2.55)は237なので、 シリアル化は"0.93"となります。
一方、アルファが236なら該当整数はなく (92→235, 94→240)、 236 ÷ 0.255 = 925.490196078 よって"0.92549"にシリアル化されます (最大6桁、末尾ゼロは省略)。
<number>値は10進数で、 "."を小数点区切りに使います。 先頭ゼロは省略しません。 末尾ゼロは省略します。
アルファ値の保持精度(シリアル化時の小数点以下桁数)は本仕様で定義しませんが、 少なくとも整数パーセンテージ値をラウンドトリップできる精度が必要です。 よってシリアル化値は 少なくとも小数点以下2桁を含める必要があります (ただし末尾ゼロは省略可)。 値は+∞方向へ丸め、切り捨てしません。
<alpha-value>が有効範囲外で指定された場合はパース時に丸めるため、宣言値も丸められます。 ただし、CSS Values 4 § 10.12 範囲チェックにより、 calc()指定の<alpha-value>は指定形のシリアル化時は丸めませんが、算出値は丸めます。
15.2. sRGB値のシリアル化
下記sRGB値のシリアル化形式:
は宣言値に基づきます。
プロパティ値をシリアル化する際、 著者がCSS名前付き色、 システム色、 非推奨色、 transparentを設定した場合、 ASCII小文字キーワード値が宣言値として保持されます。 算出値・使用値は対応するsRGB値となります。
したがって、transparentの宣言値は文字列"transparent"、 算出値は"rgba(0, 0, 0, 0)"です。
その他のsRGB値は 宣言値・算出値・使用値とも対応するsRGB値です。
シリアル化時、 欠落値は0に変換されます。
15.2.1. HTML互換sRGB値のシリアル化
以下すべての条件が満たされる場合:
- 色空間がsRGB
- アルファが1
- RGB成分値が内部で0~255の整数(8ビット符号なし整数)として表現
- HTML互換シリアル化が要求されている
該当するsRGB値は6桁16進数色記法で下記のようにシリアル化:
7文字の文字列で、"#"に続いて赤・緑・青成分を2桁16進数で順にASCII小文字で。空白なし。
context.fillStyle ="rgb(255, 0, 255)" console.log ( context.fillStyle); //"#ff00ff"
色空間はsRGB、表現は8ビット/成分、 データ形式はnone値も拡張範囲値も生じず、 アルファは1です。
HTML互換シリアル化は"#ff00ff"("#FF00FF"ではない)です。
それ以外の場合、sRGBはCSSシリアル化を用い、 他色空間は仕様記載のシリアル化を用います。
context.fillStyle ="lab(29% 39 20)" ; console.log ( context.fillStyle); //"lab(29 39 20)"
CSSシリアル化は"lab(29 39 20)"です。
context.fillStyle ="#ff00ffed" ; console.log ( context.fillStyle); //"rgba(255, 0, 255, 0.93)"
アルファが1でないため、CSSシリアル化は"rgba(255, 0, 255, 0.93)"です。
15.2.2. sRGB値のCSSシリアル化
対応するsRGB値は、rgb()またはrgba()形式で (アルファ値が(丸めて)ちょうど1か否かによって)、 関数名はすべてASCII小文字です。
互換性のため、sRGB成分値は <number> 形式でシリアル化され、<percentage>ではありません。 また互換性のため、 成分値は10進数でシリアル化され、 格納ビット深度に関係なく[0-255]範囲です。
前述の通り、 アルファ値が1の場合は明示的にシリアル化されません。 また互換性のため、アルファがちょうど1なら rgb()形式(暗黙のアルファ)、 そうでなければrgba()形式(明示アルファ値)となります。
互換性のため、 レガシーのコンマ区切り形式を使い、 各コンマの後には必ずASCIIスペース1個。 これは、rgba()の青成分とアルファ値の間の区切りにもコンマ(スラッシュではなく)を使います。
hwb ( 740 deg 20 % 30 % /50 % )
まず正規化され
hwb ( 20 20 % 30 % /50 % )
そしてsRGBに変換・シリアル化され
rgba ( 178.5 , 93.5 , 51 , 0.5 )
返却値の精度は下記参照。
注: CSS Color 3と異なり rgb()関数のパラメータ型は <number>型であり <integer>型ではありません。 よって8ビットを超える精度は小数部で示されます。
sRGB成分値の保持精度(シリアル化時の有効桁数)は本仕様では定義されませんが、 少なくとも8ビット値をラウンドトリップできる精度が必要です。 値は+∞方向へ丸め、切り捨てしません。
注: getComputedStyleで返される色値の成分値が<integer>型であることを期待するスクリプト著者は、 <number>型にも対応するよう修正することを推奨します。
例:
rgb ( 146.064 107.457 131.223 )
は有効で、
rgb ( 57.28 % 42.14 % 51.46 % )
両方の適合するシリアル化形式は "rgb(146.06, 107.46, 131.2)"。
成分値の小数部のゼロは末尾省略し、 小数部がすべてゼロなら小数点も省略します。 よって整数成分指定のsRGB色は後方互換の整数値でシリアル化されます。
15.3. LabとLCH値のシリアル化
lch()およびlab()値のシリアル化形式は 算出値に基づき、 関数名はlab()またはlch() でASCII小文字です。
成分値は10進数でシリアル化し、 L・a・b・C成分値は<number>型、 Labパーセンテージ参照範囲やLCHパーセンテージ参照範囲に従い パーセント→数値変換を行う(0%L→0、100%L→100)。 成分間の区切りはASCIIスペース1個。
成分値の小数部のゼロは末尾省略し、 小数部がすべてゼロなら小数点も省略します。
lab()成分値の保持精度(シリアル化時の有効桁数)は本仕様で定義されませんが、 広いガマットゆえL値は0~100、a・b値は±127間でラウンドトリップ可能な精度(最低16ビット精度)が必要です。 これにより少なくとも小数点以下3桁(末尾ゼロ省略可)が得られます。 (内部表現はhalf floatやfloat推奨)。 値は+∞方向へ丸め、切り捨てしません。
注: a・b値は±125を超えることも可能です。 例えばprophoto-rgb主・二次色はこの範囲を超えますが、±200内に収まります。
前述の通り、 アルファ値が1なら明示的シリアル化しません。 1以外は明示的シリアル化し、 " / " (スペース+スラッシュ+スペース)でb成分値とアルファ値を区切ります。
以下のシリアル化値
lch ( 56.2 % 83.6 357.4 /93 % )
は "lch(56.2 83.6 357.4 / 0.93)"、 "lch(56.2% 83.6 357.4 / 0.93)" ではありません
15.4. OklabとOKLCh値のシリアル化
oklch()およびoklab()値のシリアル化形式は 算出値に基づき、 関数名はoklab()またはoklch()でASCII小文字です。
成分値は10進数でシリアル化し、 L・a・b・C成分値は<number>型、 Oklabパーセンテージ参照範囲やOKLChパーセンテージ参照範囲に従い パーセント→数値変換を行う(0%L→0、100%L→1.0)。 成分間の区切りはASCIIスペース1個。
以下のシリアル化値
oklab ( 54.0 % -0.10 -0.02 )
は "oklab(0.54 -0.1 -0.02)"、 "oklab(54 -0.1 -0.02)" や "oklab(54% -0.1 -0.02)" ではありません
成分値の小数部のゼロは末尾省略し、 小数部がすべてゼロなら小数点も省略します。
以下のシリアル化値
oklch ( 56.43 % 0.0900 123.40 )
は "oklch(0.5643 0.09 123.4)"、 "oklch(0.5643 0.0900 123.40)" ではありません。
oklab()成分値の保持精度(シリアル化時の有効桁数)は本仕様で定義されませんが、 広いガマットゆえL値は0~1(0%~100%)、a・b・C値は±0.5間でラウンドトリップ可能な精度(最低16ビット精度)が必要です。 これにより少なくとも小数点以下5桁(末尾ゼロ省略可)が得られます。 (内部表現はhalf floatやfloat推奨)。 値は+∞方向へ丸め、切り捨てしません。
注: a・b・C値は±0.5を超えることも可能です。 例えばprophoto-rgbの緑・青主色はこの範囲を超え、 Cはそれぞれ0.526と1.413となります。
前述の通り、 アルファ値が1なら明示的シリアル化しません。 1以外は明示的シリアル化し、 " / " (スペース+スラッシュ+スペース)で最終成分値(bまたはC)とアルファ値を区切ります。
15.5. color()関数値のシリアル化
color()値のシリアル化形式は 算出値に基づき、 関数名・色空間名はcolor()形式でASCII小文字で表記されます。
成分値は10進数で <number>としてシリアル化されます。 成分値間、および色空間名と最初の成分値の間にはASCIIスペース1個を区切りで使います。
以下のシリアル化値
color ( dIsPlAy-P30.964 0.763 0.787 )
は "color(display-p3 0.96 0.76 0.79)" (有効小数点2桁の場合)。 0.787は切り捨てでなく丸めで0.79となっています。
成分値の小数部のゼロは末尾省略し、 小数部がすべてゼロなら小数点も省略します。
以下のシリアル化値
color ( rec20200.400 0.660 0.340 )
は "color(rec2020 0.4 0.66 0.34)"、 "color(rec2020 0.400 0.660 0.340)" ではありません。
色空間がsRGBでも、シリアル化時には色空間名を明示記載します。
定義済み色空間ごとの 最低ラウンドトリップ精度は下記の通り:
色空間 | 最低ビット数 |
---|---|
srgb | 10 |
srgb-linear | 12 |
display-p3 | 10 |
a98-rgb | 10 |
prophoto-rgb | 12 |
rec2020 | 12 |
xyz, xyz-d50, xyz-d65 | 16 |
(16ビット、half-floatやfloat 各成分推奨)。 値は+∞方向へ丸め、切り捨てしません。
注: レガシー形式 rgb()やhsl()等と比べ、 color(srgb)はより高い精度要件となります。 高精度を好む作者はcolor(srgb)形式の利用を推奨します。
前述の通り、 アルファ値が1なら明示的シリアル化しません。 1以外は明示的シリアル化し、 " / " (スペース+スラッシュ+スペース)で最終成分値とアルファ値を区切ります。
以下のシリアル化値
color ( prophoto-rgb0.2804 0.40283 0.42259 /85 % )
は "color(prophoto-rgb 0.28 0.403 0.423 / 0.85)" (小数点以下3桁保持の場合)。
15.6. その他の色のシリアル化
これはcurrentcolorに適用されます。
この値のシリアル化形式は 算出値に基づき、 色名はASCII小文字で表記されます。
currentColorのシリアル化値は文字列"currentcolor"です。
16. <opacity-value>値のシリアル化
これはopacityプロパティに適用されます。
指定opacity値は <number>型でシリアル化され、<percentage>型ではありません。
この<number>値は10進数で表され、 "."が小数点区切りです。 先頭ゼロは省略せず、 末尾ゼロは省略します。
opacity値が[0,1]範囲外でも シリアル化指定値では丸めず保持します。
opacity値の保持精度(シリアル化時の小数点以下桁数)は本仕様で定義しませんが、 少なくとも整数パーセンテージ値をラウンドトリップできる精度が必要です。 よってシリアル化値は 少なくとも小数点以下2桁を含める必要があります (ただし末尾ゼロは省略可)。 値は+∞方向へ丸め、切り捨てしません。
17. デフォルトスタイル規則
以下のスタイルシートは参考用で規範的ではありません。実装がHTML文書のデフォルトスタイルの一部として利用することができます。
/* 従来のデスクトップユーザーエージェントのハイパーリンク色 */ :link{ color : LinkText; } :visited{ color : VisitedText; } :active{ color : ActiveText; }
18. 色変換のサンプルコード
この節は規範的なものではありません。
テスト
この節は規範的なものではないため、テストは不要です。
分かりやすさのため、ライブラリを行列の積に使用しています。 (全てを掛け算や加算でインラインするよりも可読性が高いです)。 行列はカラムメジャー順です。
// 色変換のサンプルコード // 変換はICCプロファイルやカラーマネジメントシステムでも可能です // 分かりやすさのため、行列の積にはライブラリ(multiply-matrices.js)を使用しています // 標準ホワイトポイントは、4桁のCIE x,y色度で定義されています const D50= [ 0.3457 / 0.3585 , 1.00000 , ( 1.0 - 0.3457 - 0.3585 ) / 0.3585 ]; const D65= [ 0.3127 / 0.3290 , 1.00000 , ( 1.0 - 0.3127 - 0.3290 ) / 0.3290 ]; // sRGB関連関数 function lin_sRGB( RGB) { // sRGB値の配列を変換 // ガマット内の値は [0 - 1] 範囲 // 線形光(非補正)形式へ変換 // https://en.wikipedia.org/wiki/SRGB // 拡張転送関数: // 負値の場合は、線形部分を軸反射させ、 // 反射したべき乗関数を利用 return RGB. map( function ( val) { let sign= val< 0 ? - 1 : 1 ; let abs= Math. abs( val); if ( abs<= 0.04045 ) { return val/ 12.92 ; } return sign* ( Math. pow(( abs+ 0.055 ) / 1.055 , 2.4 )); }); } function gam_sRGB( RGB) { // 線形光sRGB値[0.0-1.0]の配列を // ガンマ補正形式へ変換 // https://en.wikipedia.org/wiki/SRGB // 拡張転送関数: // 負値の場合、線形部分を軸反射し // その下は反射pow使用 return RGB. map( function ( val) { let sign= val< 0 ? - 1 : 1 ; let abs= Math. abs( val); if ( abs> 0.0031308 ) { return sign* ( 1.055 * Math. pow( abs, 1 / 2.4 ) - 0.055 ); } return 12.92 * val; }); } function lin_sRGB_to_XYZ( rgb) { // 線形光sRGB値の配列をCIE XYZへ変換 // sRGBのホワイトD65使用(色順応なし) var M= [ [ 506752 / 1228815 , 87881 / 245763 , 12673 / 70218 ], [ 87098 / 409605 , 175762 / 245763 , 12673 / 175545 ], [ 7918 / 409605 , 87881 / 737289 , 1001167 / 1053270 ], ]; return multiplyMatrices( M, rgb); } function XYZ_to_lin_sRGB( XYZ) { // XYZを線形sRGBへ変換 var M= [ [ 12831 / 3959 , - 329 / 214 , - 1974 / 3959 ], [ - 851781 / 878810 , 1648619 / 878810 , 36519 / 878810 ], [ 705 / 12673 , - 2585 / 12673 , 705 / 667 ], ]; return multiplyMatrices( M, XYZ); } // display-p3関連の関数 function lin_P3( RGB) { // display-p3のRGB値(0.0 - 1.0範囲)を線形光(非補正)に変換 // 線形光(非補正)の形に変換します。 return lin_sRGB( RGB); // sRGBと同じ } function gam_P3( RGB) { // 線形光 display-p3 RGB(0.0-1.0範囲)をガンマ補正 // ガンマ補正された形に変換します。 return gam_sRGB( RGB); // sRGBと同じ } function lin_P3_to_XYZ( rgb) { // 線形光 display-p3値をCIE XYZへ変換 // D65使用(色順応なし) // http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html var M= [ [ 608311 / 1250200 , 189793 / 714400 , 198249 / 1000160 ], [ 35783 / 156275 , 247089 / 357200 , 198249 / 2500400 ], [ 0 / 1 , 32229 / 714400 , 5220557 / 5000800 ], ]; return multiplyMatrices( M, rgb); } function XYZ_to_lin_P3( XYZ) { // XYZを線形光P3へ変換 var M= [ [ 446124 / 178915 , - 333277 / 357830 , - 72051 / 178915 ], [ - 14852 / 17905 , 63121 / 35810 , 423 / 17905 ], [ 11844 / 330415 , - 50337 / 660830 , 316169 / 330415 ], ]; return multiplyMatrices( M, XYZ); } // prophoto-rgb関連の関数 function lin_ProPhoto( RGB) { // prophoto-rgb値の配列を変換 // ガマット内の色は[0.0 - 1.0]範囲 // 線形光(非補正)に変換します。 // トランスファーカーブはガンマ1.8、小さな線形領域あり // 拡張転送関数 const Et2= 16 / 512 ; return RGB. map( function ( val) { let sign= val< 0 ? - 1 : 1 ; let abs= Math. abs( val); if ( abs<= Et2) { return val/ 16 ; } return sign* Math. pow( abs, 1.8 ); }); } function gam_ProPhoto( RGB) { // 線形光 prophoto-rgb(0.0-1.0範囲)をガンマ補正 // ガンマ補正された形に変換します。 // トランスファーカーブはガンマ1.8、小さな線形領域あり // 負の値の場合、軸反射で線形領域を拡張し、その下はpowを追加(TODO) const Et= 1 / 512 ; return RGB. map( function ( val) { let sign= val< 0 ? - 1 : 1 ; let abs= Math. abs( val); if ( abs>= Et) { return sign* Math. pow( abs, 1 / 1.8 ); } return 16 * val; }); } function lin_ProPhoto_to_XYZ( rgb) { // 線形光 prophoto-rgb値をCIE D50 XYZへ変換 // 行列は有理数形式で表現不可だが64ビット精度で計算 // 詳細: https://github.com/w3c/csswg-drafts/issues/7675 var M= [ [ 0.79776664490064230 , 0.13518129740053308 , 0.03134773412839220 ], [ 0.28807482881940130 , 0.71183523424187300 , 0.00008993693872564 ], [ 0.00000000000000000 , 0.00000000000000000 , 0.82510460251046020 ] ]; return multiplyMatrices( M, rgb); } function XYZ_to_lin_ProPhoto( XYZ) { // D50 XYZを線形光prophoto-rgbに変換 var M= [ [ 1.34578688164715830 , - 0.25557208737979464 , - 0.05110186497554526 ], [ - 0.54463070512490190 , 1.50824774284514680 , 0.02052744743642139 ], [ 0.00000000000000000 , 0.00000000000000000 , 1.21196754563894520 ] ]; return multiplyMatrices( M, XYZ); } // a98-rgb関連関数 function lin_a98rgb( RGB) { // a98-rgb値[0.0 - 1.0]配列を線形光(非補正)形式へ変換 // 負値も許容 return RGB. map( function ( val) { let sign= val< 0 ? - 1 : 1 ; let abs= Math. abs( val); return sign* Math. pow( abs, 563 / 256 ); }); } function gam_a98rgb( RGB) { // 線形光a98-rgb値[0.0-1.0]配列をガンマ補正形式に変換 // 負値も許容 return RGB. map( function ( val) { let sign= val< 0 ? - 1 : 1 ; let abs= Math. abs( val); return sign* Math. pow( abs, 256 / 563 ); }); } function lin_a98rgb_to_XYZ( rgb) { // 線形光a98-rgb値配列をCIE XYZへ変換 // http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html // https://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf 第4.3.5.3節より高精度 // 値はR,G,B,Wの色度座標から原理的に計算 // 詳細はmatrixmaker.html参照 var M= [ [ 573536 / 994567 , 263643 / 1420810 , 187206 / 994567 ], [ 591459 / 1989134 , 6239551 / 9945670 , 374412 / 4972835 ], [ 53769 / 1989134 , 351524 / 4972835 , 4929758 / 4972835 ], ]; return multiplyMatrices( M, rgb); } function XYZ_to_lin_a98rgb( XYZ) { // XYZを線形光a98-rgbへ変換 var M= [ [ 1829569 / 896150 , - 506331 / 896150 , - 308931 / 896150 ], [ - 851781 / 878810 , 1648619 / 878810 , 36519 / 878810 ], [ 16779 / 1248040 , - 147721 / 1248040 , 1266979 / 1248040 ], ]; return multiplyMatrices( M, XYZ); } //Rec. 2020関連関数 function lin_2020( RGB) { // rec2020 RGB値[0.0 - 1.0]配列を線形光(非補正)形式へ変換 // ITU-R BT.2020-2 p.4 const α= 1.09929682680944 ; const β= 0.018053968510807 ; return RGB. map( function ( val) { let sign= val< 0 ? - 1 : 1 ; let abs= Math. abs( val); if ( abs< β* 4.5 ) { return val/ 4.5 ; } return sign* ( Math. pow(( abs+ α- 1 ) / α, 1 / 0.45 )); }); } function gam_2020( RGB) { // 線形光rec2020 RGB値[0.0-1.0]配列をガンマ補正形式へ変換 // ITU-R BT.2020-2 p.4 const α= 1.09929682680944 ; const β= 0.018053968510807 ; return RGB. map( function ( val) { let sign= val< 0 ? - 1 : 1 ; let abs= Math. abs( val); if ( abs> β) { return sign* ( α* Math. pow( abs, 0.45 ) - ( α- 1 )); } return 4.5 * val; }); } function lin_2020_to_XYZ( rgb) { // 線形光rec2020値の配列をCIE XYZに変換 // D65を使用(色順応なし) // http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html var M= [ [ 63426534 / 99577255 , 20160776 / 139408157 , 47086771 / 278816314 ], [ 26158966 / 99577255 , 472592308 / 697040785 , 8267143 / 139408157 ], [ 0 / 1 , 19567812 / 697040785 , 295819943 / 278816314 ], ]; // 0は実際には 4.994106574466076e-17 として計算されます return multiplyMatrices( M, rgb); } function XYZ_to_lin_2020( XYZ) { // XYZを線形光rec2020に変換 var M= [ [ 30757411 / 17917100 , - 6372589 / 17917100 , - 4539589 / 17917100 ], [ - 19765991 / 29648200 , 47925759 / 29648200 , 467509 / 29648200 ], [ 792561 / 44930125 , - 1921689 / 44930125 , 42328811 / 44930125 ], ]; return multiplyMatrices( M, XYZ); } // 色順応 function D65_to_D50( XYZ) { // D65からD50へのBradford色順応 // 以下の行列は3つの操作の結果です: // - XYZから網膜錐体領域への変換 // - 参照ホワイトを変更するための成分スケール // - XYZへ戻す変換 // 詳細:https://github.com/LeaVerou/color.js/pull/354/files var M= [ [ 1.0479297925449969 , 0.022946870601609652 , - 0.05019226628920524 ], [ 0.02962780877005599 , 0.9904344267538799 , - 0.017073799063418826 ], [ - 0.009243040646204504 , 0.015055191490298152 , 0.7518742814281371 ] ]; return multiplyMatrices( M, XYZ); } function D50_to_D65( XYZ) { // D50からD65へのBradford色順応 // 詳細:https://github.com/LeaVerou/color.js/pull/360/files var M= [ [ 0.955473421488075 , - 0.02309845494876471 , 0.06325924320057072 ], [ - 0.0283697093338637 , 1.0099953980813041 , 0.021041441191917323 ], [ 0.012314014864481998 , - 0.020507649298898964 , 1.330365926242124 ] ]; return multiplyMatrices( M, XYZ); } // CIE LabおよびLCH function XYZ_to_Lab( XYZ) { // XYZがD50基準であると仮定し、CIE Labに変換 // CIE標準より、これらは有理式で定義される var ε= 216 / 24389 ; // 6^3/29^3 var κ= 24389 / 27 ; // 29^3/3^3 // xyzを計算(XYZを参照ホワイト相対でスケーリング) var xyz= XYZ. map(( value, i) => value/ D50[ i]); // fを計算 var f= xyz. map( value=> value> ε? Math. cbrt( value) : ( κ* value+ 16 ) / 116 ); return [ ( 116 * f[ 1 ]) - 16 , // L 500 * ( f[ 0 ] - f[ 1 ]), // a 200 * ( f[ 1 ] - f[ 2 ]) // b ]; // Lは[0,100]範囲。CSS用はパーセントを付加 } function Lab_to_XYZ( Lab) { // LabをD50順応XYZに変換 // http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html var κ= 24389 / 27 ; // 29^3/3^3 var ε= 216 / 24389 ; // 6^3/29^3 var f= []; // f計算(輝度成分から開始) f[ 1 ] = ( Lab[ 0 ] + 16 ) / 116 ; f[ 0 ] = Lab[ 1 ] / 500 + f[ 1 ]; f[ 2 ] = f[ 1 ] - Lab[ 2 ] / 200 ; // xyz計算 var xyz= [ Math. pow( f[ 0 ], 3 ) > ε? Math. pow( f[ 0 ], 3 ) : ( 116 * f[ 0 ] - 16 ) / κ, Lab[ 0 ] > κ* ε? Math. pow(( Lab[ 0 ] + 16 ) / 116 , 3 ) : Lab[ 0 ] / κ, Math. pow( f[ 2 ], 3 ) > ε? Math. pow( f[ 2 ], 3 ) : ( 116 * f[ 2 ] - 16 ) / κ]; // xyzを参照ホワイトでスケールしXYZ算出 return xyz. map(( value, i) => value* D50[ i]); } function Lab_to_LCH( Lab) { var epsilon= 0.0015 ; var chroma= Math. sqrt( Math. pow( Lab[ 1 ], 2 ) + Math. pow( Lab[ 2 ], 2 )); // クロマ var hue= Math. atan2( Lab[ 2 ], Lab[ 1 ]) * 180 / Math. PI; if ( hue< 0 ) { hue= hue+ 360 ; } if ( chroma<= epsilon) { hue= NaN ; } return [ Lab[ 0 ], // Lはそのまま chroma, // クロマ hue// 色相(度、0~360) ]; } function LCH_to_Lab( LCH) { // 極座標形式から変換 return [ LCH[ 0 ], // Lはそのまま LCH[ 1 ] * Math. cos( LCH[ 2 ] * Math. PI/ 180 ), // a LCH[ 1 ] * Math. sin( LCH[ 2 ] * Math. PI/ 180 ) // b ]; } // OKLabおよびOKLCH // https://bottosson.github.io/posts/oklab/ // XYZ ⇔ LMS 行列は参照ホワイト一貫性のため再計算 // 詳細:https://github.com/w3c/csswg-drafts/issues/6642#issuecomment-943521484 // 64bit精度で再計算 // 詳細:https://github.com/color-js/color.js/pull/357 function XYZ_to_OKLab( XYZ) { // XYZ(D65基準)からOKLabに変換 var XYZtoLMS= [ [ 0.8190224379967030 , 0.3619062600528904 , - 0.1288737815209879 ], [ 0.0329836539323885 , 0.9292868615863434 , 0.0361446663506424 ], [ 0.0481771893596242 , 0.2642395317527308 , 0.6335478284694309 ] ]; var LMStoOKLab= [ [ 0.2104542683093140 , 0.7936177747023054 , - 0.0040720430116193 ], [ 1.9779985324311684 , - 2.4285922420485799 , 0.4505937096174110 ], [ 0.0259040424655478 , 0.7827717124575296 , - 0.8086757549230774 ] ]; var LMS= multiplyMatrices( XYZtoLMS, XYZ); // JavaScriptのMath.cbrtは符号付き立方根を返す // 他言語への移植時は注意 // 一般的べき乗関数は特に注意 return multiplyMatrices( LMStoOKLab, LMS. map( c=> Math. cbrt( c))); // Lは[0,1]範囲。CSS用は100倍してパーセント付加 } function OKLab_to_XYZ( OKLab) { // OKLabからXYZ(D65基準)に変換 var LMStoXYZ= [ [ 1.2268798758459243 , - 0.5578149944602171 , 0.2813910456659647 ], [ - 0.0405757452148008 , 1.1122868032803170 , - 0.0717110580655164 ], [ - 0.0763729366746601 , - 0.4214933324022432 , 1.5869240198367816 ] ]; var OKLabtoLMS= [ [ 1.0000000000000000 , 0.3963377773761749 , 0.2158037573099136 ], [ 1.0000000000000000 , - 0.1055613458156586 , - 0.0638541728258133 ], [ 1.0000000000000000 , - 0.0894841775298119 , - 1.2914855480194092 ] ]; var LMSnl= multiplyMatrices( OKLabtoLMS, OKLab); return multiplyMatrices( LMStoXYZ, LMSnl. map( c=> c** 3 )); } function OKLab_to_OKLCH( OKLab) { var epsilon= 0.000004 ; var hue= Math. atan2( OKLab[ 2 ], OKLab[ 1 ]) * 180 / Math. PI; var chroma= Math. sqrt( OKLab[ 1 ] ** 2 + OKLab[ 2 ] ** 2 ); if ( hue< 0 ) { hue= hue+ 360 ; } if ( chroma<= epsilon) { hue= NaN ; } return [ OKLab[ 0 ], // Lはそのまま chroma, hue]; } function OKLCH_to_OKLab( OKLCH) { return [ OKLCH[ 0 ], // Lはそのまま OKLCH[ 1 ] * Math. cos( OKLCH[ 2 ] * Math. PI/ 180 ), // a OKLCH[ 1 ] * Math. sin( OKLCH[ 2 ] * Math. PI/ 180 ) // b ]; } // 乗算済みアルファ変換 function rectangular_premultiply( color, alpha) { // 直交な長方形色空間のcolorとalpha値を受け取り // 乗算済み形式を返します return color. map(( c) => c* alpha) } function rectangular_un_premultiply( color, alpha) { // 直交な長方形色空間の乗算済みcolorとalpha値を受け取り // 実際の色を返します if ( alpha=== 0 ) { return color; // 0除算回避 } return color. map(( c) => c/ alpha) } function polar_premultiply( color, alpha, hueIndex) { // 円筒極座標色空間のcolorとalpha値を受け取り // 乗算済み形式を返します // hueIndexは色配列のどの要素が色相角かを示します // 例:OKLCHなら2、HSLなら0 return color. map(( c, i) => c* ( hueIndex=== i? 1 : alpha)) } function polar_un_premultiply( color, alpha, hueIndex) { // 円筒極座標色空間の乗算済みcolorとalpha値を受け取り // 実際の色を返します // hueIndexは色配列のどの要素が色相角かを示します // 例:OKLCHなら2、HSLなら0 if ( alpha=== 0 ) { return color; // 0除算回避 } return color. map(( c, i) => c/ ( hueIndex=== i? 1 : alpha)) } // HSL用の簡易関数例 function hsl_premultiply( color, alpha) { return polar_premultiply( color, alpha, 0 ); }
19. ΔE2000およびΔEOK色差のサンプルコード
この節は規範的なものではありません。
テスト
この節は規範的なものではないため、テストは不要です。
19.1. ΔE2000
最も単純な色差指標であるΔE76は、 Lab色空間上でのユークリッド距離です。 これはおおまかな近似としては良いですが、 印刷業界や染色業界など色が重要な分野では より精度の高い式が開発されました。 現在最も広く使われている式がΔE2000です。 ΔE76と比べて、既知の非対称性や非線形性を補正しています。 この式は非常に複雑で、 中間計算の符号に強く依存するため、 実装にミスが入りやすいことが知られています [Sharma]。
下記のサンプルコードはテスト済みであり、 Lab値ペアと期待されるΔE2000でSharma氏が公開した テストスイートと比較し、5桁有効数字で一致することが検証されています。 正しい実装です。
// deltaE2000はdeltaE76やdeltaE94より有意に精度が高い // CIEやIdeallianceでも推奨されている // 特にdeltaE76で10未満の色差評価に推奨 // しかし非常に複雑 // 多くの実装に誤差があるので注意! /** * @param {number[]} reference - CIE Lab値の配列: Lは0..100、aとbはおよそ-150..150 * @param {number[]} sample - CIE Lab値の配列: Lは0..100、aとbはおよそ-150..150 * @return {number} サンプル色と基準色の差の大きさ */ function deltaE2000( reference, sample) { // CIE Labで表された基準色とサンプル色から // deltaE 2000を計算します。 // この実装ではパラメトリック重み係数 // kL, kC, kH(観察条件への影響)は全て1としています(一般的な設定)。 let [ L1, a1, b1] = reference; let [ L2, a2, b2] = sample; let C1= Math. sqrt( a1** 2 + b1** 2 ); let C2= Math. sqrt( a2** 2 + b2** 2 ); let Cbar= ( C1+ C2) / 2 ; // クロマの平均 // クロマ平均からa軸非対称係数を計算 // これにより、ほぼ中性色付近のJND楕円が円になる let C7= Math. pow( Cbar, 7 ); const Gfactor= Math. pow( 25 , 7 ); let G= 0.5 * ( 1 - Math. sqrt( C7/ ( C7+ Gfactor))); // a軸を非対称係数でスケール // Lab2000色空間が存在しない理由でもある let adash1= ( 1 + G) * a1; let adash2= ( 1 + G) * a2; // スケール後のa軸と元のb軸から新しいクロマを計算 let Cdash1= Math. sqrt( adash1** 2 + b1** 2 ); let Cdash2= Math. sqrt( adash2** 2 + b2** 2 ); // 新しい色相を計算(完全な中性色には0度を割り当て) // 単位は度(ラジアンではない) const π= Math. PI; const r2d= 180 / π; const d2r= π/ 180 ; let h1= ( adash1=== 0 && b1=== 0 ) ? 0 : Math. atan2( b1, adash1); let h2= ( adash2=== 0 && b2=== 0 ) ? 0 : Math. atan2( b2, adash2); if ( h1< 0 ) { h1+= 2 * π; } if ( h2< 0 ) { h2+= 2 * π; } h1*= r2d; h2*= r2d; // 明度とクロマの差(符号に注意) let ΔL= L2- L1; let ΔC= Cdash2- Cdash1; // 色相差(符号を正しく計算することが重要) let hdiff= h2- h1; let hsum= h1+ h2; let habs= Math. abs( hdiff); let Δh; if ( Cdash1* Cdash2=== 0 ) { Δh= 0 ; } else if ( habs<= 180 ) { Δh= hdiff; } else if ( hdiff> 180 ) { Δh= hdiff- 360 ; } else if ( hdiff< - 180 ) { Δh= hdiff+ 360 ; } else { console. log( "まさかの事態が発生" ); } // 重み付き色相差(クロマが大きいほど影響も大きい) let ΔH= 2 * Math. sqrt( Cdash2* Cdash1) * Math. sin( Δh* d2r/ 2 ); // 明度とクロマの平均値 let Ldash= ( L1+ L2) / 2 ; let Cdash= ( Cdash1+ Cdash2) / 2 ; let Cdash7= Math. pow( Cdash, 7 ); // Labの青領域の非線形性補正 // 色相重み係数は角度によって4通りあり、符号に注意 let hdash; if ( Cdash1== 0 && Cdash2== 0 ) { hdash= hsum; // これは0になるはず } else if ( habs<= 180 ) { hdash= hsum/ 2 ; } else if ( hsum< 360 ) { hdash= ( hsum+ 360 ) / 2 ; } else { hdash= ( hsum- 360 ) / 2 ; } // CIELABの均一性欠如の位置補正 // JND楕円を球に近づけるための補正群 // 明度補正因子SL(L=50の背景想定) let lsq= ( Ldash- 50 ) ** 2 ; let SL= 1 + (( 0.015 * lsq) / Math. sqrt( 20 + lsq)); // クロマ補正因子SC(CMCやdeltaE94にも類似項あり) let SC= 1 + 0.045 * Cdash; // 青領域非線形性のための交差項T let T= 1 ; T-= ( 0.17 * Math. cos(( hdash- 30 ) * d2r)); T+= ( 0.24 * Math. cos( 2 * hdash* d2r)); T+= ( 0.32 * Math. cos((( 3 * hdash) + 6 ) * d2r)); T-= ( 0.20 * Math. cos((( 4 * hdash) - 63 ) * d2r)); // 色相補正因子SH(クロマと調整色相角に依存、deltaE94同様) let SH= 1 + 0.015 * Cdash* T; // RT(色相回転項)はJND楕円の回転やマンセルの等色相線補正 // 中~高クロマ青領域(色相225~315度) let Δθ= 30 * Math. exp( - 1 * ((( hdash- 275 ) / 25 ) ** 2 )); let RC= 2 * Math. sqrt( Cdash7/ ( Cdash7+ Gfactor)); let RT= - 1 * Math. sin( 2 * Δθ* d2r) * RC; // 最終的に各項の平方和の平方根でdeltaEを計算 let dE= ( ΔL/ SL) ** 2 ; dE+= ( ΔC/ SC) ** 2 ; dE+= ( ΔH/ SH) ** 2 ; dE+= RT* ( ΔC/ SC) * ( ΔH/ SH); return Math. sqrt( dE); // 完了! };
19.2. ΔEOK
OklabはCIE Labに見られる 色相の線形性・均一性やクロマの非線形性がないため、 色差指標はそれらの補正を必要とせず、 単純にOklab色空間でのユークリッド距離となります。
// deltaE OKの計算 // 単純な平方根の和 /** * @param {number[]} reference - OKLab値の配列: Lは0..1、aとbは-1..1 * @param {number[]} sample - OKLab値の配列: Lは0..1、aとbは-1..1 * @return {number} サンプル色と基準色の差の大きさ */ function deltaEOK( reference, sample) { let [ L1, a1, b1] = reference; let [ L2, a2, b2] = sample; let ΔL= L1- L2; let Δa= a1- a2; let Δb= b1- b2; return Math. sqrt( ΔL** 2 + Δa** 2 + Δb** 2 ); }
付録A: 廃止されたCSSシステムカラー
CSSの旧バージョンでは、いくつかの追加のシステムカラーが定義されていました。 これらのカラーワードは廃止されており、 元々の目的(ウェブ要素をネイティブOS風に見せる)には十分でなく、 ウェブページがネイティブOSのダイアログを「偽装」しやすくなり セキュリティリスクとなるほか、 フィンガープリントの要因となりユーザーのプライバシーを損ないます。
ユーザーエージェントはこれらのキーワードをサポートしなければならず、 フィンガープリント対策のため 以下のように(廃止されていない)システムカラーにマッピングしなければなりません。作者はこれらのキーワードを使用してはなりません。
廃止されたシステムカラーは <deprecated-color>サブタイプとして表現され、 以下のように定義されます:
- ActiveBorder
- アクティブウィンドウの枠線。ButtonBorderと同じ。
- ActiveCaption
- アクティブウィンドウのキャプション。Canvasと同じ。
- AppWorkspace
- マルチドキュメントインターフェースの背景色。Canvasと同じ。
- Background
- デスクトップの背景。Canvasと同じ。
- ButtonHighlight
- 3D要素の光源側の枠線色(1層のみ)。ButtonFaceと同じ。
- ButtonShadow
- 3D要素の光源と反対側の枠線色(1層のみ)。ButtonFaceと同じ。
- CaptionText
- キャプション・サイズボックス・スクロールバー矢印ボックス内のテキスト。CanvasTextと同じ。
- InactiveBorder
- 非アクティブウィンドウの枠線。ButtonBorderと同じ。
- InactiveCaption
- 非アクティブウィンドウのキャプション。Canvasと同じ。
- InactiveCaptionText
- 非アクティブキャプション内のテキスト色。GrayTextと同じ。
- InfoBackground
- ツールチップの背景色。Canvasと同じ。
- InfoText
- ツールチップのテキスト色。CanvasTextと同じ。
- Menu
- メニューの背景。Canvasと同じ。
- MenuText
- メニュー内のテキスト。CanvasTextと同じ。
- Scrollbar
- スクロールバーのグレー部分。Canvasと同じ。
- ThreeDDarkShadow
- 3D要素の光源から遠い外側の暗い枠線色(二重枠)。ButtonBorderと同じ。
- ThreeDFace
- 3D要素の面の背景色(二重枠)。ButtonFaceと同じ。
- ThreeDHighlight
- 3D要素の光源側外側の明るい枠線色(二重枠)。ButtonBorderと同じ。
- ThreeDLightShadow
- 3D要素の光源側内側の暗い枠線色(二重枠)。ButtonBorderと同じ。
- ThreeDShadow
- 3D要素の光源から遠い内側の明るい枠線色(二重枠)。ButtonBorderと同じ。
- Window
- ウィンドウの背景。Canvasと同じ。
- WindowFrame
- ウィンドウの枠。ButtonBorderと同じ。
- WindowText
- ウィンドウ内のテキスト。CanvasTextと同じ。
テスト
- deprecated-sameas-001.html (ライブテスト) (ソース)
- deprecated-sameas-002.html (ライブテスト) (ソース)
- deprecated-sameas-003.html (ライブテスト) (ソース)
- deprecated-sameas-004.html (ライブテスト) (ソース)
- deprecated-sameas-005.html (ライブテスト) (ソース)
- deprecated-sameas-006.html (ライブテスト) (ソース)
- deprecated-sameas-007.html (ライブテスト) (ソース)
- deprecated-sameas-008.html (ライブテスト) (ソース)
- deprecated-sameas-009.html (ライブテスト) (ソース)
- deprecated-sameas-010.html (ライブテスト) (ソース)
- deprecated-sameas-011.html (ライブテスト) (ソース)
- deprecated-sameas-012.html (ライブテスト) (ソース)
- deprecated-sameas-013.html (ライブテスト) (ソース)
- deprecated-sameas-014.html (ライブテスト) (ソース)
- deprecated-sameas-015.html (ライブテスト) (ソース)
- deprecated-sameas-016.html (ライブテスト) (ソース)
- deprecated-sameas-017.html (ライブテスト) (ソース)
- deprecated-sameas-018.html (ライブテスト) (ソース)
- deprecated-sameas-019.html (ライブテスト) (ソース)
- deprecated-sameas-020.html (ライブテスト) (ソース)
- deprecated-sameas-021.html (ライブテスト) (ソース)
- deprecated-sameas-022.html (ライブテスト) (ソース)
- deprecated-sameas-023.html (ライブテスト) (ソース)
付録B: 廃止されたクァーキー16進カラー
CSSがクァークスモードでパースされている場合、<quirky-color>は<color>の一種であり、以下のプロパティでのみ有効です:
これらのプロパティを含む、または参照するプロパティ(例えばbackgroundショートハンドや、 関数記法 (例:color-mix())では 有効ではありません。
さらに、<quirky-color>は
<color>
として@supportsルール内でパースする場合有効でなければなりませんが、
CSS.supports()
メソッドでそれらのプロパティに使う場合は有効ではありません。
<quirky-color>は 以下のルールに従い <number-token>、 <dimension-token>、 または<ident-token>として表現されます:
-
それが<ident-token>の場合、 トークンの表現はちょうど3文字または6文字で、 すべて16進数の数字でなければなりません。 同じ値を持つ<hex-color>を表します。
-
それが<number-token>の場合、 整数フラグがセットされていなければなりません。
整数値をシリアライズします。 シリアライズが6文字未満の場合、6文字になるまで"0"を前に追加します。 同じ値を持つ<hex-color>を表します。
-
それが<dimension-token>の場合、 整数フラグがセットされていなければなりません。
整数値をシリアライズし、 トークンの単位表現を後ろに付けます。 結果が6文字未満の場合、6文字になるまで"0"を前に追加します。 同じ値を持つ<hex-color>を表します。
(つまり、Quirks Modeでは先頭の"#"なしで16進カラーが書けますが、特殊なパースルールになります。)
テスト
quirky hex colors
謝辞
CSS Color 3に貢献した方々に加え、編集者は Emilio Cobos Álvarez、Alexey Ardov、Chris Bai、Amelia Bellamy-Royds、Lars Borg、Mike Bremford、Andreu Botella、Dan Burzo、Max Derhak、fantasai、Simon Fraser、Devon Govett、Phil Green、Dean Jackson、Andreas Kraushaar、Pierre-Anthony Lemieux、Tiaan Louw、Cameron McCormack、Romain Menke、Chris Murphy、Isaac Muse、 Jonathan Neal、Chris Needham、Björn Ottosson、Christoph Päper、Brad Pettit、Xidorn Quan、Craig Revie、 Melanie Richards、Florian Rivoal、Jacob Rus、Joseph Salowey、Simon Sapin、Igor Snitkin、Lea Verou、Mark Watson、James Stuckey Weber、Sam Weinig、Natalie Weizenbaumに感謝します。
変更履歴
2024年2月13日の勧告案ドラフト以降の変更点
- colorプロパティ内で使用されるのは生の継承値ではなく、解決済みの継承値であることを明確化
- sRGBに解決される色やレガシーカラー構文をサポートする色など、色のカテゴリを列挙
- 色相正規化の例を追加
- 類似成分の表を修正、アルファが抜けていたが本文で類似として説明されていた
- 不透明度値のシリアライズを一箇所にまとめて明確化
- color-interpolation-methodやhost構文に関する記述を明確化
- 欠損色相を返すためのepsilonを定義
- 色相が欠損する無彩色のより厳密な定義(中心軸に十分近い場合)
- 「color channel」ではなく「color component」を一貫して使用
- 相関色温度について未定義だったため情報提供的な参照を追加
- premultipliedの用語をエクスポートし、一貫してリンク
- 廃止済みと現行のシステムカラーの等価性がもはやリスクではなくなったことを明記
- 「CSS <color>をパースする」アルゴリズムの想定用途を明確化
- HTML互換シリアライズの修正例を追加
- HTML互換シリアライズで欠損値のチェックを削除、すでにゼロになっているため
- 欠損値がゼロになる旨の注釈を移動し、HTML互換/CSSシリアライズ両方に適用
- sRGBのHTML互換16進シリアライズを追加
- xyz-d65およびxyz-d50の例を追加
- XYZのどの成分(Y)が明るさに対応するかを明確化
- CSSガマットマッピングは実値に適用されることを明確化
- hslToRgbサンプルコードから色相正規化を除去、入力はパース時に正規化済み
- ガマットマッピングアルゴリズムの疑似コードを修正(ステップ4)
- 補間が最も一般的な色の組み合わせ状況だが唯一ではないことを明記
- deltaE表のテキストコントラストを十分に確保
- <absolute-color-function>の残りの使用を削除、一貫性のため<absolute-color>関数に統一
- 謝辞セクションの更新
- ガマットメッシュ図の追加
- CSSOMシリアライズを指定値ではなく宣言値で説明
- luminanceの定義をエクスポート
- <opacity-value>の生成規則を追加
- hslToRgbの結果が[0,1]範囲になるタイミングを明確化
- 線形化後のRGB空間が加法的になることを明確化
2022年11月1日の勧告案ドラフト以降の変更点
- uint8_tアルファのシリアライズ手順を追加(cssom-1から移動)
- HSL負の彩度のパース時クランプを復活(CSS Color 3の現行実装に合わせた)
- 補間時は常に色空間変換し、無力な成分は欠損値になるよう調整
- アルファ1のシリアライズ時省略条件を明確化
- 色相角の[0,360]への制約を削除(すでに行われているため重複除去)
- ActiveCaptionの説明を修正(背景色であることを明記)
- opacityとalphaの区別を明確化。opacityプロパティはopacity-value使用(alpha-valueとクランプ挙動が異なる)
- 繰り越しはpremultiplicationの前に行われることを明確化
- ガマットマッピングアルゴリズムの更新
- 色相補間に関する細かな問題を修正
- HWBのwhite/blackが100%でも無彩色とは限らず、合計値が重要である旨明記
- rgb→hsl変換で負の彩度を返さないように修正、色相は「反対側」に向ける
- ProPhotoに有理式がないので64bit精度の行列使用
- Oklabの行列を64bit精度で再計算(32bit精度でも結果は同じ)
- GMA出力は必ず宛先色空間で返す、マッピング不要でも宛先がunboundedならそのまま
- OklabのJNDが0.02なのは2ではなく0.02である理由を説明
- sRGB値の解決はcolor()関数には適用されない旨明記
- alpha値定義をopacityプロパティへ移動、opacityの指定値はクランプしない旨明記
- システムカラーは明示的に偽装を許可(プライバシー保護のため)
- D50→D65逆順応行列を修正
- 線形Bradfordと元のBradford順応アルゴリズムを明確に区別
- ガマットマッピングでclippedをそのまま返し、余計なステップを回避
- クロマ順応行列を高精度化
- 「CSS色のパース」アルゴリズム追加(他仕様が色を使う場合の機械を再発明しなくて済むように)
- ガマットマッピングではクロマを元色を超えて投影しないことを明記
- 「analytical」ではなく「geometric」用語を使用
- HSLプローズを文法と合わせる(percent/number両方許容)
- LCHアルファ補間例を修正(色相角のun-premultiply誤りを修正)
- sRGB・display-p3の転送関数を修正(10.31475 / 255の成分のみ影響、8/10bit単位では存在しない)
- システムカラーの指定値は依然として自身であることを明確化
- PNG画像へのタグ付けでcICPチャンクに言及
- 色相増減時に0/360を通す場合の挙動説明
- HSLの無力性説明を他の極座標モデルと合わせる
- 色補間の操作順序を明示的に定義
- calc()内での退化定数への言及追加
- sRGBのcalc()は早期解決&クランプであることを明確化
- HWB色相の欠点はHSLと同じ旨明記
- luminanceとlightnessの比較+図追加
- 色相補間キーワードの説明・例追加
- HWB無彩色の定義を規範的なプローズ化
- 色相補間角度範囲を修正;[0,360)とする
- L=0% or 100%で黒または白表示はガマットマッピングのため、無力性の誤った主張は削除
- 「representing black」「representing white」コメント削除
- a,bが類似成分であることを明確化
- RGB成分をプローズではなく参照範囲で定義、一貫性を保つ
- Lab、LCH、Oklab、OKLChのパーセント→数値変換に参照範囲を明示
- Oklab補間を必須化、以前の「may」を削除し明示的なopt-out方法を記述
- Lab、LCH、Oklab、OKLChのチュートリアルを非規範セクションにラベル付け、一部定義を規範セクションへ移動
- 補間時は色空間変換前に類似成分チェックを行うことを明記
- hwb()構文変更と参照範囲をCSS Color 5からバックポート
- 繰り越し操作は無力化操作より前に実施する旨定義
- レガシーrgb()構文では色成分は全て数値または全てパーセントでなければならないことを明確化
- レガシー構文では色成分は全てパーセントまたは全て数値でなければならないことを明確化
- 範囲外アルファの指定例をcalc()の有無で追加
- 末尾ゼロカットシリアライズ例を該当テキストに配置
- 例の説明を明確化、text-shadowの値を使用
- currentColorの解決方法を明確化
- 謝辞の更新
- 無彩色はa,bやクロマが欠損とは限らないことを明記
- HSLおよびHWBをアンバウンドガマット化、ラウンドトリップ性向上
- HSLのパーセント参照範囲を定義
- 現代色構文のhsl()/hsla()は数値とパーセント混在可
- 現代色構文のrgb()/rgba()は数値とパーセント混在可
- 「modern color syntax」を定義(レガシー色構文は既に定義済み)
- 「analogous components」用語を一貫使用
- 補間に全ての定義済み色空間を許容
- color()関数はRGBまたはXYZの3パラメータ必須であることを明確化
- 名前付き色・システムカラー・transparentのシリアライズを明確化
- Lab、LCH、Oklab、OKLChの指定値を定義
- その他sRGB色の指定値も定義
- 名前付き色・システムカラーの指定値を定義
- アルファ・Lightness・Chroma・Hueはパース値時にクランプ
- specular whiteやCIE Lightness言及削除
- as-specified Hueは保持不要、[0,360]にクランプ
- Lightnessや数値のシリアライズ例を一貫性あるものに
- 細かな誤記修正・編集上の明確化
2022年7月5日の勧告案以降の変更点
- 色相補間「指定値」を削除
- 色相補間角度をより厳密に定義、360deg差も維持
- 繰り越しアルファのpremultiplication例追加
- L=100%でa,bとC,hが無力化され白を表すことを明確化
- L=400言及削除(hdr-CIELAB用でCIE Labには非該当)
- Oklab/OKLChの表記を一貫して大文字小文字統一
- 色の有効/無効・ガマット内外の定義を用語セクションへ移動
- 「長い」色相補間の定義修正
- host構文の概念をさらに明確化
- カラースウォッチのアクセシビリティ改善
- レガシー形式では「none」非サポートであることを明示
- hue生成規則から「none」削除(レガシー構文では不可のため)
- CMYK・CMYKOGVの残り参照削除、CSS Color5へ移動
- 補間対象色の欠損値は繰り越しで処理することを明確化
- xyz-paramsの構文を数値とパーセント両対応にし、本文と合わせた
- 全ての例・図にIDとself-linkを付与
- ガマットマッピング序文の重要性を実装者向けに明示
- カスタム色空間の残り言及削除(機能はCSS Color 5へ移動済み)
- <color>や<alpha-value>の構文をリファクタリング
- 読みやすさ向上のため編集順序を整理
- ガマットマッピング疑似コードから不要なdeltaE呼び出し削除
2022年6月28日の草案以降の変更点
- 勧告案ドラフトへのステータス更新
2022年4月28日の草案以降の変更点
- opacityプロパティをモジュール冒頭(colorプロパティの隣)に移動し、詳細前に配置
- colorプロパティの説明を改善、他プロパティへの影響明記
- 色相調整の「longer」式修正(360度モジュロで等価な色に対応)
- 新たなシステム色2種追加:AccentColorとAccentColorText
- 変換手順全体を新章で説明
- noneアルファのpremultiplication/un-premultiplicationでの扱いを説明
2021年12月15日の草案以降の変更点
- システムカラーは完全解決されるが、強制カラー表示モードでは変更禁止
- color()関数のパラメータ不足時許容処理を削除
- CIE LightnessとOK Lightnessのシリアライズをパーセントではなく数値化
- 廃止システムカラーの等価性を「at-risk」としてマーク
- CIE/OK L,a,b,Cのパーセント値に参照範囲追加
- rect/polar色空間の乗算済み・解除サンプルコードあり旨記載
- ガマット外範囲クランプ処理をプローズ・疑似コード両方に追加
- ProPhoto RGB / ROMMの規範的参照追加
- sRGB/Display P3の黒点値を参照サラウンドに合わせ修正
- Display P3の規範的参照追加
- 白より白・黒より黒の色のガマット縮小で無限ループ回避
- none値のシリアライズ明確化
- Oklabで補間opt-inを非レガシーカラーに明示
- 乗算済み処理の仕様(none値含む)を定義
- rgbの欠損値は0でシリアライズされることを明確化
- calc()でのnone値扱い明確化
- System Colorsの表記ゆれ修正
- SelectedItemとSelectedItemTextの例追加
- レガシーカラー有無を明示
- CIE XYZの規範的参照追加
- HWBとHSLの規範的参照追加
- hwb()はレガシー構文ではないため、古いカンマ区切り形式非対応と明記
- レガシーカラーのみガマットマッピング、他はunboundedと明記
- spectrophotometer/spectroradiometerの用語明確化
- 細かな誤記修正・文法改善
2021年6月1日の草案以降の変更点
- ガマットマッピングセクション追加、CSSガマットマッピングアルゴリズムをOKLChのクロマ縮小+局所MINDEで定義
- color(xyz ...)の算出値はcolor(xyz-d65 ...)
- 補間色空間にsrgb-linear追加
- Colors 3からの変更点セクション更新
- Oklab/OKLCh値の解決セクション追加
- srgb-linear色空間追加
- @color-profile/device-cmykはLevel 5へ移動(CSSWG決議による)
- 補間色空間定義
- 行列がrow-majorであること明示、行列掛けライブラリへのリンク追加
- 旧「セキュリティとプライバシー」セクションを分割
- quirks-modeのquirky 16進カラー定義
- device-cmykからフォールバックカラー削除
- デフォルト未宣言host構文はOklabデフォルト
- deltaE OKサンプルコード追加
- OKlab/OKLCh変換サンプルコード追加
- oklab()/oklch()関数追加 Oklab/OKLChの説明追加
- CIE LCHの欠点説明追加
- noneキーワードで全成分欠損可能とし、成分が「無力化」される場合自動で欠損に、NaN成分は「欠損」概念に統一
- x,yホワイトポイントを明示、全体で一貫使用
- host構文の用語定義
- override-color色の解決コンテキスト定義
- システムカラー新ペア追加
- HSL/HWBサンプルコード修正
- HSL値表をエラー無し版に差し替え
- Lea VerouをWG決議で共同編集者追加
- 色相角はunboundedであること明記
- MarkText例修正
- 図・例追加、修正
- 編集上の明確化
- 細かな誤記修正、マークアップ修正
2020年11月12日の草案以降の変更点
- Lab値がほぼ中性色の場合LCHに変換すると色相が不定になる問題を記載
- RGBとLabの相互変換で線形結合となるステップを明確化
- @color-profileにcomponents記述子を追加(CSS Color 5用)
- すべての定義済みRGB色空間は拡張範囲で定義
- 色補間前にガマットマッピングやガマットクリッピングステップがないことを明確化
- レガシーsRGB構文の補間方法を明確化
- color()からlabオプションを削除
- 定義済み色空間間の相互変換手順を列挙
- color spaceという用語を一貫して2語で使用
- 混色時の色空間選択についてより多くの指針を提供
- 例を再計算し精度向上
- 色相補間の例を追加
- color()構文からフォールバックオプションを削除し簡素化
- @color-profileからリンク可能なICCプロファイルの種類を明確化
- 稀なICC Named Colorsのサポートを削除
- 標準ホワイトポイント色度の精度向上
- 定義済み色空間の説明から商標削除
- 補間説明をより一般的な色空間補間に言い換え
- アクセシビリティ考慮事項セクション修正
- color()の色空間引数はsRGBでも必須であることを明確化
- currentColorはsRGBに限定されないことを明確化
- sRGB→XYZ→sRGBの行列に微修正、ラウンドトリップ精度向上
- rec2020転送関数を明確化、正しいITU Rec BT.2020-2参照元を明記
- フォールバック例を正しい構文へ修正
- 非レガシーカラーをガンマ符号化空間で補間することを強制しない
- 乗算済みアルファ補間を定義
- currentColorへの補間・currentColorからの補間への対応着手
- NaN色相での色相補間定義
- 色補間を一般化
- Labで補間、必要に応じてLCGへオーバーライドすることを定義
- 色相補間の修正
- 色相角補間を定義
- 補間セクション追加
- 例の構文修正
- color()でパーセント許容成分を明確化
- lch()は自身としてシリアライズ、lab()としてではないよう変更
- 非レガシーsRGBの各成分に最低10ビット精度を要求(color()内)
- color()は色空間が必須になった
- lab()とcolor(lab)で最低精度を一貫
- color()関数のフォールバック手順明確化(最初の有効なガマット内色、なければガマットマッピングされた最初の有効色、なければ透明黒)
- opacityプロパティと色の透明度の違い(重なったテキストグリフ描画時など)を明確化
- ΔE2000のサンプル(検証済み)コード追加
- 未定義だったchromaticityの用語定義と例、色度図の定義を追加
- 色の加法性の説明と例追加
- WPTテストへのソースリンク追加
- color、valid colorの定義をエクスポート、他仕様参照可能に
- シリアライズ時の各成分の最低ビット数を定義
- 「applies to」定義を更新(CSS全体的な変更)
- 定義済み色空間に画像状態(表示参照/シーン参照)追加
- ホワイトポイントの相関色温度(例:D65)を色度座標と並記し明確化
- 丸めは+∞方向であることを明確化
- 誤記修正・マークアップ修正・リンク修正
2019年11月5日の草案以降の変更点
- 他仕様で使う用語をエクスポート
- WCAG 2.0から2.1への要件更新
- シリアライズで使うUnicode文字を完全定義
- 特別な名前付き色のシリアライズ定義
- device-cmyk()のシリアライズ定義
- color()のシリアライズ定義
- 最大限Web互換性のある方法でRGBシリアライズを完全定義
- LabとLCHのシリアライズ定義
- アルファ値のシリアライズを完全定義
- RFC2119を偶発的に避けるための一貫性パス
- 全例にID付与、参照可能に
- 解決色・シリアライズ色を分離
- (セキュリティ)ICCプロファイルに実行コード無し
- プロファイル付き色の範囲外の意味定義
- 範囲外クランプの明確化
- 指定値の例を追加
- 計算値の明確化
- フィンガープリント耐性、廃止システムカラーの強制マッピング
- X11色の標準化の歴史と理由に関する説明ノート追加
- hwbサンプルコード修正
- MacBethパッチのDeltaE2000値表追加
- ICCプロファイルのInternet Media typeに関する説明ノート追加
- PNGのsRGBチャンクへの参照追加
- CMYK⇔Lab変換明確化
- RGB⇔Lab変換明確化
- HSLとLCHの比較増強
- Rec BT.2020色空間の説明追加
- prophoto-rgbの記述更新
- Value Definitionsセクションから重複した「keywords」削除
- 無効色の例追加
- 複数フォールバックの例追加
- 細かな誤記・マークアップ修正
- 未宣言カスタム色空間の扱い明確化
- 例や説明ノートの補強
- 有効/無効ICCプロファイルの扱い
- 明示的タグ付き画像の色空間の扱い定義
- 4k, SDRビデオの色空間定義
- ユーザーコントラスト設定は最優先である必要がある旨明記
- 強制カラー表示モード外でのシステムカラーの意味明確化
- デフォルトスタイルルール更新
- color()にCIE XYZ色空間追加
- 色相角の明確化、NaN明示的許容
- システムカラーのペアリング説明強化、AAアクセシブルコントラスト要求
- 重なったグリフとopacityプロパティの相互作用に関する警告追加
- color定義の文法修正
- Highlight/HighlightTextの説明改善
- prophoto-rgb転送関数修正
- prophoto-rgb主色の精度向上
- 「表示不可」定義開始
- canvas面関連段落削除
- buttonborder、mark、marktextシステムカラー追加
- sRGB→HWB逆変換追加
- 極座標色空間は円筒座標系であり球座標系でないことを明記
- アクセシビリティ考慮事項セクション追加
- クロマ縮小によるガマットマッピングの説明開始(従来の成分クリッピングでなく)
- rec2020の白色度修正
- @color-profileでdevice-cmyk利用可能に、CMYK→colorアルゴリズムは単純変換を最終手段に
- 印刷向けCMYK/KCMYOGV例追加
- ユーザー定義色空間はdashed-ident化、定義済み色空間拡張性向上
- color()関数にlabオプション追加
- CIE Labの規範的参照追加
- prophoto-rgbはD50ホワイトポイント使用のため色順応不要であること明記
- LCHで角度増加方向明確化
- 色名はASCII大文字小文字区別なしであること明記
- colorプロパティの初期値はCanvasText
- gray()関数削除(CSS WG決議による)
- 定義散在を新用語集セクションに統合
- 図や例の追加・修正
- 細かな編集明確化・スペルチェック・誤記修正・マークアップ修正
2016年7月5日の草案以降の変更点
- LabとLCHのLightnessをパーセント値化、CSS互換性向上
- 色値のクランプ処理明確化
- 不透明度にパーセント値許容
- sRGBと線形光sRGBの用語定義、他仕様で利用可
- CSSシステムカラー新リスト追加、Text→CanvasTextに名称変更
- システムカラーキーワードは自身で計算される
- システムカラーに計算値・使用値追加
- 非廃止システムカラーの説明をforced-colorsモード中心に再構成
- 定義済み色空間のハイフン表記一貫化
- 不透明要素は配置されていなくてもレイヤーで描画される旨テキスト復活
- colorプロパティ初期値は黒
- LCHの色相は360degモジュロ(現在はこの変更は戻された)
- LCH/LabのL許容範囲・L=100の意味明確化
- 動画で使われる色空間の参照更新
- prophoto-rgb定義済み色空間追加
- display-p3の黒・白の輝度レベル修正
- display-p3転送関数明確化
- a98-rgb色空間追加、主色色度表修正
- currentColorの計算値は解決色でないこと明確化
- 例の構文最新仕様準拠で更新
- color-mod()関数削除
- propdef表から「media」削除
- 「transparent black」「opaque black」用語をエクスポート・一貫使用
- 算出値(パーセントなど)の説明明確化
- 色成分の必要精度と丸め規則明確化
- colorプロパティはカラーフォントグリフには効果なし(currentColor参照時等除く)ことを明確化
- 色値の解決方法明確化
- HSL、HWB、名前付き色はsRGBに解決されることを明確化
- device-cmyk→sRGB変換簡素化
- 以前のカンマ区切り色構文は「レガシー」表記に、例をカンマ無し形式へ変更
- 表示色がデバイスガマットに制限されるという余計な要求削除
- P3→display-p3に名称変更、DCI P3と主張しないよう明確化
- color()関数のパラメータ説明改善
- @color-profile識別子で定義済み空間禁止
- 「color」「color-adjust」「opacity」プロパティ定義の正規順序追加
- アルファ合成定義をSVG11→CSS Compositingに切り替え
- サンプル変換コードは非規範である旨明記
- セキュリティ・プライバシー考慮事項追加
- 複数の参照を最新版へ更新
- インライン課題をGitHub issueへのリンクに変換
- 細かな編集明確化・フォーマット・マークアップ改善
Colors 3からの主な変更点
CSS Color 3と比較した主な変更点は、 CSSの色がsRGBの狭いガマットに制限されなくなったことです。
これをサポートするため、いくつかの新機能が追加されました:
その他の技術的な変更:
- <color>のシリアライズはCSS Object Modelではなく本仕様で定義
- hwb()関数(sRGB色をHWB記法で指定可能)
- 名前付き色rebeccapurple追加
さらに、構文上のいくつかの変更もあります:
- rgb()とrgba() 関数は、<number> を受け付け、<integer>ではなくなりました。
- hsl()とhsla() 関数は色相に<angle> だけでなく<number> を受け付けます。
- rgb()、rgba()、 hsl()、 hsla() はすべて互いにエイリアス(全てオプションのアルファを持つ)
- rgb()、rgba()、 hsl()、 hsla() に新しい構文(スペース区切り引数+スラッシュ区切り不透明度)が追加 全てのカラー関数はこの構文を使用 CSSの関数記法設計原則に準拠
- <alpha-value>の使用箇所はすべて <percentage>や <number>も受け付けるように
- 4桁・8桁の16進カラーが追加され、透明度指定可能
- none値が追加され、無力成分を表現可能に
20. セキュリティ上の考慮事項
システムカラーは、 実際にユーザーのシステムカラーに対応している場合、 セキュリティリスクとなります。 これは悪意のあるサイトが システムのUIのようなインターフェースを作りやすくなるためです。 ただし、現行のシステムカラーは「汎用的」に定義されているため、 このリスクは軽減されていると考えられます。
21. プライバシー上の考慮事項
本仕様は「システム」カラーを定義しており、 理論上ユーザーのOS設定の詳細を露出させる可能性があり、 これはフィンガープリントリスクとなります。
22. アクセシビリティ上の考慮事項
本仕様は、区別のために色だけを使わないことを作者に推奨しています。
本仕様は、特定のシステムカラーの前景/背景ペアで十分なコントラストを確保するようブラウザに推奨しています。 AAやAAAのコントラスト比などの厳格な要件も検討されましたが、 ブラウザはしばしばOSやユーザーが選択した色をそのまま使うため、 (片頭痛やてんかんなどのため低コントラストを求めるケースも含め)CSSWGとしては特定のコントラスト水準を義務付けられませんでした。