CSSマスキングモジュール レベル1

W3C候補勧告ドラフト,

このバージョン:
https://www.w3.org/TR/2021/CRD-css-masking-1-20210805/
最新公開バージョン:
https://www.w3.org/TR/css-masking-1/
編集者ドラフト:
https://drafts.fxtf.org/css-masking-1/
過去のバージョン:
実装報告:
https://test.csswg.org/harness/results/css-masking-1_dev/grouped/
テストスイート:
http://test.csswg.org/suites/css-masking/nightly-unstable/
課題追跡:
CSSWG課題リポジトリ
仕様内インライン
編集者:
(Adobe株式会社)
(Mozilla Japan)
Tab Atkins Jr. (Google)
この仕様への編集提案:
GitHubエディター

概要

CSSマスキングは、視覚的要素の一部または全体を部分的または完全に隠すための2つの手段(マスキングとクリッピング)を提供します。

マスキングは、他のグラフィカル要素や画像を輝度またはアルファマスクとして使用する方法を説明します。通常、CSSやSVGで要素をレンダリングする場合、要素(子要素も含む)がバッファに描画され、そのバッファが親要素に合成されるように概念的に説明できます。輝度およびアルファマスクは、合成段階の前にこのバッファの透明度に影響を与えます。

クリッピングは視覚要素の表示領域を説明します。この領域は、特定のSVGグラフィックス要素や基本的な図形によって記述できます。この領域の外側は描画されません。

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

この文書のステータス

このセクションは、公開時点での文書のステータスを記載しています。 他の文書が本書を置き換える場合があります。 現在のW3C出版物一覧や、この技術レポートの最新版は W3C技術レポートインデックス(https://www.w3.org/TR/)で確認できます。

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

この文書はドラフトであり、今後更新、置換、または廃止される可能性があります。 作業中以外のものとして本書を引用するのは不適切です。

ご意見はGitHubの課題登録(推奨)でお送りください。タイトルに仕様コード「css-masking」を含めてください(例: “[css-masking] …コメント概要…”)。 全ての課題やコメントはアーカイブされています。 または、(アーカイブ済み)の公開メーリングリストwww-style@w3.orgに送ることもできます。

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

この文書はW3C特許ポリシーの下で活動するグループによって作成されました。 W3Cは、グループの成果物に関連して提出された特許開示の公開リストを管理しています。 そのページには特許開示方法も記載されています。 個人が重要な特許について実際に知っている場合、その個人はW3C特許ポリシー第6節に従って情報を開示しなければなりません。

1. はじめに

このセクションは規範的ではありません。

この仕様は、オブジェクトの一部または全体を完全または部分的に隠す2つの異なるグラフィカル操作、クリッピングとマスキングを定義します。

1.1. クリッピング

閉じたベクトルパス、シェイプまたはポリゴンは、いわゆるクリッピングパスを定義します。このクリッピングパスは領域であり(アンチエイリアスがない場合)、この領域の「内側」にあるものはすべて表示され、「外側」は「クリップアウト」されてキャンバス上に表示されません。

Example Mask

クリッピングパス(中央)が、異なる色で塗り分けられたポリゴン(左)に適用されます。結果として「クリップアウト」された形状(右)となります。

clip-pathプロパティは、指定された基本図形をクリッピングパスとして利用したり、clipPath要素を参照して、graphics elementsをクリッピングパスとして使用することができます。

1.2. マスキング

グラフィカルオブジェクトにマスクを適用すると、グラフィカルオブジェクトがマスクを通して背景に描画されるようになり、グラフィカルオブジェクトの一部または全部が完全または部分的にマスクアウトされます。

Example Mask

輝度マスク(中央)がグラデーションで塗りつぶされた形状(左)に適用されます。結果としてマスクされた形状(右)となります。

マスクはmask-imagemask-border-sourceプロパティで適用されます。

mask-imageプロパティは mask要素を参照することができます。mask要素の内容はマスクとして使われます。

また、多くの簡単な用途では、mask-imageプロパティはマスクとして使う画像を直接指定でき、明示的なmask要素を必要としません。このマスクはmask-positionmask-sizeなどのプロパティを使い、CSSの背景画像と同様にサイズや位置を指定できます。

mask-border-sourceプロパティはマスクを9つの部分に分割します。これらの部分はmask border image areaのサイズに合わせてスライス、スケール、ストレッチなど様々な方法で調整できます。mask-borderプロパティはmask-border-sourceやその他の特性をまとめたショートハンドプロパティです。

mask プロパティは、すべてのmask-bordermask-image関連プロパティのショートハンドです。

注: マスキングは多様なグラフィック効果を可能にし、「表示部分」の制御を強化しますが、クリッピングパスはパフォーマンスが高く、基本図形は補間が容易です。

2. モジュールの相互作用

この仕様は、当該プロパティが適用された要素の視覚的レンダリングに影響するCSSプロパティ群を定義します。これらの効果は、視覚フォーマットモデル[CSS21])に従って要素のサイズや位置が決定された後に適用されます。これらのプロパティの値によってはスタッキングコンテキストが生成されることがあります。さらに、本仕様は Clipping: the clip property[CSS21])のセクションを置き換えます。

合成モデルはSVGの合成モデル[SVG11]に従います。まずフィルター効果、マスキング、クリッピング、透明度がない状態で要素をスタイリングし、要素とその子孫を一時キャンバス上に描画します。最後のステップで、以下の効果が順に適用されます:フィルター効果[FILTER-EFFECTS]、クリッピング、マスキング、透明度。

本仕様は、CSS Compositing and Blending[COMPOSITING-1]で定義されたPorter Duff合成演算子を用いて複数のマスクレイヤーを合成できます。

オブジェクトバウンディングボックスという用語はSVG 1.1[SVG11]の定義に従います。

3.

本仕様はCSSプロパティ定義規約[CSS21])に従います。基本図形はCSS Shapes Module Level 1[CSS-SHAPES]で定義されています。これらの仕様で定義されていない値型はCSS Values and Units Module Level 3[CSS3VAL]で定義されています。

定義内に記載されたプロパティ固有の値に加え、本仕様で定義されるすべてのプロパティはinheritなどのCSS全体キーワードも値として受け付けます[CSS3VAL]。可読性のため明示的には繰り返していません。

4. 用語

本仕様におけるCSSプロパティおよび値の定義は、CSS Backgrounds and Borders[CSS3BG]の定義に類似しています。重複を避けるため、本仕様はCSS Backgrounds and Bordersの説明・定義に依存します。CSS Backgrounds and Bordersにおける以下の用語は、本仕様では次の意味となります:

CSS Maskingでの用語 [CSS3BG]での用語
mask layer image background images
mask painting area background painting area
mask-size background-size
mask-position background-position
mask positioning area background positioning area
mask border image border-image
mask border image area border image area

5. クリッピングパス

クリッピングパスは塗りの適用領域、いわゆるクリッピング領域を制限します。概念的には、この領域の外側にある描画部分は描画されません。これは、クリッピングパスが適用された要素およびその子孫のコンテンツ、背景、ボーダー、テキスト装飾、アウトライン、可視スクロール機構を含みます。

要素の祖先も自身のclipclip-pathプロパティ、またはoverflowプロパティがvisibleでない場合などによって、コンテンツの一部をクリップする場合があります。描画されるのは累積的な交差領域です。

クリッピング領域がUAのウィンドウ境界を超える場合、コンテンツはネイティブなOS環境によってウィンドウにクリップされることがあります。

クリッピングパスは要素のレンダリングに影響しますが、要素の本来のジオメトリには影響しません。クリップされた要素(つまりclipPath要素をclip-pathプロパティで参照する要素や、その参照要素の子)は、クリップされていない状態と同じジオメトリを保持しなければなりません。

祖先にクリッピングパスが適用された形状の例:
<g clip-path="circle()">
  <path id="shape" d="M0,0 L10,10, L 20,0 z"/>
</g>

この形状はuse要素で参照されます:

<use xlink:href="#shape"/>

この形状のジオメトリは円形クリッピングパスの影響を受けません。

