CSS画像モジュール レベル3

W3C 候補勧告ドラフト

この文書の詳細
このバージョン:
https://www.w3.org/TR/2023/CRD-css-images-3-20231218/
最新公開バージョン:
https://www.w3.org/TR/css-images-3/
編集者ドラフト:
https://drafts.csswg.org/css-images-3/
過去のバージョン:
履歴:
https://www.w3.org/standards/history/css-images-3/
実装レポート:
https://wpt.fyi/results/css/css-images?label=experimental&label=master&aligned
フィードバック:
CSSWG イシューレポジトリ
仕様内インライン
編集者:
Tab Atkins Jr. (Google)
Elika J. Etemad / fantasai (Apple)
Lea Verou (招待専門家)
この仕様への編集提案:
GitHub 編集

概要

このモジュールは、<image>型およびいくつかの置換要素に関連するCSSレベル3の機能を含みます。 これはCSSレベル2[CSS2]の機能を含み、さらに拡張しています。 CSS2.1と比較した主な拡張点は、<url>型の<image>型への一般化、 <image>型への複数の追加、CSSにおける画像やその他の置換コンテンツ向けの汎用的なサイズ決定アルゴリズム、 いくつかの<image>型の補間に関する定義、 そして置換要素とCSSのレイアウトモデルとの相互作用を制御するいくつかのプロパティです。

CSSは、構造化文書(HTMLやXMLなど)の画面、紙などでのレンダリングを記述するための言語です。

この文書の位置付け

このセクションは、公開時点でのこの文書の位置付けについて説明します。 現在のW3Cの公開リストおよびこの技術報告書の最新版は https://www.w3.org/TR/ のW3C技術報告書インデックスで確認できます。

この文書は CSSワーキンググループ により 候補勧告ドラフトとして勧告トラックを用いて発行されました。 候補勧告としての公開は、W3Cおよびその会員による支持を意味するものではありません。 候補勧告ドラフトは、ワーキンググループが次の候補勧告スナップショットに含めることを意図した、前回の候補勧告からの変更を統合したものです。

これはドラフト文書であり、随時更新、差し替え、または他の文書によって廃止されることがあります。 この文書を進行中の作業以外のものとして引用するのは適切ではありません。

ご意見は、GitHubでイシューを提出(推奨)し、 仕様コード「css-images」をタイトルに含めてください。例:「[css-images] …コメントの概要…」。 すべてのイシューとコメントはアーカイブされています。 または、(アーカイブあり) 公開メーリングリストwww-style@w3.orgでもフィードバックを送ることができます。

この文書は2023年11月3日W3Cプロセス文書に従って管理されています。

この文書はW3C特許ポリシーのもとで活動するグループによって作成されました。 W3Cは、グループの成果物に関連してなされた特許開示の公開リストを管理しています。 そのページには特許開示の方法も記載されています。 特許に関して実際の知識を持ち、その特許が必須クレームを含むと考える個人は、 W3C特許ポリシー第6節に従って情報を開示する必要があります。

以下の機能はリスクあり(at-risk)とされており、CR期間中に削除される可能性があります:

「at-risk(リスクあり)」はW3Cプロセス上の専門用語であり、必ずしもその機能が削除や遅延の危険にあることを意味しません。 これは、ワーキンググループがその機能の相互運用可能な実装が迅速に得られない可能性があると考えており、 必要に応じて提案勧告段階に移行する際、まずその機能を除いた新たな候補勧告を発行せずに機能を削除できることを意味します。

1. はじめに

CSSレベル1および2では、 background-imageプロパティで使われるような画像値は、 単一のURL値でしか指定できませんでした。 このモジュールは2D画像を表現する追加の方法を導入します。 例えばグラデーションとして指定できます。

このモジュールはまた、ラスタ画像の操作、 およびサイズ指定位置指定など、 画像のような置換要素をCSSレイアウトアルゴリズムで決定されるボックス内で制御するためのいくつかのプロパティも定義します。 また、画像や同様の置換要素のためのCSSの汎用的なサイズ決定アルゴリズムも定義します。

この小節(上記)は規範的ではありません。

1.1. モジュール間の関係

このモジュールは、<image>値型を定義および拡張します。 この型は[CSS-VALUES-3]で定義されています。 また、CSS1およびCSS2のbackground-imagecursorlist-style-imageの定義において、 <url>型を <image>で置き換え、 contentプロパティの値として <image><url>の代替として追加します。 CSS2.1以降のCSS仕様では、2D画像が必要な場面で<image>表記を用いることが想定されています。 (例:[CSS3BG]などを参照。)

このモジュールで定義されるプロパティのうち、 image-rendering だけが::first-lineおよび::first-letterに適用されます。

1.2. 値の定義

この仕様は CSSプロパティ定義の規約[CSS2]より)および 値定義構文[CSS-VALUES-3]より)に従います。 この仕様で定義されていない値型は、CSS Level 2 Revision 1 [CSS2]で定義されています。 他のCSSモジュールがこれらの値型の定義を拡張する場合があります。 例えば、[CSS-VALUES-3]は本モジュールと組み合わせることで initialキーワードをプロパティ値として追加します。

各プロパティ定義に記載された値に加え、 この仕様で定義されたすべてのプロパティは CSS全体キーワードもプロパティ値として受け付けます。 可読性のため明記はしていません。

2. 画像値:<image>

<image>値型は2D画像を表します。 これはurl参照またはカラグラデーションで指定できます。 その構文は以下の通りです:

<image> = <url> | <gradient>

<image>は多くのCSSプロパティで使用できます。 例としてbackground-imagelist-style-imagecursorプロパティなど(これらではプロパティ値内の<url>成分を置き換えます)。

画像が無効となる場合もあります。 例えば<url>が有効な画像形式でないリソースを指していたり、ロードに失敗した場合です。 無効画像透明の単色画像として描画され、 自然寸法を持ちません。 ただし、無効画像は 文脈によってはエラー処理の発動条件となります。 例えばlist-style-image無効画像の場合、 noneとして扱われ、 list-style-typeが代わりに描画されます。[CSS2]

画像がロード中の場合は ローディング画像となります。 ローディング画像無効画像ではありませんが、類似の挙動をします。 つまり、透明の単色画像として描画され、 自然寸法を持たず、 フォールバック描画が提供される文脈ではそれが発動する場合がありますが、 フォールバックリソースのロードは行いません。 また、ローディング画像がすでにロード済みの画像を置換している(例えば文書やスタイルシートの変更による)場合でUAがその情報を追跡しているならば、 既存の画像をローディング画像の代わりに描画し続けることができます。

部分的にロードされた画像(自然寸法は判明しているが画像データが完全には読み込まれていないもの)は、 ローディング画像として扱うか、 データの一部のみで描画された画像として扱うことができます。 例えばUAはインターレースGIFの最初のパスのピクセルデータがロードできた時点で描画を始めたり、 画像ヘッダ(サイズ情報を含む)がパースできた時点で描画し、 データが追加でロードされるごとに描画を更新したりすることがあります。 あるいは、画像全体がロードされるまで待ってから使用する場合もあります。

算出 <image> 値は 指定値であり、そこに含まれる<url><color><length>が算出されたものになります。

2.1. 画像参照:url() 記法

画像を指定する最も簡単な方法は、URLで画像ファイルを参照することです。 これはurl()記法で行えます。 この記法は[CSS-VALUES-3]で定義されています。

下記の例では、背景画像をurl()構文で指定しています:
background-image: url(wavy.png);

UAがURLの内容を画像としてダウンロード、パース、または正常に表示できない場合 (すなわち、画像が完全にデコード可能でない場合)、 それは無効画像として扱われなければなりません。

2.1.1. 参照または画像として曖昧なURL

URLは多くの文脈で多様なリソース型のために使われるため、 その解釈も多様です。 通常はURLが現れる文脈によって リソースの解釈が明らかになりますが、 場合によっては曖昧になることもあります。 例えば、 mask-image<url>値がSVGファイルを指している場合などは、 ファイル内の要素参照とも、<image>としても解釈できます。

曖昧画像URLとは、 <url>値であり、 <image>または要素参照のいずれかとして解釈可能なものです。 曖昧画像URLフラグメントのみのURLである場合は、 要素参照として扱わなければなりません。 それ以外で曖昧画像URLが リソース内の要素で、その文脈に適切な型の要素を指している場合 (例:mask-imageプロパティなら mask要素など)、 要素参照と解釈します。 そうでない場合は<image>として扱われます。