デフォルトでは、pointer-eventsはクリップアウトされた(非可視)領域には発火しません。例えば、10px×10pxの要素が半径5pxの円形にクリップされている場合、クリッピング領域外でclickイベントを受け取りません。

5.1. クリッピング形状:clip-pathプロパティ

名前: clip-path
値: <clip-source> | [ <basic-shape> || <geometry-box> ] | none
初期値: none
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 指定通り。ただし<url>値は絶対化されます
正規順序: 文法通り
アニメーション型: 算出値による
メディア: visual

基本図形を指定するか、clipPath要素を参照してクリッピングパスを作成します。

<clip-source> = <url>
<geometry-box> = <shape-box> | fill-box | stroke-box | view-box
<basic-shape>

CSS Shapesモジュール[CSS-SHAPES]で定義された基本図形関数です。基本図形は、指定された参照ボックスを使って大きさや位置を決定します。参照ボックスが指定されていない場合、border-boxが参照ボックスとして使われます。

<geometry-box>

<basic-shape>と組み合わせて指定した場合、<basic-shape>の参照ボックスとなります。

単独で指定した場合、指定されたボックスのエッジ(例えばborder-radius[CSS3BG]で定義される角の丸みなど)を含めてクリッピングパスとします。“ボックス値からの図形”[CSS-SHAPES]も参照してください。

fill-box

オブジェクトバウンディングボックスを参照ボックスとして使用します。

stroke-box

ストロークバウンディングボックスを参照ボックスとして使用します。

view-box

最も近いSVGビューポートを参照ボックスとして使用します。

viewBox属性がSVGビューポート生成要素に指定されている場合:

  • 参照ボックスはviewBox属性で確立される座標系の原点に配置されます。

  • 参照ボックスの寸法はviewBox属性のwidthおよびheight値となります。

none

クリッピングパスは作成されません。

CSSレイアウトボックスを持たないSVG要素の場合、used valueとしてcontent-boxpadding-boxfill-boxborder-boxmargin-boxstroke-boxとなります。

CSSレイアウトボックスを持つ要素の場合、used valueとしてfill-boxcontent-boxstroke-boxview-boxborder-boxとなります。

none以外の算出値は、CSSのスタッキングコンテキスト[CSS21]を、CSSのopacity[CSS3COLOR]1以外の値で作る場合と同様に生成します。

URI参照が有効でない場合(例えば存在しないオブジェクトを指す、またはそのオブジェクトがclipPath要素でない場合)は、クリッピングは適用されません。

この例は基本図形<polygon()>をクリッピングパスとして使う方法を示します。空白区切りの長さペアがポリゴンの各頂点を表します。可視化されたクリッピングパスははじめにで見ることができます。
clip-path: polygon(15px 99px, 30px 87px, 65px 99px, 85px 55px,
        122px 57px, 184px 73px, 198px 105px, 199px 150px,
        145px 159px, 155px 139px, 126px 120px, 112px 138px,
        80px 128px, 39px 126px, 24px 104px);
この例ではclip-pathプロパティがSVGのclipPath要素を参照しています。カンマ区切りの長さペアがポリゴンの各頂点を表します。前の例同様、可視化されたクリッピングパスははじめにで見ることができます。

clip-path: url("#clip1");
<clipPath id="clip1">
    <polygon points="15,99 30,87 65,99 85,55 122,57 184,73 198,105
        199,150 145,159 155,139 126,120 112,138 80,128 39,126 24,104"/>
</clipPath>

clip-pathプロパティはSVG要素の表示属性です。

6. SVGクリッピングパスソース

6.1. clipPath要素

名前: clipPath
カテゴリ: コンテナ要素, 非表示要素
内容モデル: 以下の要素を任意の順序で任意の個数含めることができます:
属性:
DOMインターフェース: SVGClipPathElement

属性定義:

clipPathUnits = "userSpaceOnUse | objectBoundingBox"

clipPath内の内容の座標系を定義します。

userSpaceOnUse

clipPathの内容は、clipPath要素が参照された時点での現在のユーザー座標系での値を表します(つまり、clip-pathプロパティでclipPath要素を参照している要素のユーザー座標系)。

objectBoundingBox

座標系の原点は、クリッピングパスが適用される要素のバウンディングボックスの左上隅になり、幅と高さはそのバウンディングボックスと同じになります。ユーザー座標はCSSのpx単位と同等のサイズです。

属性clipPathUnitsが指定されていない場合、userSpaceOnUseが指定されたものとして扱われます。

アニメーション可能: はい。

CSSプロパティはclipPath要素に祖先から継承されますが、clipPath要素を参照する要素からは継承されません

clipPath要素は直接描画されることはなく、唯一の用途はclip-pathプロパティで参照されるためだけです。displayプロパティはclipPath要素には適用されません。そのため、clipPath要素は、displayプロパティがnone以外に設定されていても直接描画されず、clipPath要素はdisplayプロパティがclipPath要素またはその祖先でnoneに設定されていても参照可能です。

clipPath要素には、path要素、text要素、基本図形(例:circle)やuse要素を含めることができます。use要素がclipPath要素の子である場合、直接pathtextまたは基本図形要素のみを参照しなければなりません。間接参照はエラーとなり、clipPath要素は無視されます。

Firefoxは、内容モデル違反があるclipPathを参照する要素の描画を無効にします。どのブラウザも間接参照のuseによるclipPathは無視しません。 <https://github.com/w3c/csswg-drafts/issues/17>

clipPath内の各子要素の、fillstrokestroke-widthなどのレンダリングプロパティを除いた生のジオメトリーは、概念的に1ビットマスク(ジオメトリーのエッジでアンチエイリアスが入る場合を除く可能性あり)を定義し、その要素に関連付けられたグラフィックスの輪郭を表します。オブジェクトの輪郭の外側はマスクされます。子要素がdisplayvisibilityによって不可視となった場合は、クリッピングパスに寄与しません。clipPath要素が複数の子要素を含む場合、それらの輪郭は論理的にORされ、単一の輪郭となり、この輪郭が塗りの適用領域の制限に使われます。つまり、ある点がclipPathの子要素のいずれかの内側にあれば、クリッピングパスの内側となります。

CSSプロパティによる生のジオメトリー定義(特にtextへの影響)を明確化すること。 <https://github.com/w3c/csswg-drafts/issues/170>

与えられたグラフィック要素について、実際に用いられるクリッピングパスは、そのclip-pathプロパティ(存在する場合)で指定されたクリッピングパスと、祖先要素のクリッピングパス(新しいビューポートを確立する要素のclip-pathプロパティで指定されるもの)との交差となります。([SVG11]参照)

追加事項:

6.2. 巻方向ルール: clip-ruleプロパティ

名前: clip-rule
値: nonzero | evenodd
初期値: nonzero
適用対象: SVGのグラフィック要素に適用されます
継承: yes
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

clip-ruleプロパティは、クリッピング領域を作成する際に、ある点が図形の内側かどうかを判定するアルゴリズムを示します。アルゴリズムおよびclip-rule値の定義はfill-ruleプロパティの定義に従います。SVG 1.1の“塗りプロパティ”セクションも参照してください[SVG11]

nonzero

fill-ruleプロパティの説明を参照してください[SVG11]

evenodd

fill-ruleプロパティの説明を参照してください[SVG11]

clip-ruleプロパティは、clipPath要素内に含まれるグラフィック要素にのみ適用されます。

注: clip-ruleプロパティは<basic-shape>には適用されません。

次の図はnonzeroルールを示しています:

Shape with nonzero rule.

左から右へ3つの図形: 1本の連続した重なり線で描かれた5点の星、時計回りに描かれた2つの円(1つが他方を含み両方とも同じ図形のサブパス)、2つの円(大きい方は時計回り、小さい方は反時計回りに描かれ、両方とも同じ図形に属する)。最後の図形のみ「穴」があります。

次の図はevenoddルールを示しています:

Shape with even-odd rule.

左から右へ3つの図形: 1本の連続した重なり線で描かれた5点の星、時計回りに描かれた2つの円(1つが他方を含み両方とも同じ図形のサブパス)、2つの円(大きい方は時計回り、小さい方は反時計回りに描かれ、両方とも同じ図形に属する)。全ての図形に「穴」があります。