曖昧画像URL概念を使う仕様は、 どの要素がURLの有効な参照先となるかや他の条件を定義しなければなりません。

例えば、 mask-image: url(icon.svg#foo)のような参照は SVGドキュメント内の<mask id="foo">要素を指している可能性もあれば、 <g id="foo">要素を指しており、 :target 疑似クラスによって画像としての描画方法が変わる場合もあります。

このような場合、 "icon.svg"ファイルが読み込まれて調査されます。 もし#foo要素が本当に maskであれば、 url()はその要素への参照として扱われます。 そうでなければ画像として解釈されます。

2.1.2. 画像メタデータ

画像には 解像度や向きなどの レンダリング方法を指定するメタデータが含まれることがあります。 一部の画像フォーマットでは こうしたメタデータをファイル内の柔軟な位置に配置できますが、 画像データのにメタデータが存在する場合、 UAによる画像の「プログレッシブデコード」や データストリーム中での表示能力が損なわれます。

この問題の影響を減らすため:

3. グラデーション

グラデーションとは、ある色から別の色へと滑らかに変化する画像です。 これは背景画像やボタンなど、さまざまな場面で微妙な陰影をつけるためによく使われます。 この節で説明するグラデーション関数は、 著者が簡潔な構文でこのような画像を指定できるようにし、 UAがページ描画時に自動的に画像を生成できるようにします。 <gradient>の構文は以下の通りです:

<gradient> =
  <linear-gradient()> | <repeating-linear-gradient()> |
  <radial-gradient()> | <repeating-radial-gradient()>

この仕様で定義される他の<image>型と同様に、 グラデーションは画像を受け付ける任意のプロパティで使用できます。 例えば:

グラデーションは、具体的なオブジェクトサイズという ボックス内に描画されます(これをグラデーションボックスと呼びます)。 ただし、グラデーション自体には自然寸法はありません。

例えば、グラデーションを背景として使う場合、 デフォルトではグラデーションは要素のパディングボックスと同じサイズのグラデーションボックスに描画されます。 background-size100px 200pxのように明示的に指定されていれば、 グラデーションボックスは幅100px高さ200pxとなります。 同様に、グラデーションをlist-style-imageで使う場合、 ボックスは1em四方(そのプロパティのデフォルトオブジェクトサイズ)になります。

グラデーションは、開始点終了点グラデーションライン (グラデーションの種類によっては線、光線、螺旋など)を定義し、 この線上の各点に色を指定することで指定します。 色は滑らかに補間されて線上の他の場所も塗りつぶされ、 各グラデーション型はグラデーションラインの色を実際のグラデーションに適用する方法を定義します。

3.1. 線形グラデーション:linear-gradient() 記法

線形グラデーションは、直線状のグラデーションラインを指定し、 その線上に複数の色を配置して作成されます。 画像は無限のキャンバスを作り、 グラデーションラインに垂直な線で塗りつぶすことで構成されます。 塗りつぶし線の色はグラデーションラインとの交点の色となります。 これによって各色から次の色まで滑らかに変化する効果が生まれ、 指定した方向へ進みます。

3.1.1. linear-gradient()構文

linear-gradient()記法は CSSで線形グラデーションを指定します。 その構文は以下の通りです:

<linear-gradient()> = linear-gradient( [ <linear-gradient-syntax> ] )

<linear-gradient-syntax> = [ <angle> | to <side-or-corner> ]? , <color-stop-list>

<side-or-corner> = [left | right] || [top | bottom]

関数の第1引数はグラデーションラインを指定し、 これによりグラデーションの方向とカラーストップの配置が決まります。 省略可能で、省略時はto bottomが既定値となります。

グラデーションラインの方向は2通りで指定できます:

<angle>を使う場合

この引数では0degが上方向を指し、 正の角度は時計回り回転を表します。 したがって90degは右方向となります。

<angle> がゼロの場合は単位識別子を省略できます。

キーワードを使う場合

引数がto topto rightto bottomto leftのいずれかの場合、 グラデーションラインの角度は 0deg90deg180deg270degとなります。

引数がto top leftのようにボックスの隅を指定している場合は、 グラデーションラインは 指定された隅と同じ象限を指すような角度となり、 グラデーションボックスの隣接2隅を通る直線に垂直になります。 これにより50%のカラーストップは隣接隅2カ所を通ります(参照)。

グラデーションボックスの中心から 指定角度で両方向に線を延長します。 終了点は、グラデーションラインに垂直な線を引いたとき、 指定方向のグラデーションボックスの隅と交わる点です。 開始点も同様に、反対方向で決定します。

注記:このモジュールの次のレベルでは、 グラデーションの方向をテキスト方向やwriting-modeに相対的に指定できる機能が提供される予定です。

[An image showing a box with a background shading gradually from white in the bottom-left corner to black in the top-right corner.  There is a line, illustrating the gradient line, angled at 45 degrees and passing through the center of the box.  The starting point and ending point of the gradient line are indicated by the intersection of the gradient line with two additional lines that pass through the bottom-left and top-right corners of the box.]

この例は、上記ルールに基づくグラデーションラインの計算方法を視覚的に示しています。 ここではグラデーションラインの開始点と終了点、 実際のグラデーションが background: linear-gradient(45deg, white, black);を持つ要素によって生成されています。

開始点と終了点はボックス外側にあるものの、 コーナーでちょうど純白、対角のコーナーでちょうど純黒となるように精密に配置されています。 これは意図的なもので、線形グラデーションでは常にこのようになります。

前提:

グラデーションライン(開始点終了点間)の長さは:

abs(W * sin(A)) + abs(H * cos(A))

グラデーションのカラーストップは典型的には 開始点終了点グラデーションライン上に配置されますが、 必須ではありません。 グラデーションラインは両方向に無限に延長可能です。 開始点と終了点は単なる基準点であり、 開始点は0%や0pxなどの色位置指定の基準、終了点は100%の基準です。 カラーストップは0%より前や100%より後にも指定できます。

線形グラデーションの任意の点の色は、 その点を通るグラデーションラインに垂直な唯一の直線を見つけ、 その直線が交わるグラデーションライン上の色がその点の色となります。

3.1.2. 線形グラデーションの例

以下のすべてのlinear-gradient()の例は、幅200px高さ100pxのボックスに背景として適用されているものと仮定します。

以下は基本的な垂直グラデーションを指定する様々な方法です:
linear-gradient(yellow, blue);
linear-gradient(to bottom, yellow, blue);
linear-gradient(180deg, yellow, blue);
linear-gradient(to top, blue, yellow);
linear-gradient(to bottom, yellow 0%, blue 100%);

この例はグラデーションの角度指定の使い方を示しています。角度はコーナー間の角度と正確には一致しませんが、グラデーションラインは依然として、グラデーションが左上角で正確に黄色、右下角で正確に青になるようにサイズが決定されます。
linear-gradient(135deg, yellow, blue);
linear-gradient(-45deg, blue, yellow);

この例は3色グラデーションと、ストップ位置を明示的に指定する方法を示しています:

linear-gradient(yellow, blue 20%, #0f0);

この例はキーワードで指定した隅から隅へのグラデーションを示しています。 グラデーションが下左隅と右上隅でそれぞれ赤と青になる点が、2番目の例と全く同じであることに注目してください。 さらに、グラデーションの角度は自動的に計算され、50%(この場合は白)の色が左上隅から右下隅まで横断するようになります。
linear-gradient(to top right, red, white, blue)
(画像はSVGが必要です)

3.2. 放射状グラデーション:radial-gradient() 記法

放射状グラデーションでは、 線形グラデーションのようにグラデーションボックスの片側から他方へ色が滑らかに変化するのではなく、 1点から発生し、円形または楕円形に外側へ滑らかに広がります。

radial-gradient() 記法は、グラデーションの中心(0% の楕円が位置する場所)と、終端形状(100% の楕円)の大きさと形を指定することで、放射状グラデーションを定義します。 カラーストップはリストとして与えられ、 linear-gradient() と同様です。 グラデーション中心 から 終端形状 へ(場合によってはそれを超えて)進行しながら、 指定されたカラーストップに従って、均等に拡大された同心楕円が描画・着色されます。

3.2.1. radial-gradient()構文

放射状グラデーションの構文は次の通りです:

<radial-gradient()> = radial-gradient( [ <radial-gradient-syntax> ] )

<radial-gradient-syntax> =
  [ <radial-shape> || <radial-size> ]? [ at <position> ]? ,
  <color-stop-list>

<radial-size> = <radial-extent> | <length [0,∞]> | <length-percentage [0,∞]>{2}

<radial-extent> = closest-corner | closest-side | farthest-corner | farthest-side

<radial-shape> = circle | ellipse
これは、幅5emで中心が左上隅に配置された円形の放射状グラデーションの例です:
radial-gradient(5em circle at top left, yellow, blue)

注:将来的なレベルでは、-webkit-gradient()関数のようにグラデーションのフォーカスを動かす機能が追加されるかもしれません。 「from <position>」「from offset <offset>」については、提案Issue 1575を参照してください。

各引数の定義は次の通りです:

<position>
グラデーションの中心を決定します。 <position>値型 (background-positionでも使われます)は[CSS-VALUES-3]で定義されており、 オブジェクト領域の中心点を基準に、グラデーションボックスを配置領域として解決されます。 省略時はcenterが既定値です。
<radial-shape>
circle または ellipse のいずれかを指定できます。 これによりグラデーションの終了形状が円か楕円か決まります。 <radial-shape>が省略された場合は、 <radial-size>が単一の<length>なら終了形状は円、 それ以外は楕円が既定値です。
<radial-size>
グラデーションの終了形状のサイズを決定します。 省略時はfarthest-cornerが既定値です。 明示的に、またはキーワードで指定できます。 キーワード定義のために、グラデーションボックスの辺は両方向に無限に延長されるものとします。

終了形状が楕円の場合、その軸は水平方向と垂直方向に揃えられます。

circleおよびellipseの両グラデーションは、以下の<radial-extent>値を受け付けます:

closest-side
終了形状は、 グラデーション中心に最も近いグラデーションボックスの辺にちょうど接するようにサイズ決定されます。 形状が楕円の場合、各軸ごとに最も近い辺に正確に接します。
farthest-side
closest-sideと同様ですが、 終了形状は最も遠い辺を基準にサイズ決定されます。
closest-corner
終了形状は、 グラデーション中心に最も近いグラデーションボックスの隅を通るようにサイズ決定されます。 形状が楕円の場合、終了形状closest-sideを指定した場合と同じアスペクト比になります。
farthest-corner
closest-cornerと同様ですが、 終了形状は最も遠い隅を基準にサイズ決定されます。 形状が楕円の場合、終了形状farthest-sideを指定した場合と同じアスペクト比になります。

<radial-shape>circleまたは省略の場合は、 <radial-size>を次のように明示できます:

<length [0,∞]>
円の半径を明示的に指定します。負値は無効です。

注:パーセンテージはここでは使用できません。 パーセンテージは楕円グラデーションのサイズ指定にのみ使えます。 どの寸法に対する割合とみなすか答えが複数考えられるため、この制限があります。 将来のレベルで円サイズのパーセンテージ指定や、どの寸法を基準にするかのより明示的な制御が提供されるかもしれません。

<radial-shape>ellipseまたは省略の場合、<radial-size>には次のように明示できます:

<length-percentage [0,∞]>{2}
楕円のサイズを明示的に指定します。 最初の値が水平半径、2番目が垂直半径です。 パーセンテージ値はグラデーションボックスの対応する寸法に対する割合です。 負値は無効です。
上記定義を展開すると、構文は次のようになります:
radial-gradient() = radial-gradient(
  [ [ circle               || <length [0,∞]> ]                          [ at <position> ]? , |
    [ ellipse              || <length-percentage [0,∞]>{2} ]            [ at <position> ]? , |
    [ [ circle | ellipse ] || <radial-extent> ]                     [ at <position> ]? , |
    at <position> ,
  ]?
  <color-stop-list>
)

3.2.2. カラーストップの配置

カラーストップは、線形グラデーションのグラデーションラインのように、1点から一方向に無限に伸びる「光線」状のグラデーションライン上に配置されます。 グラデーションライン開始点はグラデーションの中心にあり、右方向へ伸び、 終了点はこのグラデーションライン終了形状と交わる点です。 カラーストップは0%より前にも配置できますが、 負領域は直接描画には利用されません。 ただし、そこに配置されたカラーストップは補間や繰り返しによって非負領域の色に影響を与えます(繰り返しグラデーション参照)。 例:radial-gradient(red -50px, yellow 100px)は、中心が赤みがかったオレンジ(#f50)から黄色へ変化する楕円グラデーションになります。 100%を超える位置は中心からそれだけ遠い位置を示します。

任意の点のグラデーションの色は、まずその点を通り、終了形状と同じ中心・向き・アスペクト比を持つ唯一の楕円を特定し、その楕円がグラデーションラインと交わる位置の色とします。

3.2.3. 縮退した放射状グラデーション

位置・サイズ・形状の組み合わせによっては、半径0の円や楕円が作られることがあります。 例えば中心がグラデーションボックスの辺上にあり、closest-sideclosest-cornerが指定された場合や、サイズ・形状を明示しどちらかの半径が0の場合です。 このような縮退ケースでは、グラデーションは次のように描画されなければなりません:

終了形状が半径0の円の場合:

終了形状がごく小さい半径(0より大きい任意の非常に小さい値)の円であるかのように描画します。これによりグラデーションは円状に見え続けます。

終了形状の幅が0の場合(高さは問わず):

終了形状がごく小さい幅(0より大きい任意の非常に小さい値)と非常に大きい高さの楕円であるかのように描画します。これによりグラデーションは中心を対称軸とした水平方向の線形グラデーションのように見え、パーセント指定のカラーストップはすべて0pxに解決されます。

それ以外で終了形状の高さが0の場合:

終了形状がごく小さい高さ(0より大きい任意の非常に小さい値)と非常に大きい幅の楕円であるかのように描画します。これにより、グラデーションは最後のカラーストップの色(繰り返しなら平均色)で塗りつぶされた単色画像のように見えます。

3.2.4. 放射状グラデーションの例

以下のすべての例は幅200px高さ100pxのボックスに適用されています。

これらの例は放射状グラデーションの基本構文の異なる書き方を示しています:
radial-gradient(yellow, green);
radial-gradient(ellipse at center, yellow 0%, green 100%);
radial-gradient(farthest-corner at 50% 50%, yellow, green);

radial-gradient(circle, yellow, green);

radial-gradient(red, yellow, green);

この画像は、ボックスの中心以外から始まるグラデーションを示しています:
radial-gradient(farthest-side at left bottom, red, yellow 50px, green);

ここではclosest-sideグラデーションを例示します。
radial-gradient(closest-side at 20px 30px, red, yellow, green);
radial-gradient(20px 30px at 20px 30px, red, yellow, green);

radial-gradient(closest-side circle at 20px 30px, red, yellow, green);
radial-gradient(20px 20px at 20px 30px, red, yellow, green);

3.3. 繰り返しグラデーション:repeating-linear-gradient()およびrepeating-radial-gradient()記法

linear-gradient()radial-gradient()に加え、 この仕様ではrepeating-linear-gradient()repeating-radial-gradient()値も定義します。 これらの記法は、それぞれ対応する非繰り返し型と同じ値を受け付け、同様に解釈されます。

<repeating-linear-gradient()> = repeating-linear-gradient( [ <linear-gradient-syntax> ] )
<repeating-radial-gradient()> = repeating-radial-gradient( [ <radial-gradient-syntax> ] )

ただし描画時には、カラーストップが両方向に無限に繰り返され、 それぞれの位置は、最後と最初に指定したカラーストップの位置の差の倍数だけシフトされます。 例:repeating-linear-gradient(red 10px, blue 50px)は、linear-gradient(..., red -30px, blue 10px, red 10px, blue 50px, red 50px, blue 90px, ...)と同等です。 最後と最初のカラーストップは各グループの境界で必ず一致するため、グラデーションが同じ色で始まり終わらない場合はその部分で急激な切り替わりが生じます。

繰り返しグラデーションの構文は非繰り返し型と同一です:
repeating-linear-gradient(red, blue 20px, red 40px)

repeating-radial-gradient(red, blue 20px, red 40px)

repeating-radial-gradient(circle closest-side at 20px 30px, red, yellow, green 100%, yellow 150%, red 200%)

最初と最後のカラーストップ間の距離が0でないが、出力デバイスの物理解像度で忠実に描画できないほど十分に小さい場合、実装はグラデーションの平均色を求め、その平均色で塗りつぶした単色画像として描画しなければなりません。

最初と最後のカラーストップ間の距離が0の場合(または実装上の制限で0と見なされる場合)、 実装は、同じ数・色のカラーストップを持つが最初と最後のカラーストップが任意の非ゼロ距離だけ離れており、それ以外は等間隔であるグラデーションの平均色を求め、その平均色を単色画像として描画しなければなりません。

繰り返し放射状グラデーションの終了形状の幅が0でなく高さが0、または実装上の制限で高さが0に近い場合も、平均色を求め、その単色画像として描画しなければなりません。

注:縮退した放射状グラデーションの節で、終了形状の幅が0の場合の調整方法を説明しています。

グラデーションの平均色を求めるには、以下の手順を実行します:

  1. premultiplied RGBA色の空リストlistと、最初と最後のカラーストップ間の距離total-lengthを用意する。

  2. 隣接する各カラーストップのペアごとに、 2点間の距離の半分をweightとし、これをtotal-lengthで割る。 listに2つのエントリを追加する。 1つ目は最初のカラーストップの色をpremultiplied sRGBAで表し、全成分をweight倍したもの。 2つ目も同様に2つ目のカラーストップで計算する。

  3. listの各成分を合計し、平均色として返す。

注: 実装は任意のアルゴリズムを使えますが、上記と同じ結果を出す必要があります。

例えば、次のグラデーションは単色の淡い紫色画像(rgb(75%,50%,75%))として描画されます:
repeating-linear-gradient(red 0px, white 0px, blue 0px);

次のグラデーションも通常は前の例と同様に描画されます(デスクトップモニターでは1/10ピクセル間隔のカラーストップは忠実に描画できないため)。 ただし、例えば要素に "zoom:100;" を適用すれば、通常の繰り返しグラデーションとして描画されます:

repeating-linear-gradient(red 0px, white .1px, blue .2px);

3.4. グラデーションの色の定義

グラデーション内の色は、カラーストップ<color>グラデーションライン上の対応する位置) およびカラートランジションヒント(2つのカラーストップ間の色遷移の中間点を示す位置) をグラデーションライン上に配置することで指定され、 ライン上の各点の色が定義されます。 (各グラデーション関数は、グラデーションラインの形状や長さ、 開始点終了点も定義します。前述参照。)

グラデーション領域全体の色は、グラデーション関数によって定義されたグラデーションライン上の特定の点に結びつけて決定されます。 UAはグラデーション色をわずかに「ディザリング」(グラデーションライン上の近接色でランダムにピクセルを切り替える)し、より滑らかなグラデーションを実現してもよいです。

3.4.1. カラーストップリスト

カラーストップおよびトランジションヒントは、 カラーストップリストで指定します。 これは2つ以上のカラーストップを、任意のトランジションヒントと交互に並べたリストです。

<color-stop-list> =
  <linear-color-stop> , [ <linear-color-hint>? , <linear-color-stop> ]#
<linear-color-stop> = <color> <length-percentage>?
<linear-color-hint> = <length-percentage>

パーセント値は、グラデーションライン開始点から終了点までの長さに対して解決され、 0%が開始点、100%が終了点となります。 長さはグラデーションライン上で開始点から終了点方向に沿って測定されます。

カラーストップトランジションヒントの位置は通常、 開始点終了点の間に配置されますが、 必須ではありません。 グラデーションラインは両方向に無限に延長されており、どこにでも位置を指定できます。

カラーストップの位置が省略された場合は、自動的に位置が割り当てられます。 カラーストップリストの最初または最後のカラーストップには、それぞれグラデーションライン開始点または終了点が割り当てられます。 それ以外の場合は、前後のストップの中間位置が割り当てられます。 連続する複数のストップが位置を持たない場合は、前後の位置付きストップ間で等間隔に配置されます。 詳細は§ 3.4.3 カラーストップの「補正」を参照してください。

3.4.2. グラデーションラインの着色

カラーストップ位置では、 グラデーションラインはそのカラーストップの色になります。 最初のカラーストップより前では、グラデーションラインは最初のカラーストップの色、 最後のカラーストップ以降は最後のカラーストップの色です。 2つのカラーストップ間では、グラデーションラインの色は2つのカラーストップの色をプリマルチプライドRGBA空間で補間したものとなります。

既定ではこの補間は線形です。2つのカラーストップ間の25%、50%、75%の位置では、それぞれ2色の25%、50%、75%ブレンド色になります。

ただし、2つのカラーストップ間にトランジションヒントが指定された場合、補間は非線形となり、ヒントによって制御されます:

  1. 2つのカラーストップ間の距離に対するトランジションヒントの位置を0〜1の数値で算出する。0はヒントが1つ目のカラーストップ上、1は2つ目のカラーストップ上を意味する。その割合をHとする。
  2. 2つのカラーストップ間の任意の点について、前ステップと同様に点の位置を割合Pで算出する。
  3. その点での色の重みCPlogH(.5)とする。
  4. その点の色は、2つのカラーストップの色をそれぞれ(1 - C)Cの割合で線形ブレンドしたものとなる。

注:トランジションヒントは、「中間色」(2つのカラーストップの50%ブレンド色)をどこに配置するかを指定します。 ヒントがちょうど2つのカラーストップの中間にある場合は、上記補間アルゴリズムで通常の線形補間となります。 それ以外の場所にある場合は、周囲のカラーストップ間をスムーズな指数カーブでつなぎ、「中間色」がヒントの位置に現れるようになります。

カラーヒントの利用例を図示する例を追加すること。

複数のカラーストップが同じ位置にある場合は、 リスト内で先に指定されたものから後に指定されたものへの無限小の遷移を生じさせます。 その位置で色が滑らかに変化せず、突然切り替わる効果となります。

「プリマルチプライド」とは?

「プリマルチプライド」色とは、アルファチャンネルを独立で扱うのではなく、色チャンネルに掛け合わせて表現したものです。 たとえば、半透明の青はrgba(0, 0, 255, .5)と表せますが、 そのプリマルチプライド表現は[0, 0, 127.5, .5]となります。

プリマルチプライド表現で色補間を行うと、通常のrgba表現で補間するより魅力的な遷移になりやすく、 特に完全不透明色から完全透明色への遷移で顕著です。

なお、透明度や色のどちらか一方だけが変化する遷移 (例:rgba(255, 0, 0, 100%) (不透明赤)と rgba(0,0,255,100%) (不透明青)や、 rgba(255,0,0,100%) (不透明赤)と rgba(255,0,0,0%) (透明赤))では、プリマルチプライド・非プリマルチプライドいずれで補間しても結果は同じです。 両端で色と透明度の両方が異なる場合のみ違いが出ます。

次の例は、プリマルチプライドsRGBA補間のグラデーションと、非プリマルチプライド(誤った補間)の違いを示します。 どちらの例も白背景上にグラデーションを描画しています。 下記の値でどちらも記述できます:
linear-gradient(90deg, red, transparent, blue)

プリマルチプライド色では、「transparent」への遷移は常に美しくなります:

(画像はSVGが必要です)

一方、グラデーションが誤って非プリマルチプライド空間で補間された場合、中心が明らかに灰色がかった色になります。 これは「transparent」が実際にはrgba(0,0,0,0)(透明な黒)であり、 赤→透明では赤が透明になるのではなく黒に変化しつつ透明になるためです。 青も同様です:

(画像はSVGが必要です)

3.4.3. カラーストップの「補正」

使用値としてのカラーストップの位置を解決する際は、以下の手順を順番に適用します:

  1. 最初のカラーストップに位置がなければ0%に設定する。最後のカラーストップに位置がなければ100%に設定する。
  2. あるカラーストップまたはトランジションヒントの位置が、 それ以前のカラーストップトランジションヒントの指定位置より小さい場合、 その位置をそれ以前で最大の指定位置に修正する。
  3. まだ位置が未指定のカラーストップがあれば、 連続する位置なしストップの区間ごとに、 前後の位置付きカラーストップの間で等間隔となるよう位置を割り当てる。

これらのルール適用後、すべてのカラーストップトランジションヒントには明確な位置と色が付き、昇順に並びます。

注: px, em, % など異なる単位を混在させると、カラーストップが意図せず前のストップより前に動く場合があるため注意が必要です。 例:background-image: linear-gradient(yellow 100px, blue 50%) は、背景領域の高さが200px以上なら補正は発生しませんが、 150pxなら青カラーストップの位置は75pxとなり、黄色カラーストップより前になるため100pxに修正されます。 こうしたカラーストップの順序はレイアウトを行わないと決定できないため、 アニメーショントランジションでは滑らかに補間されません。

以下はいくつかのグラデーションのペア例です。 各ペアの後者は、前者に上記ルールを適用して手動で「補正」したものです。 どちらも同じように描画されます。各矢印の数字は適用された補正ステップです。
1. linear-gradient(red, white 20%, blue)
   =1=>
   linear-gradient(red 0%, white 20%, blue 100%)

2. linear-gradient(red 40%, white, black, blue)
   =1,3=>
   linear-gradient(red 40%, white 60%, black 80%, blue 100%)

3. linear-gradient(red -50%, white, blue)
   =1,3=>
   linear-gradient(red -50%, white 25%, blue 100%)

4. linear-gradient(red -50px, white, blue)
   =1,3=>
   linear-gradient(red -50px, white calc(-25px + 50%), blue 100%)

5. linear-gradient(red 20px, white 0px, blue 40px)
   =2=>
   linear-gradient(red 20px, white 20px, blue 40px)

6. linear-gradient(red, white -50%, black 150%, blue)
   =1,2=>
   linear-gradient(red 0%, white 0%, black 150%, blue 150%)

7. linear-gradient(red 80px, white 0px, black, blue 100px)
   =2,3=>
   linear-gradient(red 80px, white 80px, black 90px, blue 100px)

4. CSSにおける画像とオブジェクトのサイズ指定

CSSで使用される画像は、さまざまなソースから取得される場合があります: バイナリ画像フォーマット(gif, jpegなど)、 専用のマークアップフォーマット(SVGなど)、 そして本仕様で定義されているlinear-gradient()値型のようなCSS固有のフォーマットです。 また、ドキュメントには他にも多様な種類のオブジェクト (たとえば動画、プラグイン、入れ子のドキュメントなど)が含まれることがあります。 これらの画像やオブジェクト (以下、単にオブジェクトと呼びます) は、CSSに対して多様なサイズ情報を提供することも、まったく持たないこともあります。 この節では、オブジェクトとCSSレイアウトアルゴリズム間の一般的なサイズ交渉モデルを定義します。

4.1. オブジェクトサイズ用語

この扱いを定義するために、 いくつかの用語を定義し、 様々な概念を参照しやすくします:

自然寸法
自然寸法とは、 自然高さ自然幅、 および自然アスペクト比(幅と高さの比率) の組であり、各値は与えられたオブジェクトによって存在する場合と存在しない場合があります。 これらの自然寸法は、オブジェクト固有の推奨サイズを表します。 つまり利用される文脈に依存しません。 CSSは一般に自然寸法の求め方を定義しません。

ラスタ画像は3つすべての自然寸法を持つオブジェクトの例です。 拡大縮小を前提に設計されたSVG画像は自然アスペクト比だけを持つこともありますし、 SVG画像は自然幅または自然高さのみで作成されることもあります。 本仕様で定義されるCSSグラデーションは、自然寸法を全く持たないオブジェクトの例です。 もう一つの例として、HTMLの iframe 要素などの埋め込みドキュメントがあります。 多くのオブジェクト(たとえばほとんどの画像)は2つだけの自然寸法を持つことはできません。 なぜならいずれか2つがあれば自動的に3つ目が決まってしまうからです。 ただし一部の置換要素(フォームコントロールなど)は、 自然幅自然高さのみを持ち、 自然アスペクト比を持たない場合もあります。

オブジェクト縮退した自然アスペクト比 (いずれかの値が0または無限大)を持つ場合は、自然アスペクト比を持たないものとして扱います。

もしオブジェクト(アイコンなど)が複数のサイズを持つ場合、最も大きいサイズ(面積で)がその自然寸法として扱われます。 そのサイズで複数のアスペクト比がある場合や、複数のアスペクト比がありサイズがない場合は、デフォルトオブジェクトサイズのアスペクト比に最も近いアスペクト比が使用されます。 これは、デフォルトオブジェクトサイズ内にcontain制約で収めたときに最大の面積となるアスペクト比を選ぶことで決定します。 もし最大面積のサイズが複数ある場合は、その中で最も幅が広いサイズが自然寸法として選ばれます。

自然幅自然高さをまとめて 自然サイズ と呼びます。

指定サイズ
オブジェクトの指定サイズはCSSによって与えられます。 たとえばwidthheightbackground-sizeプロパティなどです。 指定サイズは幅・高さが明確に決まる場合もあれば、制約条件の集合やそれらの組み合わせの場合もあります。
具体的オブジェクトサイズ
具体的オブジェクトサイズは、 オブジェクト自然寸法指定サイズ、 そのオブジェクトが使われる文脈のデフォルトオブジェクトサイズを組み合わせて、 幅と高さが絶対的に決まる矩形を生成したものです。
デフォルトオブジェクトサイズ
デフォルトオブジェクトサイズは、 高さと幅が絶対値で決まっている矩形であり、 自然寸法指定サイズの両方が一部欠けている場合に 具体的オブジェクトサイズを決定するために使われます。

4.2. CSS⇋オブジェクト交渉

オブジェクトは、以下のオブジェクトサイズ交渉アルゴリズムでCSSによりサイズ・描画されます:

  1. オブジェクトがドキュメント内に指定されたとき (たとえばurl()付きbackground-imagesrc 属性付きimg要素など)、 CSSはオブジェクトに自然寸法を問い合わせます。

  2. 自然寸法指定サイズ、 そのオブジェクトが使われる文脈のデフォルトオブジェクトサイズを使って、 CSSは具体的オブジェクトサイズを計算します。 (次節参照。) これでオブジェクトを描画する領域のサイズと位置が決定されます。

  3. CSSはオブジェクトに対し、 具体的オブジェクトサイズで自身を描画するよう依頼します。 CSSはオブジェクト自然寸法具体的オブジェクトサイズが異なる場合の描画方法は定義しません。 オブジェクトは何らかの方法でサイズを具体的オブジェクトサイズに合わせるか、 独自の制約を満たすためにそれより大きく/小さく描画する場合もあります。

  4. CSSで特に指定がない限り、 オブジェクト具体的オブジェクトサイズでクリップされます。

4.3. 具体的オブジェクトサイズの解決

現在、オブジェクトのサイズ指定ルールは、 それぞれの利用文脈ごとに記述されています。 この節では、よく使われるサイズ制約とその解決方法を定義し、 今後の仕様が個別にサイズ解決を再定義せずに参照できるようにします。

4.3.1. デフォルトのサイズ決定アルゴリズム

デフォルトのサイズ決定アルゴリズムは、 オブジェクト具体的オブジェクトサイズを求めるためによく使われる一連のルール群です。 これは、オブジェクト自然寸法と、 拘束なしまたは明確な幅・高さのみを持つ指定サイズが同時に与えられる場合の解決を行います。

一部のオブジェクトサイズ指定ルール (たとえばlist-style-image)は デフォルトのサイズ決定アルゴリズムと完全に一致します。 他のルール(たとえばborder-image)は デフォルトのサイズ決定アルゴリズムを利用しつつ、最終的な具体的オブジェクトサイズを得る前に追加のサイズ決定ルールを適用します。

デフォルトのサイズ決定アルゴリズムは次の通りです:

4.3.2. cover/contain制約サイズ決定

他にもよく使われる指定サイズとしてcontain制約cover制約があり、 いずれも指定された制約矩形に対し、オブジェクト推奨アスペクト比で解決されます:

いずれの場合も、オブジェクトが自然アスペクト比を持たない場合は、 具体的オブジェクトサイズは指定された制約矩形となります。

4.4. CSSオブジェクトサイズ指定の例

以下の例は、CSS 2.1およびCSS3 Backgrounds & Bordersのサイズ決定アルゴリズムが、 本仕様で定義される概念とどのように対応しているかを示しています。
background-image
背景の具体的オブジェクトサイズの算出ルールは CSS2.1§14.2.1およびCSS3BG§3.9で定義されています。 CSS2.1はデフォルトのサイズ決定アルゴリズムを 指定サイズなし・背景配置領域デフォルトオブジェクトサイズとして使います。[CSS2] CSS3ではbackground-sizeプロパティでサイズ制約を与えられ、 デフォルトのサイズ決定アルゴリズムcontain/cover制約が呼び出されます。 background-repeatround値が指定されている場合はさらに調整が入ります。[CSS3BG]
list-style-image
リストスタイル画像の具体的オブジェクトサイズの算出ルールは CSS2.1§12.5.1で定義されています。 デフォルトのサイズ決定アルゴリズムを 指定サイズなし・1em四方のデフォルトオブジェクトサイズで使います。
border-image
ボーダー画像は2回サイズ決定されます。 まず画像全体のサイズを決定して分割点を求め、 次に分割片をボーダーの装飾用にサイズ決定します。 最初のサイズ決定はCSS3BG§6.2で定義され、 デフォルトのサイズ決定アルゴリズムを 指定サイズなし・ボーダー画像領域デフォルトオブジェクトサイズとして利用します。 2回目はCSS3BG§6.2で定義され、 各分割片に対応するボーダー画像領域部位をデフォルトオブジェクトサイズとし デフォルトのサイズ決定アルゴリズムで初期サイズを決定します。 通常指定サイズはこのデフォルトオブジェクトサイズと一致しますが、 border-image-repeatプロパティで 指定サイズが一部方向で無効化されたり、追加の丸め処理が行われる場合もあります。[CSS3BG]
cursor
カーソルの具体的オブジェクトサイズの算出ルールは CSS2.1 § 18.1: Cursorsで定義されています。 デフォルトオブジェクトサイズはUA定義ですが、 UAのOSで一般的なカーソルサイズに基づくべきです。[CSS2]
content
CSS2.1のcontentプロパティで挿入されるオブジェクトは 匿名の置換要素となり、 同様の方法でサイズ指定されます。[CSS2] これらの匿名要素は、すべての非継承プロパティ(widthheightなどを含む)が初期値になります。
置換要素
CSS 2.1は、置換要素 (generated contentcontentで挿入されたものも含む) のサイズ指定を 10.3.210.410.6.210.7で定義しています。[CSS2] 以下で定義されるobject-fitプロパティは、 具体的オブジェクトサイズと要素の使用幅・高さをどう対応づけるかを定義します。 既定では両者は一致します。

4.5. オブジェクトのサイズ指定:object-fit プロパティ

名前: object-fit
値: fill | contain | cover | none | scale-down
初期値: fill
適用対象: 置換要素
継承: no
パーセンテージ: 該当なし
算出値: 指定キーワード
正規順序: 文法通り
アニメーション型: 不連続

object-fitプロパティは、置換要素の内容をその使用幅・高さで定められたボックスにどのように収めるかを指定します。

fill
置換内容は要素の内容ボックスを満たすようにサイズ調整されます。 オブジェクトの具体的オブジェクトサイズは要素の使用幅・高さになります。
contain
置換内容は自然アスペクト比を維持しつつ、要素の内容ボックス内に収まるようにサイズ調整されます。 具体的オブジェクトサイズは、要素の使用幅・高さに対するcontain制約として解決されます。
cover
置換内容は自然アスペクト比を維持しつつ、要素の内容ボックス全体を覆うようにサイズ調整されます。 具体的オブジェクトサイズは、要素の使用幅・高さに対するcover制約として解決されます。
none
置換内容は要素の内容ボックス内に収まるようにはリサイズされません。 デフォルトのサイズ決定アルゴリズム(指定サイズなし・デフォルトオブジェクトサイズは要素の使用幅・高さ)で具体的オブジェクトサイズを決定します。
scale-down
noneまたはcontainが指定されたかのようにコンテンツをサイズ調整し、より小さい具体的オブジェクトサイズを選びます。

注: nonecontainの両方とも、内容の自然アスペクト比を尊重するため、「より小さい」概念は明確です。

内容が置換要素の内容ボックスを完全に満たさない場合、空いた領域には置換要素の背景が表示されます。 置換要素は常に内容を内容ボックスでクリップするため、内容がはみ出すことはありません。 内容のボックス内での位置指定にはobject-positionプロパティを参照してください。

object-fitの4つの値が、置換要素(青い図形)を高さ・幅のボックス(緑背景)にどのようにスケーリングするかを示す例です(object-positionの初期値を使用)。 5つ目の値scale-downは、この場合containと同じ見た目になります。

注: object-fit プロパティは [SMIL10]fit属性や、 <meetOrSlice>パラメータ、 preserveAspectRatio 属性[SVG11])と類似の意味を持ちます。

注: オブジェクトサイズ交渉アルゴリズムによれば、 具体的オブジェクトサイズ(またはこの場合、内容のサイズ)は オブジェクト自体を直接スケーリングするものではなく、表示キャンバスのサイズ情報としてオブジェクトに渡されるだけです。 そのサイズ内でどう描画するかは画像フォーマット依存です。 特にラスタ画像は常に指定サイズにスケーリングされ、 SVGは与えられたサイズを「SVGビューポート」として使い、ルート<svg>要素の属性値で描画方法を決定します。

4.6. オブジェクトの位置指定:object-position プロパティ

名前: object-position
値: <position>
初期値: 50% 50%
適用対象: 置換要素
継承: no
パーセンテージ: 要素自身の幅・高さを基準
算出値: background-position と同様
正規順序: <position>の横成分、次に縦成分
アニメーション型: background-position と同様

object-positionプロパティは、置換要素をボックス内でどのように配置するかを決定します。 <position>値型 (background-positionでも使用) は[CSS-VALUES-3]で定義されており、 具体的オブジェクトサイズをオブジェクト領域・内容ボックスを配置領域として解決されます。

注: ボックスの未充填部分は要素の背景が表示されます。

5. 画像処理

5.1. 画像のページ上での向き指定:image-orientation プロパティ

カメラを横向きにしたまま撮影した場合や、スキャナーで文書の位置が正しくない場合など、生成される画像が「横向き」や逆さまになる場合があります。 image-orientationプロパティは、画像ソースデータに「帯域外」で回転を適用して正しく画像を表示できるようにするためのものです。

名前: image-orientation
値: from-image | none | [ <angle> || flip ]
初期値: from-image
適用対象: 全要素
継承: yes
パーセンテージ: 該当なし
算出値: 指定キーワード、または<angle>(丸め・正規化、本文参照)+ オプションでflip
正規順序: 文法通り
アニメーション型: 不連続

このプロパティは実装において任意です。

このプロパティは、要素の画像に直交回転を適用し、文書内で使用される前に向きを調整します。 これはコンテンツ画像 (例:置換要素や生成コンテンツ)やSVG要素が参照する画像ソース (例:feImage)、 さらにCSSルールで適用された装飾画像 (background-imageや他の<image>プロパティ)にも適用されます。 UAのナビゲーションツールバーやメニューなど文書外での画像レンダリングには適用されません。

注: このプロパティは、任意の回転や水平方向・垂直方向の反転といったレイアウト変形指定を意図するものではありません。 (その目的には[CSS-TRANSFORMS-1]を参照。) また、印刷時の縦横向きによる回転など正しい向きで印刷するためには不要であり(それはレイアウト処理の一部)、[CSS3PAGE]参照。 誤った向きの画像の補正にのみ使うべきです。

値の意味は以下の通りです:

none
追加の回転は行いません。 画像はエンコードされたままの向きで表示されます。
from-image
画像のメタデータ(EXIF等)に向き情報が含まれている場合、 この値は画像を正しい向きにするために必要な角度となります。 必要に応じてこの角度は<angle>値として上記の丸め・正規化処理が行われます。 メタデータに向き指定がなければ、この値はnoneになります。

注: § 2.1.2 画像メタデータは使用できるメタデータに制限を課しています。

<angle> || flip
正の<angle>は画像を右(時計回り)に回転し、 負の値は左に回転します。 <angle>が省略された場合は0degです。

flipを指定した場合は、回転後に画像を水平方向に反転します。

この値はコンテンツ画像にのみ適用され、装飾画像はfrom-imageとして扱われます。 この値は廃止予定であり、[CSS-PRINT]に準拠する実装を除きオプションです。

注: この値は、from-imageが生成できる8通りのEXIF向きを手動で再現できます。

このプロパティの算出値は、<angle>を最も近い1/4回転に丸め(曖昧な場合は正の方向へ)、その後値を1turnで剰余([0turn, 1turn)の半開区間)します。

noneおよびfrom-image以外の値は、実装は任意、CSSとしては非推奨です。

すべてのCSSレイアウト・レンダリング処理は、回転の画像を使い、画像が最初からその向きでエンコードされていたかのように扱います。 これにより例えば:

次の例では画像を90度右回転しています:
img.ninety     { image-orientation: 90deg }
...
<img class="ninety" src=...>

同じ効果は-270degや450degでも実現可能です。

注: このプロパティは以前はnoneが初期値でした。 from-imageを初期値とした方が、一般的により良いユーザー体験と最小限の破壊的変更になると考えられています。 今後UAでの互換データが確認されれば、他の用途が明確でない限りこのプロパティは「誤った向きの補正」以外の値はCSSから除外される可能性があります。

5.2. 画像の拡大縮小方法の決定:image-rendering プロパティ

名前: image-rendering
値: auto | smooth | high-quality | pixelated | crisp-edges
初期値: auto
適用対象: 全要素
継承: yes
パーセンテージ: 該当なし
算出値: 指定キーワード
正規順序: 文法通り
アニメーション型: 不連続

image-renderingプロパティは、画像が拡大・縮小される際に、どの特性を優先して保持すべきかについてユーザーエージェントにヒントを与え、適切なスケーリングアルゴリズム選択を補助します。 要素に指定した場合、その要素のすべての画像プロパティ(背景画像、リストスタイル画像、または置換要素の内容が画像であって拡大縮小が必要な場合など)に適用されます。 image-renderingプロパティの値の意味は以下の通りです:

auto
スケーリングアルゴリズムはUA依存です。
smooth
画像の見た目を最大限に美しくするアルゴリズムで拡大縮小すべきです。 特に色を「滑らかに」するバイリニア補間などが許容されます。 写真のような画像を想定しています。
high-quality

smoothと同じですが、より高品質な拡大縮小を優先します。 システムリソースが制約されている場合、high-qualityが指定された画像は、他の値の画像よりも品質劣化が遅くなるよう優先的に扱われるべきです。

この値はシステムリソースが制約されているとき、画像品質の劣化を防ぐものではありません。 あくまでautoより優先的に拡大縮小リソースを割り当てるという希望を表明するのみです。 ページ内すべての画像にhigh-qualityを指定した場合は、全てautoと同等で、区別されません。

high-qualityの効果を最大限得たい場合は、ページ内でも特に重要な画像のみに指定してください。

pixelated

元のピクセル感をできるだけ保持するように拡大縮小されますが、目標サイズが元サイズの整数倍でない場合に歪みを避けるため最小限のスムージングが許されます。

各軸ごとに、目標サイズに最も近く、かつ0より大きい自然サイズの整数倍をまず求めます。 その整数倍サイズまでnearest neighborで拡大し、残りのサイズ分はsmooth同様に拡大します。

注: 自然サイズの整数倍では、crisp-edgesと同じ結果になります。 非整数倍では、ピクセルアートでも通常より良い見た目になりますが、「2段階描画」のためパフォーマンスコストが発生します。

crisp-edges

コントラストやエッジを保ち、色のスムージングやぼかしを避けて拡大縮小します。 線画のような画像を想定しています。

UAが選択するnearest neighborや、元画像の色をぼかさず・混合せずに拡大縮小できる他のアルゴリズムでもです。 ただし斜線や曲線も「巨大なピクセル」ではなく滑らかに描画できる場合があります。

注: 新しいサイズが元画像の整数倍でない場合、nearest neighborは「エイリアシング」バグを起こす可能性があり、元画像で同じ太さだった線が拡大先では位置によって太くなったり細くなったりすることがあります。 多くの場合、pixelatedの方がより適切な描画になります。

pixelatedの最初のステップ以外、このプロパティは特定のスケーリングアルゴリズムを規定しません。 例えばimage-rendering: autoなら、UAは既定でバイリニア補間を使い、高負荷時はnearest-neighbor、静止画像にはLanczos補間など高品質アルゴリズムに切り替えても構いません。

例えば、以下の小さな画像を:
小さなピクセルアート画像。

これを3倍に拡大すると、image-renderingの値によって下記のように見えます:

smoothで3倍拡大
pixelatedで3倍拡大
crisp-edgesをエッジ保持アルゴリズムで解釈した例
(nearest neighborで解釈した場合、pixelatedと同じ見た目になります)
nearest neighbor (NN)画像スケーリングアルゴリズムは、元画像のピクセルをソースキャンバス上の色の矩形として扱い、 各出力ピクセルの領域の1点(通常は中心または左上)を選んで、そのソースキャンバス上の点の色を使って塗りつぶします。
目標サイズが元画像の整数倍の場合は「大きなピクセル」になる、まさに拡大鏡でズームしたのと同じ見た目です。 非整数倍の場合でも、元画像の色だけでクリスプなピクセルが得られ(色混合やぼかしなし)ますが、「ピクセルグリッド」がやや不規則に見えるなどエイリアシングのクセが出ます。

例えばnearest neighborで画像を2.5倍拡大すると、元画像の各ピクセルが出力画像で2ピクセルまたは3ピクセルずつ交互に使われます。0.5倍縮小では元画像のピクセルを1つおきにスキップします。

前例と同じく3倍拡大時は、pixelatedも純粋なnearest neighborも同じ結果になります。 しかし整数倍以外では動作が異なります:
同じ小さなピクセルアート画像
2.5倍拡大時のpixelatedの例
2.5倍拡大時のcrisp-edges(nearest neighbor解釈)

pixelatedはピクセルを単純に拡大した「見た目」をよく維持しますが、わずかなぼかしが入り、smoothよりはるかに少ないぼかしです。 一方、nearest neighborはぼかしを全く発生させませんが、エイリアシングでピクセルサイズが不ぞろいに見えます。

このプロパティは以前optimizeSpeedoptimizeQualityも受け付けましたが、これらは廃止されました。UAはこれらを有効値として受け付けつつ、crisp-edgesおよびsmoothと同じ挙動とし、著者は使用しないでください。

6. 補間

<image>値の補間は本レベルでは定義されません。 実装はそれらを突然遷移させなければなりません(50%進行時に他の非対応補間と同様に切り替え)、 ただし将来の仕様で別途定義があればそれを優先します。

注: CSS Images Level 4ではグラデーション用の専用補間と、その他の画像のクロスフェード補間が定義される予定です。

7. シリアライズ

この節では、本仕様で導入されたすべての新しいプロパティや値型のシリアライズについて述べます(CSS Object Model [CSSOM]との連携のため)。

本モジュールで定義される任意の関数をシリアライズするには、該当する文法に従い、その順序通りにシリアライズし、意味を変えない範囲で構成要素を省略し、スペース区切りのトークンは1つのスペースで連結し、カンマ後は必ず1つスペースを入れます。

例:次のようなグラデーション指定は
Linear-Gradient( to bottom, red 0%,yellow,black 100px)

次のようにシリアライズされなければなりません:

linear-gradient(red, yellow, black 100px)

プライバシーに関する考慮事項

この仕様は新たなプライバシー上の懸念を導入しません。

セキュリティに関する考慮事項

この仕様ではクロスオリジン画像のレンダリングがデフォルトで許可されており、それら画像の一部情報(特に自然寸法や解像度)がプログラムから取得可能となります。

謝辞

グラデーション定義への貢献者としてWebkitチーム、Brad Kemper、Brian Manthos、Alan Gresleyに感謝します。またobject-fitobject-positionimage-orientationへのMelinda Grantの取り組みにも感謝します。 さらにL. David Baron、Kang-Hao Lu、Leif Arne Storset、Erik Dahlstrom、Øyvind Stenhaugによる丁寧なレビュー・コメント・修正に感謝します。

変更点

2019年10月10日候補勧告以降の変更点

2020年12月17日CRD以降の主な変更:

2019年10月10日CR以降の主な変更点:

2012年4月17日候補勧告以降の変更点

主な変更点:

コメントへの対応状況も参照可能です。

適合性

文書の表記規約

適合要件は、記述的な断定とRFC 2119の用語の組み合わせで表現されています。規範的な部分で使われる “MUST”(しなければならない)、 “MUST NOT”(してはならない)、 “REQUIRED”(必須)、 “SHALL”(すべきである)、 “SHALL NOT”(すべきでない)、 “SHOULD”(推奨される)、 “SHOULD NOT”(推奨されない)、 “RECOMMENDED”(推薦)、 “MAY”(許可される)、 “OPTIONAL”(任意)はRFC 2119で説明されている意味で解釈されます。 ただし、可読性のため本仕様ではこれらの単語はすべて大文字にはなっていません。

この仕様の本文は、明示的に非規範的であると記載されたセクション、例、および注記を除き、すべて規範的です。 [RFC2119]

本仕様の例は、「例えば」などの語句で導入されるか、class="example" のように規範的テキストから区別して示されます。

これはインフォーマティブな例です。

インフォーマティブな注記は「注」と始まり、class="note" で規範的テキストと区別されます。

注:これはインフォーマティブな注記です。

助言(アドバイスメント)は、特別な注意を促すための規範的セクションであり、他の規範的テキストと区別するため <strong class="advisement"> で示されます。例: UAはアクセシブルな代替手段を必ず提供しなければなりません。

適合クラス

本仕様への適合は、次の3つの適合クラスに定義されます:

スタイルシート
CSSスタイルシート
レンダラー
UA(ユーザーエージェント)。スタイルシートの意味を解釈し、それを使う文書をレンダリングします。
オーサリングツール
UA(ユーザーエージェント)。スタイルシートを書き出すツールです。

スタイルシートが本仕様に適合しているとは、本モジュールで定義された構文を使うすべての記述が、汎用CSS文法および本モジュールで定義された各機能の個別文法に従って有効である場合です。

レンダラーが本仕様に適合しているとは、スタイルシートを該当仕様で定義される通りに解釈することに加え、本仕様で定義されるすべての機能を正しくパースし、文書をそれに従ってレンダリングできる場合です。ただし、UAが機器の制約によって文書を正しくレンダリングできない場合は、非適合とはなりません(例:モノクロモニターで色を表示する必要はありません)。

オーサリングツールが本仕様に適合しているとは、汎用CSS文法および本モジュールの各機能の個別文法に従って構文的に正しいスタイルシートを書き出し、かつ本モジュールで記載されるスタイルシートのすべての他の適合要件を満たす場合です。

部分的な実装

著者がフォワードコンパチブルなパース規則を活用してフォールバック値を指定できるようにするため、CSSレンダラーはサポートできないatルール、プロパティ、プロパティ値、キーワードその他の構文要素を無効(適切に無視)として扱う必要があります。特に、ユーザーエージェントはサポートされていない値だけを無視し、サポートされている値を単一の複数値プロパティ宣言内で適用してはなりません。いずれかの値が無効(サポートされていない値は無効とみなす)とされた場合、CSSでは宣言全体を無視しなければなりません。

不安定機能・独自機能実装

将来の安定したCSS機能との衝突を避けるため、CSSWGは将来互換性のためのベストプラクティスに従って、不安定な機能や独自拡張の実装を推奨します。

非実験的な実装

仕様が候補勧告段階に到達した後は、非実験的な実装が可能となり、実装者は仕様に従い正しく実装できたCRレベルの機能については、プレフィックスなしでリリースすべきです。

CSSの相互運用性を確立・維持するため、CSSワーキンググループは、非実験的なCSSレンダラーがCSS機能のプレフィックスなし実装をリリースする前に、その実装レポート(必要ならテストケースも)をW3Cに提出することを求めます。W3Cに提出されたテストケースはCSSワーキンググループによるレビュー・修正の対象となります。

テストケースや実装レポートの提出方法については、CSSワーキンググループのウェブサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問は public-css-testsuite@w3.org メーリングリストへ。

CR終了基準

本仕様が提案勧告へ進むには、各機能について少なくとも2つの独立した相互運用可能な実装が必要です。各機能は異なる製品群で実装されてもよく、すべての機能が1つの製品で実装される必要はありません。この基準のための用語定義:

独立
各実装は異なる組織により開発され、他の適格実装のコードを共有、再利用、派生してはなりません。本仕様の実装に関係しないコード部分はこの要件の対象外です。
相互運用可能
公式CSSテストスイートで該当テストケースに合格すること、またはWebブラウザでない場合は同等のテスト。すべての関連テストに対して、該当UAで相互運用を主張する場合は、同等のテストを作成し、それに合格できる追加のUAが必要です。同等テストはピアレビューのため公開されなければなりません。
実装
次の条件を満たすユーザーエージェント:
  1. 仕様を実装していること。
  2. 一般公開されていること。リリース製品、パブリックベータ版、プレビューリリース、nightly build等が該当します。非リリース製品は、少なくとも1ヶ月間その機能が実装され安定している必要があります。
  3. 実験的でないこと(テストスイート合格専用のバージョンなど、今後通常利用されることを想定しないものは不可)。

本仕様は少なくとも6か月間、候補勧告として維持されます。

索引

本仕様で定義された用語

参照で定義された用語

参考文献

規範的参考文献

[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS Color Module Level 4. 2022年11月1日. CR. URL: https://www.w3.org/TR/css-color-4/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019年8月2日. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020年11月17日. WD. URL: https://www.w3.org/TR/css-lists-3/
[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS Masking Module Level 1. 2021年8月5日. CR. URL: https://www.w3.org/TR/css-masking-1/
[CSS-PRINT]
Elika Etemad; Melinda Grant. CSS Print Profile. 2013年3月14日. NOTE. URL: https://www.w3.org/TR/css-print/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS Box Sizing Module Level 4. 2021年5月20日. WD. URL: https://www.w3.org/TR/css-sizing-4/
[CSS-UI-4]
Florian Rivoal. CSS Basic User Interface Module Level 4. 2021年3月16日. WD. URL: https://www.w3.org/TR/css-ui-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2022年12月1日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2023年10月27日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2023年2月14日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[FILTER-EFFECTS-1]
Dirk Schulze; Dean Jackson. Filter Effects Module Level 1. 2018年12月18日. WD. URL: https://www.w3.org/TR/filter-effects-1/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

参考情報

[CSS-TRANSFORMS-1]
Simon Fraser 他. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS3PAGE]
Elika Etemad. CSS Paged Media Module Level 3. 2023年9月14日. WD. URL: https://www.w3.org/TR/css-page-3/
[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022年11月11日. WD. URL: https://www.w3.org/TR/selectors-4/
[SMIL10]
Philipp Hoschka. Synchronized Multimedia Integration Language (SMIL) 1.0 Specification. 1998年6月15日. REC. URL: https://www.w3.org/TR/1998/REC-smil-19980615/
[SVG11]
Erik Dahlström 他. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/

プロパティ索引

名前 初期値 適用対象 継承 %指定 アニメーション型 正規順序 算出値
image-orientation from-image | none | [ <angle> || flip ] from-image 全要素 yes n/a 不連続 文法通り 指定キーワードまたは <angle>(丸め・正規化、本文参照)、必要に応じ flip キーワード
image-rendering auto | smooth | high-quality | pixelated | crisp-edges auto 全要素 yes n/a 不連続 文法通り 指定キーワード
object-fit fill | contain | cover | none | scale-down fill 置換要素 no n/a 不連続 文法通り 指定キーワード
object-position <position> 50% 50% 置換要素 no 要素自身の幅・高さを参照 background-position と同様 <position> の横成分、次に縦成分 background-position と同様

課題索引

カラーヒントの利用例を図示する例を追加すること。
CanIUse

Support:Android Browser4.4+Baidu Browser13.18+Blackberry Browser10+Chrome26+Chrome for Android119+Edge12+Firefox16+Firefox for Android119+IE10+IE Mobile10+KaiOS Browser2.5+Opera12.1+Opera MiniNoneOpera Mobile12.1+QQ Browser13.1+Safari6.1+Safari on iOS7.0+Samsung Internet4+UC Browser for Android15.5+

Source: caniuse.com as of 2023-12-13

CanIUse

Support:Android Browser119+Baidu Browser13.18+Blackberry BrowserNoneChrome81+Chrome for Android119+Edge81+Firefox26+Firefox for Android119+IENoneIE MobileNoneKaiOS Browser2.5+Opera68+Opera MiniNoneOpera Mobile73+QQ BrowserNoneSafari13.1+Safari on iOS14.0+Samsung Internet13.0+UC Browser for Android15.5+

Source: caniuse.com as of 2023-12-13

CanIUse

Support:Android Browser119+Baidu Browser13.18+Blackberry BrowserNoneChrome41+Chrome for Android119+Edge79+Firefox65+Firefox for Android119+IENoneIE MobileNoneKaiOS Browser2.5+Opera28+Opera MiniNoneOpera Mobile73+QQ Browser13.1+Safari10+Safari on iOS10.0+Samsung Internet4+UC Browser for Android15.5+

Source: caniuse.com as of 2023-12-13