次のコード断片では、clip-ruleがクリッピング形状を定義するpath要素に指定されているため、クリッピングパスにeven-oddクリッピングルールが適用されます:
<g clip-rule="nonzero">
  <clipPath id="MyClip">
    <path d="..." clip-rule="evenodd" />
  </clipPath>
  <rect clip-path="url(#MyClip)" ... />
</g>

一方、次のコード断片では、clip-ruleが参照側要素に指定されており、クリッピング形状の定義側には指定されていないため、evenoddクリッピングルールは適用されません:

<g clip-rule="nonzero">
  <clipPath id="MyClip">
    <path d="..." />
  </clipPath>
  <rect clip-path="url(#MyClip)" clip-rule="evenodd" ... />
</g>

clip-ruleプロパティはSVG要素の表示属性です。

7. 位置指定マスク

7.1. マスク画像ソース: mask-imageプロパティ

名前: mask-image
値: <mask-reference>#
初期値: none
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: キーワードnone、算出された<image>、または算出された<url>
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

このプロパティは要素のマスクレイヤー画像を設定します。内容:

<mask-reference> = none | <image> | <mask-source>
<mask-source> = <url>
<url>

mask要素へのURL参照(例:url(commonmasks.svg#mask))またはCSS画像への参照。

none

noneの値は透明な黒の画像レイヤーとして扱われます。

none以外の算出値は、CSSのスタッキングコンテキスト[CSS21]を、CSSのopacity[CSS3COLOR]1以外の値で作る場合と同様に生成します。

空の画像(幅または高さがゼロ)、ダウンロードに失敗した画像、mask要素への参照でないもの、存在しないもの、または表示できないもの(例:未対応画像形式)は、透明な黒の画像レイヤーとして扱われます。

“マスク処理”セクションでマスクレイヤー画像の処理方法を参照してください。

注: none値が<mask-reference>リスト中に含まれる場合、mask-compositeプロパティで指定された合成演算子によりマスキング操作に影響することがあります。

注: <mask-source>はマスクレイヤーとして扱われ、繰り返し可能な<mask-reference>リストで<image>やさらに<mask-source>リスト項目と組み合わせ可能です。

注: 要素はmask-border-sourceでもマスク可能です。mask-border-sourcemask-imageの連携については該当プロパティを参照してください。

マスク参照の例:
body { mask-image: linear-gradient(black 0%, transparent 100%) }
p { mask-image: none }
div { mask-image: url(resources.svg#mask2) }

“複数マスクレイヤー画像のレイヤー化”セクションでmask-imageが他のカンマ区切りのマスクプロパティと連携して各マスクレイヤーを形成する方法を参照してください。

7.2. マスク画像の解釈:mask-modeプロパティ

名前: mask-mode
値: <masking-mode>#
初期値: match-source
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

mask-modeプロパティは、<mask-reference>が輝度マスクとして扱われるか、アルファマスクとして扱われるかを示します。(マスク処理参照)

<masking-mode> = alpha | luminance | match-source

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

alpha

alpha値は、mask layer imageのアルファ値をマスク値として使用することを示します。マスク値の計算参照。

luminance

luminance値は、mask layer imageの輝度値をマスク値として使用することを示します。マスク値の計算参照。

match-source

mask-imageプロパティの<mask-reference><mask-source>型の場合、参照されるmask要素のmask-typeプロパティで指定された値を使用します。

mask-imageプロパティの<mask-reference><image>型の場合、mask layer imageのアルファ値をマスク値として使用します。

次の例では、mask-typeプロパティによってmask要素のマスクタイプ値をalphaに設定します。mask-imageプロパティはこのmask要素を参照し、mask-modeプロパティの値はluminanceです。mask-modeプロパティはmask-typeの定義をluminanceに上書きします。

mask-modeプロパティはmask-border-sourceのマスキングモードには影響しません。

<mask id="SVGMask" mask-type="alpha" maskContentUnits="objectBoundingBox">
  <radialGradient id="radialFill">
    <stop stop-color="white" offset="0"/>
    <stop stop-color="black" offset="1"/>
  </radialGradient>
  <circle fill="url(#radialFill)" cx="0.5" cy="0.5" r="0.5"/>
</mask>

<style>
  rect {
    mask-image: url(#SVGMask);
    mask-mode: luminance;
  }
</style>

<rect width="200" height="200" fill="green"/>

“複数マスクレイヤー画像のレイヤー化”セクションでmask-modeが他のカンマ区切りのマスクプロパティと連携して各マスクレイヤーを形成する方法を参照してください。

7.3. マスク画像のタイル化:mask-repeatプロパティ

名前: mask-repeat
値: <repeat-style>#
初期値: repeat
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 2つのキーワード(各次元ごと)
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

mask layer imageサイズ指定位置指定された後、どのようにタイルされるかを指定します。

プロパティ値の定義についてはbackground-repeatプロパティ[CSS3BG]を参照してください。

body {
    background-color: blue;
    mask-image: url(dot-mask.png) luminance;
    mask-repeat: space;
}

Image of an element with a dotted mask.

spaceの効果:ドットのmask layer imagemask painting area全体を覆うようにタイルされ、mask layer image同士が均等に配置されます。

“複数マスクレイヤー画像のレイヤー化”セクションでmask-repeat が他のカンマ区切りのマスクプロパティと連携して各マスクレイヤーを形成する方法を参照してください。

7.4. マスク画像の位置指定:mask-positionプロパティ

名前: mask-position
値: <position>#
初期値: 0% 0%
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: mask painting areaのサイズからmask layer imageのサイズを引いた範囲を参照します。詳細はbackground-position[CSS3BG]参照
算出値: 原点を指定する2つのキーワードと、原点からの2つのオフセット(<length>で指定した場合は絶対長、そうでなければパーセンテージ)
正規順序: 文法通り
アニメーション型: 繰り返し可能リスト
メディア: visual

プロパティ値の定義についてはbackground-positionプロパティ[CSS3BG]を参照してください。

下記の例では、(単一の)画像がビューポートの右下隅に配置されています。
body {
    mask-image: url("logo.png");
    mask-position: 100% 100%;
    mask-repeat: no-repeat;
}
マスクの位置は左上以外の隅を基準にすることも可能です。例えば下記は、背景画像を下から10px、右から3emの位置に配置します:

mask-position: right 3em bottom 10px

“複数マスクレイヤー画像のレイヤー化”セクションでmask-position が他のカンマ区切りのマスクプロパティと連携して各マスクレイヤーを形成する方法を参照してください。

7.5. マスキング領域:mask-clipプロパティ

名前: mask-clip
値: [ <geometry-box> | no-clip ]#
初期値: border-box
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

mask要素を参照しないmask layer imageに対して、mask-clipプロパティはマスキング描画領域を決定し、マスクの影響を受ける範囲となります。要素の描画された内容はこの領域に制限されなければなりません。

mask-clipプロパティは、mask要素を参照するmask layer imageには影響しません。xywidthheightmaskUnits属性がmask要素のマスキング描画領域を決定します。

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

content-box

描画内容はcontent boxに制限(クリップ)されます。

padding-box

描画内容はpadding boxに制限(クリップ)されます。

border-box

描画内容はborder boxに制限(クリップ)されます。

fill-box

描画内容はオブジェクトバウンディングボックスに制限されます。

stroke-box

描画内容はストロークバウンディングボックスに制限されます。

view-box

最も近いSVGビューポートを参照ボックスとします。

viewBox属性がSVGビューポート生成要素に指定されている場合:

  • 参照ボックスはviewBox属性で確立される座標系の原点に配置されます。

  • 参照ボックスの寸法はviewBox属性のwidthおよびheight値となります。

no-clip

描画内容は制限(クリップ)されません。

CSSレイアウトボックスを持たないSVG要素の場合、used valueとしてcontent-boxpadding-boxfill-boxborder-boxmargin-boxstroke-boxとなります。

CSSレイアウトボックスを持つ要素の場合、used valueとしてfill-boxcontent-boxstroke-boxview-boxborder-boxとなります。

“複数マスクレイヤー画像のレイヤー化”セクションでmask-clipが他のカンマ区切りのマスクプロパティと連携して各マスクレイヤーを形成する方法を参照してください。

7.6. 位置指定領域:mask-originプロパティ

名前: mask-origin
値: <geometry-box>#
初期値: border-box
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

単一ボックスとしてレンダリングされる要素の場合、マスク位置指定領域を指定します。複数ボックス(例:複数行のインラインボックスや複数ページにまたがるボックス)としてレンダリングされる要素の場合、box-decoration-breakがマスク位置指定領域を決定する際にどのボックスに作用するかを指定します。

content-box

位置はcontent boxに対して相対的です。

padding-box

位置はpadding boxに対して相対的です。(単一ボックスの場合、0 0はpaddingエッジの左上隅、100% 100%は右下隅になります。)

border-box

位置はborder boxに対して相対的です。

fill-box

位置はオブジェクトバウンディングボックスに対して相対的です。

stroke-box

位置はストロークバウンディングボックスに対して相対的です。

view-box

最も近いSVGビューポートを参照ボックスとします。

viewBox属性がSVGビューポート生成要素に指定されている場合:

  • 参照ボックスはviewBox属性で確立される座標系の原点に配置されます。

  • 参照ボックスの寸法はviewBox属性のwidthおよびheight値となります。

CSSレイアウトボックスを持たないSVG要素の場合、content-boxpadding-boxborder-boxの値はfill-boxに算出されます。

CSSレイアウトボックスを持つ要素の場合、fill-boxstroke-boxview-boxの値はmask-originの初期値に算出されます。

注: mask-originプロパティはbackground-originプロパティ[CSS3BG]と似ていますが、値の集合や初期値が異なります。

注: mask-clippadding-boxmask-originborder-boxmask-positiontop left(初期値)、かつ要素に非ゼロのボーダーがある場合、mask layer imageの上端・左端はクリップされます。

“複数マスクレイヤー画像のレイヤー化”セクションでmask-origin が他のカンマ区切りのマスクプロパティと連携して各マスクレイヤーを形成する方法を参照してください。

7.7. マスク画像のサイズ:mask-sizeプロパティ

名前: mask-size
値: <bg-size>#
初期値: auto
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 指定通り。ただし長さは絶対化されます
正規順序: 文法通り
アニメーション型: 繰り返し可能リスト
メディア: visual

mask layer imageのサイズを指定します。

background-sizeプロパティ[CSS3BG]でプロパティ値の定義を参照してください。

“複数マスクレイヤー画像のレイヤー化”セクションでmask-sizeが他のカンマ区切りのマスクプロパティと連携して各マスクレイヤーを形成する方法を参照してください。

7.8. マスクレイヤーの合成:mask-compositeプロパティ

名前: mask-composite
値: <compositing-operator>#
初期値: add
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual
<compositing-operator> = add | subtract | intersect | exclude

各キーワードはPorter-Duff合成演算子[COMPOSITING-1]を表しており、現在のマスクレイヤーと下層のマスクレイヤーとの合成操作を定義します。

以下では、現在のマスクレイヤーをsource、それより下の全てのマスクレイヤー(対応する合成演算子が適用されたもの)をdestinationと呼びます。

add

sourcedestinationの上に配置されます。(詳細はPorter-Duffのsource over合成演算子参照)

subtract

sourcedestinationの外側にある部分だけが配置されます。(詳細はPorter-Duffのsource out合成演算子参照)

intersect

sourcedestinationと重なる部分のみがdestinationを置き換えます。(Porter-Duffのsource in合成演算子参照)

exclude

sourcedestinationの重なっていない領域のみが合成されます。(Porter-DuffのXOR合成演算子参照)

さらに下のマスクレイヤーがない場合、合成演算子は無視されます。マスクレイヤーは要素自身の内容や背後の内容と合成してはならず、あくまで独立したグループとして描画されるように動作します。

現在のマスクレイヤーより下の全てのマスクレイヤーは、現在のマスクレイヤーの合成操作を適用する前に合成されなければなりません。

この例では2つのmask layer imagecircle.svgrect.svg)を使用しています。
Example of source-over compositing of mask layers

両方のmask layer imagemask-imageプロパティで参照されます:

mask-image: circle.svg, rect.svg;

rect.svgのマスクレイヤーはcircle.svgの下層にあり、circle.svgはユーザーにより近い位置に配置されます。

mask-compositeプロパティを使うことで、作者は複数のマスクレイヤーの合成方法を選択できます。

下記の例では2つのマスクレイヤーと2つの合成演算子を指定しています。
mask-image: rect.svg, circle.svg;
mask-composite: add, exclude;

rect.svgcircle.svgadd合成演算子を使用します。さらに下層のマスクレイヤーがないためexcludeは無視されます。

これは異なる合成演算子を持つ3つのマスクレイヤーの例です。
mask-image: trapeze.svg, circle.svg, rect.svg;
mask-composite: subtract, add;

まず、circle.svgrect.svgに「追加」されます。次に、trapeze.svgが直前2レイヤーの合成結果と重ならない部分のみが表示されます。

Example of source-over compositing of mask layers

“複数マスクレイヤー画像のレイヤー化”セクションでmask-composite が他のカンマ区切りのマスクプロパティと連携して各マスクレイヤーを形成する方法を参照してください。

7.9. マスクショートハンド:maskプロパティ

名前: mask
値: <mask-layer>#
初期値: 個別プロパティ参照
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: 個別プロパティ参照
算出値: 個別プロパティ参照
正規順序: 文法通り
アニメーション型: 個別プロパティ参照
メディア: visual
<mask-layer> = <mask-reference> || <position> [ / <bg-size> ]? ||<repeat-style> || <geometry-box> || [ <geometry-box> | no-clip ] || <compositing-operator> || <masking-mode>

1つの<geometry-box>値とno-clipキーワードが存在する場合、<geometry-box>mask-originを、no-clipmask-clipをその値に設定します。

1つの<geometry-box>値のみでno-clipキーワードが存在しない場合、<geometry-box>mask-originmask-clipの両方に設定されます。

2つの<geometry-box>値が存在する場合、最初の値がmask-origin、2番目の値がmask-clipを設定します。

プロパティmask-repeatmask-positionmask-clipmask-originmask-sizeのused valueは、<mask-reference>mask要素を参照している場合は効果がありません。この場合、要素がmask layer imageの位置・サイズ・クリッピングを定義します。

maskショートハンドはmask-borderも初期値にリセットします。そのため、著者はカスケードの前のマスク設定を上書きしたい場合は他のショートハンドや個別プロパティよりもmaskショートハンドの使用を推奨します。これによりmask-borderもリセットされ、新しいスタイルが正しく反映されます。

7.10. マスク画像レンダリングモデル

mask-imageプロパティがnone以外の値でCSSボックスモデルで整形された要素に適用されると、その要素はCSSのopacity[CSS3COLOR]と同様にスタッキングコンテキストを生成し、全ての子孫要素がグループとしてまとめて描画され、マスキングがグループ全体に適用されます。

mask-imageプロパティは、要素のCSSボックスのジオメトリやヒットテストには影響しません。

maskプロパティはSVG要素の表示属性です。

7.10.1. マスク処理

以下のセクションで、mask imageとはmask layer imageまたはmask border imageのいずれかを指します。

マスク画像は、マスク値(対象のアルファ値に乗算される値)を計算する方法として、2つの異なる手法のいずれかで解釈されます。

マスク値を計算する最初で最も単純な方法は、mask imageのアルファチャンネルを使用することです。この場合、ある点におけるマスク値は、その点のアルファチャンネルの値となります。色情報はマスク値に寄与しません。

マスク値を計算する2つ目の方法は、マスク画像の輝度を使用することです。この場合、ある点のマスク値は次の手順で色チャンネル値とアルファ値から計算されます。

  1. 色チャンネル値から輝度値を計算します。

    • color-interpolationプロパティの算出値がmask要素でlinearRGBの場合、元画像の色情報(sRGB色空間の可能性あり)をlinearRGB色空間に変換します。

    • 次に、非プリマルチプライドRGB値を使って、feColorMatrixフィルタプリミティブ[SVG11]で定義される輝度→アルファ係数を適用し、RGB値から輝度値へ変換します。

  2. 算出された輝度値に対応するアルファ値を乗算してマスク値とします。

どちらの方法でも、マスク値の計算手順はマスク内容が4チャンネルのRGBAグラフィックスオブジェクトであることを前提としています。その他の種類のグラフィックスオブジェクトの場合は、以下のように特別な処理が必要です。

マスクで使われる3チャンネルのRGBグラフィックスオブジェクト(例:3チャンネル画像ファイルを参照した場合)は、アルファ値がすべて1の4チャンネルRGBA画像に変換されたかのように扱います。

マスクで使われる1チャンネル画像(例:1チャンネルグレースケール画像ファイルを参照した場合)は、参照元オブジェクトの1チャンネルを使って3つのカラー値を計算し、アルファ値は一律1として4チャンネルRGBA画像に変換されたかのように扱います。

注: グレースケール画像ファイルを参照する場合、エンコードされたグレースケール値と線形光値の対応カーブ(トランスファーカーブ)を色チャンネル計算時に考慮する必要があります。

注: SVGのグラフィック要素(例:circletext)は、マスキング処理上すべて4チャンネルRGBA画像として扱われます。

マスクの効果は、マスクがなかった場合に対象オブジェクトのアルファチャンネルがマスクの算出マスク値で乗算されるのと同じです。

mask imageで覆われていない領域は透明な黒として扱われ、マスク値は0となります。

注: 繰り返しタイルされたmask image同士は互いにオフセットを持つ場合があります。mask image間の領域は透明な黒のマスクとして扱われます。

7.10.2. 複数マスク画像のレイヤー化

ボックスのマスクは複数レイヤーを持つことができます。レイヤー数はmask-imageプロパティのカンマ区切り値数で決まります。noneが他の<mask-reference>と併記された場合でもレイヤーは生成されます。

複数背景画像のレイヤー化[CSS3BG]も参照してください。

mask-modemask-compositeはCSS Backgrounds and Borders[CSS3BG]に対応するプロパティはありません。対応プロパティがある場合と同じく、値リストは先頭から順にレイヤーへ割り当てられ、末尾の余分な値は使われません。プロパティ値がレイヤー数に足りない場合、UAは値リストを繰り返しレイヤー数に合わせてused valueを計算します。

全てのmask layer imageは(必要ならマスク処理を参照)アルファマスクに変換され、mask-compositeで指定された合成演算子を考慮して合成されます。

8. ボーダーボックスマスク

mask-borderを使うと画像を9分割できます:4つの角、4つの辺、中央の1ピース(下図参照)。

pieces of a mask border image

mask border imageのピース。

これらのピースはさまざまな方法でスライス、スケール、ストレッチされ、mask border image areaのサイズに合わせて調整されます。この変形画像がマスクとして使用されます。mask-borderの構文はCSS Background and Bordersborder-imageプロパティに対応します[CSS3BG]

下記例のmask border imageは4つの角(各75px)、4つの辺、中央ピースに分割され、中央はストレッチとスケールされます。
Example for 'mask-border'

mask-borderの例。左がマスク対象、中央がアルファマスク、右がマスク後のオブジェクト。

div {
    background: linear-gradient(bottom, #F27BAA 0%, #FCC8AD 100%);
    mask-border-slice: 25 fill;
    mask-border-repeat: stretch;
    mask-border-source: url(mask.png);
}

8.1. マスクボーダー画像ソース:mask-border-source プロパティ

名前: mask-border-source
値: none | <image>
初期値: none
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: キーワードnone、または算出された<image>
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

mask border imageとして使う画像を指定します。

空画像(幅または高さがゼロ)、ダウンロードに失敗した画像、存在しない画像、表示できない画像(未対応画像形式など)は無視されます。こうした画像もmask border imageとして扱われますが、要素のマスキングには使われません。

“マスク処理”mask border imageの処理方法を参照してください。

none以外の算出値は、CSSのスタッキングコンテキスト[CSS21]を、CSSのopacity[CSS3COLOR]1以外の値で作る場合と同様に生成します。

mask-border-sourcemask-imageは互いに独立して指定できます。両方ともnone以外の値の場合、要素は両方のマスキング処理が順に適用されます。

注: mask-imageを先に適用しても後に適用しても、mask-border-sourceを先に適用しても、描画結果は同じです。

8.2. マスクボーダー画像の解釈:mask-border-modeプロパティ

名前: mask-border-mode
値: luminance | alpha
初期値: alpha
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

mask-border-modeプロパティは、<image>値(mask-border-source)を輝度マスクまたはアルファマスクとして扱うかを示します。(マスク処理参照)

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

alpha

alpha値は、mask border imageのアルファ値をマスク値として使用することを示します。マスク値の計算参照。

luminance

luminance値は、mask border imageの輝度値をマスク値として使用することを示します。マスク値の計算参照。

mask-modemask-typeプロパティはmask border imageの型には影響しません。

8.3. マスクボーダー画像のスライス:mask-border-slice プロパティ

名前: mask-border-slice
値: <number-percentage>{1,4} fill?
初期値: 0
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: mask border imageのサイズを参照
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

このプロパティは、mask border imageの上端・右端・下端・左端からの内側オフセットを指定し、画像を9つの領域(4つの角、4つの辺、中央)に分割します。中央部分の画像は破棄され、完全に不透明な白として扱われます(中央部分で覆われたコンテンツはマスクされず、そのまま表示される)ただし、fill キーワードが指定されている場合を除きます。

プロパティ値の定義についてはborder-image-sliceプロパティ[CSS3BG]を参照してください。

8.4. マスキング領域:mask-border-width プロパティ

名前: mask-border-width
値: [ <length-percentage> | <number> | auto ]{1,4}
初期値: auto
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: mask border image areaの幅/高さに対して相対
算出値: 全ての<length>は絶対値化、それ以外は指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

mask border imageは、mask border image areaと呼ばれる領域の内部に描画されます。この領域の境界はデフォルトではborder boxに一致します。詳細はmask-border-outset参照。

プロパティ値の定義についてはborder-image-widthプロパティ[CSS3BG]を参照してください。

注: レイアウトボックスを持たないSVG要素では、border-width0とみなされます。

8.5. エッジのはみ出し:mask-border-outset プロパティ

名前: mask-border-outset
値: [ <length> | <number> ]{1,4}
初期値: 0
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 全ての<length>は絶対値化、それ以外は指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

値はmask border image areaがborder boxより外側にはみ出す量を指定します。4値指定の場合は順に上・右・下・左のはみ出し量を設定します。左が省略された場合は右と同じ、下が省略された場合は上と同じ、右が省略された場合も上と同じになります。

mask-border-widthと同様に、<number>は対応するborder-widthの倍数を表します。mask-border-outsetの値には負の値は許可されません。

注: レイアウトボックスを持たないSVG要素では、border-width0とみなされます。

8.6. マスクボーダー画像のタイル化:mask-border-repeat プロパティ

名前: mask-border-repeat
値: [ stretch | repeat | round | space ]{1,2}
初期値: stretch
適用対象: すべての要素。SVGではコンテナ要素defs要素を除く)、すべてのグラフィック要素、およびuse要素に適用されます
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

このプロパティは、mask border imageのサイドや中央部分の画像のスケール・タイル方法を指定します。最初のキーワードは水平サイド、2番目は垂直サイドに適用されます。2番目のキーワードが省略された場合は1つ目と同じ値が使われます。

プロパティ値の定義についてはborder-image-repeatプロパティ[CSS3BG]を参照してください。

mask border imageパーツのスケール・タイル処理については「mask border imageによるマスキング」セクションを参照してください。

8.7. マスクボーダー画像ショートハンド:mask-borderプロパティ

名前: mask-border
値: <'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>
初期値: 個別プロパティ参照
適用対象: 個別プロパティ参照
継承: no
パーセンテージ: n/a
算出値: 個別プロパティ参照
正規順序: 文法通り
アニメーション型: 個別プロパティ参照
メディア: visual

このプロパティは、mask-border-sourcemask-border-slicemask-border-widthmask-border-outsetmask-border-repeatmask-border-modeを一括設定するショートハンドです。省略された値は初期値が設定されます。

注: maskショートハンドは、mask-bordermask-border-sourcemask-border-slicemask-border-widthmask-border-outsetmask-border-repeatmask-border-modeプロパティをリセットします。

8.8. マスクボーダー画像によるマスキング

mask border imagemask-border-sourceで与えられ、mask-border-slice値で分割された後、得られた9つの画像は4つのステップでスケール・配置・タイル化され、対応するmask border image領域に配置されます。詳細は枠画像の描画セクション[CSS3BG]参照。

mask-border-sourceプロパティがCSSボックスモデルで整形された要素に適用されると、CSSのスタッキングコンテキストを生成し、全ての子孫要素がグループ化されて描画され、マスキングがグループ全体に適用されます。これはCSSのopacity[CSS3COLOR]と同様です。

mask-border-sourceプロパティは、要素のCSSボックスのジオメトリやヒットテストには影響しません。

9. SVGマスクソース

9.1. mask要素

名前: mask
カテゴリ: コンテナ要素, 非表示要素
内容モデル: 以下の要素を任意の順・数で含むことができます:
属性:
DOMインターフェース: SVGMaskElement

属性定義:

maskUnits = "userSpaceOnUse | objectBoundingBox"

属性xywidthheightの座標系を定義します。

userSpaceOnUse

xywidthheightは、ユーザー座標系[CSS3-TRANSFORMS])の値として解釈されます。この座標系はmask要素が参照された時点のものです(つまりmaskプロパティでmask要素を参照する要素のユーザー座標系)。

objectBoundingBox

xywidthheightは、マスクが適用される要素のオブジェクトバウンディングボックスの割合またはパーセンテージとして解釈されます。ユーザー座標はCSSのpx単位と同じ大きさです。

属性maskUnitsが指定されていない場合、objectBoundingBoxが指定されたものとして扱われます。

アニメーション可能: yes.

maskContentUnits = "userSpaceOnUse | objectBoundingBox"

maskの内容の座標系を定義します。

userSpaceOnUse

mask要素の内容のユーザー座標系は、mask要素が参照された時点の現在のユーザー座標系(すなわち、maskプロパティでmask要素を参照する要素のユーザー座標系)となります。

objectBoundingBox

座標系の原点は、マスキングパスが適用される要素のバウンディングボックスの左上隅であり、同じ幅と高さを持ちます。ユーザー座標はCSSのpx単位と同じ大きさです。

maskContentUnits属性が指定されていない場合、userSpaceOnUseが指定されたものとして扱われます。

アニメーション可能:はい。

x = "<length-percentage>"

最大サイズのオフスクリーンバッファの矩形の一隅のx軸座標です。 この属性が指定されていないが、ywidthheightのいずれかが指定されている場合、値-10%が指定されたものとして扱われます。

アニメーション可能:はい。

y = "<length-percentage>"

最大サイズのオフスクリーンバッファの矩形の一隅のy軸座標です。 この属性が指定されていないが、xwidthheightのいずれかが指定されている場合、値-10%が指定されたものとして扱われます。

アニメーション可能:はい。

width = "<length-percentage>"

最大サイズのオフスクリーンバッファの幅です。負の値またはゼロの値は要素の描画を無効化します。 この属性が指定されていないが、xyheightのいずれかが指定されている場合、値120%が指定されたものとして扱われます。

アニメーション可能:はい。

height = "<length-percentage>"

最大サイズのオフスクリーンバッファの高さです。 負の値またはゼロの値は要素の描画を無効化します。 この属性が指定されていないが、xywidthのいずれかが指定されている場合、値120%が指定されたものとして扱われます。

アニメーション可能:はい。

xywidthheightの少なくとも1つが指定されている場合、指定されたオブジェクトとxywidthheightで定義される矩形が現在のクリッピングパスを確立します。マスクの描画内容はこのクリッピングパスによってクリップされなければなりません。

CSSプロパティはmask要素の祖先から継承されますが、mask要素を参照する要素からは継承されません

mask要素は直接描画されることはなく、maskプロパティで参照される用途のみです。opacityfilterdisplayプロパティはmask要素には適用されません。そのため、mask要素はdisplayプロパティがnone以外であっても直接描画されず、mask要素自身や祖先のdisplayプロパティがnoneでも参照用途には利用可能です。

9.2. マスクソースの解釈:mask-typeプロパティ

名前: mask-type
値: luminance | alpha
初期値: luminance
適用対象: mask要素
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 離散型
メディア: visual

mask-typeプロパティは、mask要素の内容を輝度マスクまたはアルファマスクとして扱うかを定義します。詳細はマスク値の計算参照。

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

luminance

マスクの輝度値を使用することを示します。

alpha

マスクのアルファ値を使用することを示します。

mask-typeプロパティにより、mask要素の作者が希望するマスクモードを指定できます。ただし、作者はマスクされた内容側でmask-mode値をmatch-source以外に設定することでこの希望を上書きできます。

次の例ではmask-typeの算出値がluminancemask-modeの算出値がmatch-sourceです。UAはmask要素で定義された希望するマスクモードに従わなければなりません。
<svg>
  <mask style="mask-type: luminance;" id="mask">
    ...
  </mask>
</svg>

<p style="mask-image: url(#mask); mask-mode: auto;">
  This is the masked content.
</p>

次の例ではmask-modeの算出値がalphaとなり、mask要素側の希望(算出値luminance)を上書きします。この場合mask layer imageはアルファマスクとして扱われます。

lt;svg>
 <mask style="mask-type: luminance;" id="mask2">
   ...
 </mask>
lt;/svg>

lt;p style="mask-image: url(#mask2); mask-mode: alpha;">
 This is the masked content.
lt;/p>

mask-typeプロパティはSVG要素の表示属性です。

10. プライバシーとセキュリティの考慮事項

マスキング操作の処理時間は、ソースやデスティネーションのピクセルに依存しないことが重要です。マスキング操作は、どんなピクセル値であっても常に同じ時間がかかるように実装しなければなりません。このルールが守られない場合、攻撃者が情報を推測しタイミング攻撃を仕掛ける可能性があります。

タイミング攻撃とは、保護されたコンテンツの処理にかかる時間を観察することで情報を得る手法です。たとえば、赤いピクセルを描画する方が緑のピクセルより時間がかかる場合、描画される要素の内容に直接アクセスせずとも粗い画像を復元できる可能性があります。

<mask-source><clip-source>は、リソースのフェッチに特別な要件があります。

ユーザーエージェントは、CORS対応フェッチ[FETCH]仕様で定義)を、<mask-source><clip-source>、および<image>値(mask-imagemask-border-sourceclip-pathプロパティ)に対して使用しなければなりません。フェッチ時は「Anonymous」モードを使い、リファラーソースはスタイルシートのURL、オリジンは含むドキュメントのURLに設定します。これでネットワークエラーとなった場合は、値noneが指定されたものとして扱います。

付録A: 非推奨のclip プロパティ

名前: clip
値: rect() | auto
初期値: auto
適用対象: 絶対配置要素。SVGでは新規ビューポートを確立する要素pattern要素、mask要素に適用されます。
継承: no
パーセンテージ: n/a
算出値: 指定通り
正規順序: 文法通り
アニメーション型: 算出値による
メディア: visual

この仕様によりclipプロパティは非推奨となります。著者はclip-pathプロパティの使用が推奨されます。UAはclipプロパティをサポートしなければなりません。

clip プロパティは絶対配置要素のみに適用されます。SVGでは新規ビューポートを確立する要素pattern要素、mask要素に適用されます。値の意味は以下の通りです:

auto

その要素はクリップしません。

rect() = rect( <top>, <right>, <bottom>, <left> )

<top><bottom>はボックスの上端ボーダーエッジからのオフセットを指定し、<right><left>は左端ボーダーエッジからのオフセットを指定します。著者は値の区切りにカンマを使うべきです。UAはカンマ区切りをサポートしなければならないが、カンマ無し(ただし混在は不可)もサポートしてもよいです。これは以前の仕様が曖昧だったためです。

<top><right><bottom><left>は、<length> 値またはautoが指定できます。負の長さも許可されます。値autoは、そのクリッピング領域のエッジが要素の生成されたボーダーボックスのエッジと同じになることを意味します(つまりauto<top><left>では0と同じ意味、<bottom>では高さ+上下パディング+ボーダー幅の合計、<right>では幅+左右パディング+ボーダー幅の合計となり、4つすべてautoの場合はクリッピング領域が要素のボーダーボックスと一致します)。

座標がピクセル座標に丸められるとき、<left><right>が同じ値(または<top><bottom>が同じ値)のとき、ピクセルが残って表示されないよう注意すること。またこれらの値がautoのときは、要素のボーダーボックス内に隠れてしまうピクセルがないよう注意すること。

clip プロパティはSVG要素の表示属性です。

例:次の2つのルール:
p#one { clip: rect(5px, 40px, 45px, 5px); }
p#two { clip: rect(5px, 55px, 45px, 5px); }

どちらもP要素が50×55ピクセルだと仮定すると、下図の破線で示される矩形クリッピング領域がそれぞれ作成されます:

Values for rect shape

この図は2つのブロックボックスが並んでおり、それぞれ異なる寸法の矩形クリッピング領域が設定されています。(詳細説明参照)

付録B: ストロークバウンディングボックスの算出

stroke bounding boxを算出するアルゴリズムは、elementの型によって次のようになります:

a グラフィック要素useimageを除くもの
テキストコンテンツ要素を持つa要素
  1. boxelementオブジェクトバウンディングボックスで初期化する。

  2. used valuestroke-width <= 0 またはstrokeのused valueがnoneならboxを返す。

  3. deltastroke-widthの半分で初期化する。

  4. elementrectellipsecircleimage以外の場合、次の条件のうち該当するもの1つだけ順に処理:

    stroke-linejoinのused valueがmiterの場合
    1. miterstroke-miterlimitのused valueで初期化。

    2. miterが√2未満かつstroke-linecapのused valueがsquareの場合、deltaに√2を乗算。そうでなければdeltamiterを乗算。

    stroke-linecapのused valueがsquareの場合
    1. deltaに√2を乗算。

  5. boxdelta分膨張させる。

  6. boxを返す。

注: stroke-opacitystroke-dasharraystroke-dashoffsetの値はストロークバウンディングボックスの算出に影響しません。

コンテナ要素
use
  1. parentをコンテナ要素ならそれ、そうでなければuse要素のシャドウツリーのルートにする。

  2. 各子childごとに:

    1. ストロークバウンディングボックス算出アルゴリズムをchildで呼び出す。

    2. 呼び出し結果のボックス値をchildBoxとする。

    3. childBoxchildの座標空間からparentの座標空間へマッピングする。

  3. 全てのchildBoxの和集合をboxとする。

  4. boxを返す。

image
  1. elementオブジェクトバウンディングボックスを返す。

注: SVG仕様の将来版でこのセクションが上書きされる可能性があります。

付録C: DOMインターフェース

SVGClipPathElement インターフェース

SVGClipPathElementインターフェースはclipPath要素に対応します。

[Exposed=Window]
interface SVGClipPathElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration clipPathUnits;
  readonly attribute SVGAnimatedTransformList transform;
};
属性:
clipPathUnits, 型は SVGAnimatedEnumeration、読み取り専用

指定されたclipPathUnits属性に対応します。値はSVGUnitTypesで定義された定数のいずれかを取ります。

transform, 型は SVGAnimatedTransformList、読み取り専用

指定された要素の表示属性transformに対応します。

SVGMaskElement インターフェース

SVGMaskElementインターフェースはmask要素に対応します。

[Exposed=Window]
interface SVGMaskElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration maskUnits;
  readonly attribute SVGAnimatedEnumeration maskContentUnits;
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
};
属性:
maskUnits, 型は SVGAnimatedEnumeration、読み取り専用

指定されたmaskUnits属性に対応します。値はSVGUnitTypesで定義された定数のいずれかを取ります。

maskContentUnits, 型は SVGAnimatedEnumeration、読み取り専用

指定されたmaskContentUnits属性に対応します。値はSVGUnitTypesで定義された定数のいずれかを取ります。

x, 型は SVGAnimatedLength、読み取り専用

指定されたx属性に対応します。

y, 型は SVGAnimatedLength、読み取り専用

指定されたy属性に対応します。

width, 型は SVGAnimatedLength、読み取り専用

指定されたwidth属性に対応します。

height, 型は SVGAnimatedLength、読み取り専用

指定されたheight属性に対応します。

前回公開以降の変更点

以下は2014年8月26日 Candidate Recommendation以降の変更です。

以下は2014年5月22日 Working Draft以降の変更です。

以下は2014年2月13日 Working Draft以降の変更です。

以下は2013年10月29日 Last Call Working Draft以降の主な変更です。

以下は2013年6月20日 Working Draft以降の主な変更です。

2012年11月15日作業草案(英語)以降の主な変更点は以下の通りです。

詳細な変更点はChangeLogを参照してください。

謝辞

Elika J. Etemad、Cameron McCormack、Liam R. E. Quin、Björn Höhrmann、Alan Stearns、Jarek Foksa、David Baron、Boris Zbarsky、Markus Stange、Sara Soueidanの丁寧なレビュー、コメント、修正に感謝します。 特にCJ Gammonにはグラフィック素材で感謝します。

適合性

文書の慣例

適合性要件は、記述的な主張とRFC 2119の用語を組み合わせて表現されます。重要なキーワード「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」は、この文書の規範部分ではRFC 2119に従って解釈されます。 ただし、可読性を考慮し、これらの語は本仕様ではすべて大文字ではありません。

この仕様のテキストは、明示的に非規範と記載されているセクション、例、注釈を除き、すべて規範的です。 [RFC2119]

本仕様の例は「例えば」で始まるか、またはclass="example"で規範テキストから分離して提示されます。例:

これは情報的な例です。

情報的な注釈は「Note」で始まり、class="note"で規範テキストと区別されます。例:

注:これは情報的な注釈です。

勧告文は規範セクションとして特別に目立たせ、<strong class="advisement">で他の規範テキストと区別します。例: UAはアクセシブルな代替手段を提供しなければなりません。

適合クラス

この仕様への適合は、以下の三つの適合クラスに対して定義されます:

スタイルシート
CSS スタイルシート
レンダラー
UAであり、スタイルシートの意味を解釈し、それを用いた文書をレンダリングするもの。
オーサリングツール
UAであり、スタイルシートを書き出すもの。

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

レンダラーは、スタイルシートを適切な仕様に従い解釈することに加え、本仕様で定義されたすべての機能を正しくパースし、文書をそれに従いレンダリングすることで、本仕様に適合します。ただし、デバイスの制限によりUAが文書を正しくレンダリングできない場合でも、UAは非適合とはみなされません。(例えば、モノクロモニターでは色のレンダリングは不要です。)

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

部分的な実装

著者が前方互換性のあるパース規則を利用してフォールバック値を指定できるように、CSSレンダラーは、利用可能なサポートレベルがないすべての@規則、プロパティ、プロパティ値、キーワード、その他の構文を無効(および適切に無視)として扱わなければなりません。特に、ユーザーエージェントは、マルチ値プロパティ宣言でサポートされない成分値を選択的に無視し、サポートされる値だけを適用してはなりません。いずれかの値が無効(未サポート値は必ず無効)とみなされる場合、CSSでは宣言全体を無視する必要があります。

不安定機能・独自拡張の実装

将来の安定CSS機能との競合を避けるため、CSSWGはベストプラクティスに従い、不安定な機能独自拡張の実装を推奨します。

非実験的な実装

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

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

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

CR終了基準

本仕様を勧告案(Proposed Recommendation)に進めるには、各機能に対して少なくとも2つの独立した相互運用可能な実装が必要です。各機能は異なる製品セットによって実装されてもよく、すべての機能を単一製品が実装する必要はありません。この基準のため、以下の用語を定義します:

独立
各実装は異なる開発者によって開発され、他の適格実装のコードを共有、再利用、派生してはなりません。本仕様の実装に関係しないコードはこの要件から除外されます。
相互運用可能
公式CSSテストスイートの該当テストケースをパスするか、Webブラウザ以外の場合は同等のテストをパスすること。テストスイートの各関連テストには同等テストが作成される必要があり、そのUAで相互運用性を主張する場合は、同じ方法で同等テストをパスできる追加UAが必要です。同等テストはピアレビューのために公開されなければなりません。
実装
ユーザーエージェントであり、以下を満たすもの:
  1. 仕様を実装していること。
  2. 一般公開されていること。実装はリリース製品またはベータ版、プレビュー版、「ナイトリービルド」等の公開版でよい。未リリース製品は、少なくとも1ヶ月間機能を実装して安定性を示す必要がある。
  3. 実験的なものではないこと(テストスイートを通す目的だけで設計され、今後通常利用される予定のないバージョンは不可)。

仕様は少なくとも6ヶ月間、候補勧告(Candidate Recommendation)として維持されます。

索引

本仕様で定義されている用語

参照によって定義される用語

参考文献

規範的参考文献

[COMPOSITING-1]
Rik Cabanier; Nikos Andronikos. Compositing and Blending Level 1. 2015年1月13日. CR. URL: https://www.w3.org/TR/compositing-1/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018年12月18日. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2021年6月8日. WD. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley. CSS Color Module Level 4. 2021年6月1日. WD. URL: https://www.w3.org/TR/css-color-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2020年12月18日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 2021年7月29日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS Fonts Module Level 5. 2021年7月29日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 2020年12月17日. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad; Steve Zilles. CSS Inline Layout Module Level 3. 2020年8月27日. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2020年6月3日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-SHAPES]
Vincent Hardy; Rossen Atanassov; Alan Stearns. CSS Shapes Module Level 1. 2014年3月20日. CR. URL: https://www.w3.org/TR/css-shapes-1/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2021年4月22日. CR. URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 3. 2019年8月13日. CR. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS-UI-3]
Tantek Çelik; Florian Rivoal. CSS Basic User Interface Module Level 3 (CSS3 UI). 2018年6月21日. REC. URL: https://www.w3.org/TR/css-ui-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2021年7月15日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019年12月10日. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS21]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS3-TRANSFORMS]
Simon Fraser; 他. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2021年7月26日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS3VAL]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[FETCH]
Anne van Kesteren. Fetch Standard. リビングスタンダード. URL: https://fetch.spec.whatwg.org/
[FILL-STROKE-3]
Elika Etemad; Tab Atkins Jr.. CSS Fill and Stroke Module Level 3. 2017年4月13日. WD. URL: https://www.w3.org/TR/fill-stroke-3/
[FILTER-EFFECTS]
Dirk Schulze; Dean Jackson. Filter Effects Module Level 1. 2018年12月18日. WD. URL: https://www.w3.org/TR/filter-effects-1/
[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
[SVG11]
Erik Dahlström; 他. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/
[SVG2]
Amelia Bellamy-Royds; 他. Scalable Vector Graphics (SVG) 2. 2018年10月4日. CR. URL: https://www.w3.org/TR/SVG2/
[WebIDL]
Boris Zbarsky. Web IDL. 2016年12月15日. ED. URL: https://heycam.github.io/webidl/

参考情報文献

[CSS3COLOR]
Tantek Çelik; Chris Lilley; David Baron. CSS Color Module Level 3. 2018年6月19日. REC. URL: https://www.w3.org/TR/css-color-3/

プロパティ索引

名前 初期値 適用対象 継承 パーセンテージ アニメーション型 正規順序 算出値 メディア
clip rect() | auto auto 絶対配置要素。SVGでは新規ビューポートを確立する要素、pattern要素、mask要素に適用 no n/a 算出値による 文法通り 指定通り visual
clip-path <clip-source> | [ <basic-shape> || <geometry-box> ] | none none 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素、use要素に適用 no n/a 算出値による 文法通り 指定通り。ただし<url>値は絶対化 visual
clip-rule nonzero | evenodd nonzero SVGグラフィック要素に適用 yes n/a 離散型 文法通り 指定通り visual
mask <mask-layer># 個別プロパティ参照 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素、use要素に適用 no 個別プロパティ参照 個別プロパティ参照 文法通り 個別プロパティ参照 visual
mask-border <'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'> 個別プロパティ参照 個別プロパティ参照 no n/a 個別プロパティ参照 文法通り 個別プロパティ参照 visual
mask-border-mode luminance | alpha alpha 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素、use要素に適用 no n/a 離散型 文法通り 指定通り visual
mask-border-outset [ <length> | <number> ]{1,4} 0 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素、use要素に適用 no n/a 離散型 文法通り 全ての<length>を絶対値化、他は指定通り visual
mask-border-repeat [ stretch | repeat | round | space ]{1,2} stretch 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素、use要素に適用 no n/a 離散型 文法通り 指定通り visual
mask-border-slice <number-percentage>{1,4} fill? 0 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素、use要素に適用 no mask border imageのサイズ参照 離散型 文法通り 指定通り visual
mask-border-source none | <image> none 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素、use要素に適用 no n/a 離散型 文法通り キーワードnoneまたは算出<image> visual
mask-border-width [ <length-percentage> | <number> | auto ]{1,4} auto 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素、use要素に適用 no mask border image areaの幅・高さに対する割合 離散型 文法通り 全ての<length>を絶対値化、他は指定通り visual
mask-clip [ <geometry-box> | no-clip ]# border-box 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素、use要素に適用 no n/a 離散型 文法通り 指定通り visual
mask-composite <compositing-operator># add 全ての要素。SVGではdefs要素を除くコンテナ要素、全てのグラフィック要素に適用 no n/a 離散型 文法通り 指定通り visual
mask-image <mask-reference># none すべての要素。SVGではdefs要素を除くコンテナ要素、すべてのグラフィック要素、use要素に適用 no n/a 離散型 文法通り キーワードnone、算出された<image>または算出された<url> visual
mask-mode <masking-mode># match-source すべての要素。SVGではdefs要素を除くコンテナ要素、すべてのグラフィック要素、use要素に適用 no n/a 離散型 文法通り 指定通り visual
mask-origin <geometry-box># border-box すべての要素。SVGではdefs要素を除くコンテナ要素、すべてのグラフィック要素、use要素に適用 no n/a 離散型 文法通り 指定通り visual
mask-position <position># 0% 0% すべての要素。SVGではdefs要素を除くコンテナ要素、すべてのグラフィック要素、use要素に適用 no マスクペインティング領域のサイズからマスクレイヤー画像のサイズを引いたものに対する割合。詳細はtext background-position [CSS3BG]参照 繰り返しリスト 文法通り 2つのキーワード(原点)+原点からの2つのオフセット。オフセットは<length>なら絶対長、そうでなければパーセンテージ visual
mask-repeat <repeat-style># repeat すべての要素。SVGではdefs要素を除くコンテナ要素、すべてのグラフィック要素、use要素に適用 no n/a 離散型 文法通り 2つのキーワード(各次元ごと) visual
mask-size <bg-size># auto すべての要素。SVGではdefs要素を除くコンテナ要素、すべてのグラフィック要素、use要素に適用 no n/a 繰り返しリスト 文法通り 指定通り。ただし長さは絶対値に変換 visual
mask-type luminance | alpha luminance mask要素 no n/a 離散型 文法通り 指定通り visual

IDL索引

[Exposed=Window]
interface SVGClipPathElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration clipPathUnits;
  readonly attribute SVGAnimatedTransformList transform;
};

[Exposed=Window]
interface SVGMaskElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration maskUnits;
  readonly attribute SVGAnimatedEnumeration maskContentUnits;
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
};

課題索引

Firefoxは、内容モデルが違反しているclipPathを参照する要素の描画を無効化します。他のブラウザは、間接参照によるuse上のclipPathを無視しません。<https://github.com/w3c/csswg-drafts/issues/17>
CSSプロパティが生ジオメトリへ与える影響を定義してください。特にテキストへの影響について。<https://github.com/w3c/csswg-drafts/issues/170>