このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

mask

Baseline 2023
Newly available

Since ⁨December 2023⁩, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

maskCSS一括指定プロパティで、画像の指定した領域をマスクまたはクリップして、要素を(部分的にまたは完全に)非表示にします。これは、すべての mask-* プロパティの一括指定です。このプロパティは、カンマで区切られた 1 つ以上の値を受け入れ、各値は <mask-layer> に対応します。

構成要素のプロパティ

このプロパティは以下の CSS プロパティの一括指定です。

構文

css
/* キーワード値 */
mask: none;

/* 画像値 */
mask: url(mask.png); /* マスクとして使用されるピクセル画像 */
mask: url(masks.svg#star); /* マスクとして使用される SVG グラフィック内の要素 */

/* 組み合わせ値 */
mask: url(masks.svg#star) luminance; /* 輝度マスクとして使用される SVG グラフィック内の要素 */
mask: url(masks.svg#star) 40px 20px; /* マスクとして使用される 上から 40px、左から 20px の位置に配置されている */
mask: url(masks.svg#star) 0 0/50px 50px; /* 幅と高さが 50px のマスクとして使用される SVG グラフィック内の要素 */
mask: url(masks.svg#star) repeat-x; /* 水平方向に繰り返されるマスクとして使用される SVG グラフィック内の要素 */
mask: url(masks.svg#star) stroke-box; /* ストロークで囲まれたボックスに拡張するマスクとして使用される SVG グラフィック内の要素 */
mask: url(masks.svg#star) exclude; /* SVGグラフィック内の要素をマスクとして使用し、非重複部分を使用して背景と組み合わせる */

/* 複数のマスク */
mask:
  url(masks.svg#star) left / 16px repeat-y,
  /* 幅 16px の左端のマスク */ url(masks.svg#circle) right / 16px repeat-y; /* 幅 16px の右端のマスク */

/* グローバル値 */
mask: inherit;
mask: initial;
mask: revert;
mask: revert-layer;
mask: unset;

<mask-layer>

カンマで区切られた 1 つ以上のマスクレイヤーで、以下の要素で構成されます。

<mask-reference>

マスク画像のソースを設定します。 mask-image を参照してください。

<masking-mode>

マスク画像のマスクモードを設定します。 mask-mode を参照してください。

<position>

マスク画像の位置を設定します。 mask-position を参照してください。

<bg-size>

マスク画像の大きさを設定します。 mask-size を参照してください。

<repeat-style>

マスク画像の反復を設定します。 mask-repeat を参照してください。

<geometry-box>

<geometry-box> 値が 1 つのみが与えられた場合は、mask-originmask-clip の両方が設定されます。2 つの <geometry-box> 値が存在する場合、1 つ目の値は mask-origin を設定し、2 つ目の値は mask-clip を設定します。

<geometry-box> | no-clip

マスク画像の影響を受ける範囲を設定します。 mask-clip を参照してください。

<compositing-operator>

現在のマスクレイヤーに使用する合成操作を設定します。 mask-composite を参照してください。

解説

mask 一括指定プロパティは、それが適用される要素の一部またはすべてを非表示にします。非表示、表示、または部分的に表示される要素の部分は、マスクの不透明(マスクのアルファチャンネル)または明るさ(輝度)によって決まります。アルファマスクでは、マスクの不透明な領域は要素を表示し、透明な領域は要素を非表示にします。輝度マスクでは、マスクの明るい不透明な領域は要素を表示し、暗い領域または透明な領域は要素を非表示にします。

マスクを構成するすべてのプロパティを宣言する必要はありませんが、除外した値は、次の初期値に既定で設定されます。

css
mask-image: none;
mask-mode: match-source;
mask-position: 0% 0%;
mask-size: auto;
mask-repeat: repeat;
mask-origin: border-box;
mask-clip: border-box;
mask-composite: add;

それぞれの <mask-layer> 内で、mask-size 要素は mask-position 値の後ろに、 2 つをスラッシュ (/) で区切って記述する必要があります。

2 つの <geometry-box> 値が存在する場合は、最初の値が mask-origin 値、 2 つ目の値が mask-clip 値となります。 1 つの <geometry-box> 値と no-clip キーワードが存在する場合、 <geometry-box>mask-origin プロパティの値となります。 no-clipmask-clip プロパティにのみ有効であるためです。この場合、2 つの値の順序は関係ありません。 1 つの <geometry-box> 値のみが存在する場合(no-clip キーワードが指定されていない場合)、この値は mask-origin プロパティと mask-clip プロパティの両方に使用されます。

mask 一括指定は、すべての mask-border-* プロパティを initial 値にリセットするため、これらのプロパティ、または mask-border 一括指定を、mask 宣言の後で宣言する必要があります。宣言ブロックで mask を設定すると、次の設定も暗黙的に適用されます。

css
mask-border-source: none;
mask-border-mode: alpha;
mask-border-outset: 0;
mask-border-repeat: stretch;
mask-border-slice: 0;
mask-border-width: auto;

このため、仕様書では、カスケードで以前に設定されたマスクを上書きするには、個々の要素のプロパティではなく、 mask の一括指定プロパティを使用することを推奨しています。これにより、 mask-border も確実にリセットされます。

公式定義

初期値一括指定の次の各プロパティとして
適用対象すべての要素。 SVG の場合は <defs> 要素やすべてのグラフィック要素を除いたコンテナー要素に適用される
継承なし
パーセント値一括指定の次の各プロパティとして
  • mask-position: マスク描画領域の寸法からマスクレイヤー画像の寸法を引いたものに対する相対値 (background-position のテキストを参照)
計算値一括指定の次の各プロパティとして
  • mask-image: 指定通り、ただし <url> の値は絶対パスになる
  • mask-mode: 指定通り
  • mask-repeat: 2 つのキーワードから成り、方向ごとに 1 つずつ
  • mask-position: 原点を表す 2 つのキーワードと、その原点からの 2 つのオフセットで、それぞれが絶対的な長さ (<length> が指定された場合) またはパーセント値で指定される。
  • mask-clip: 指定通り
  • mask-origin: 指定通り
  • mask-size: 指定通り。ただし相対的な長さはは絶対的な長さに変換される
  • mask-composite: 指定通り
アニメーションの種類一括指定の次の各プロパティとして
重ね合わせコンテキストの生成あり

形式文法

mask = 
<mask-layer>#

<mask-layer> =
<mask-reference> ||
<position> [ / <bg-size> ]? ||
<repeat-style> ||
<geometry-box> ||
[ <geometry-box> | no-clip ] ||
<compositing-operator> ||
<masking-mode>

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

<position> =
[ left | center | right | top | bottom | <length-percentage> ] |
[ left | center | right ] && [ top | center | bottom ] |
[ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] |
[ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ]

<bg-size> =
[ <length-percentage [0,∞]> | auto ]{1,2} |
cover |
contain

<repeat-style> =
repeat-x |
repeat-y |
[ repeat | space | round | no-repeat ]{1,2}

<geometry-box> =
<shape-box> |
fill-box |
stroke-box |
view-box

<compositing-operator> =
add |
subtract |
intersect |
exclude

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

<image> =
<url> |
<gradient>

<mask-source> =
<url>

<length-percentage> =
<length> |
<percentage>

<shape-box> =
<visual-box> |
margin-box

<url> =
<url()> |
<src()>

<visual-box> =
content-box |
padding-box |
border-box

<url()> =
url( <string> <url-modifier>* ) |
<url-token>

<src()> =
src( <string> <url-modifier>* )

画像のマスク

この例では、 CSS で生成された繰り返し扇形グラデーションをマスクソースとして使用して、画像をマスクしています。比較のために、グラデーションを背景画像としても表示させています。

HTML

<img> および空の <div> 要素を設置しています。

html
<img
  src="https://mdn.github.io/shared-assets/images/examples/progress-pride-flag.jpg"
  alt="Pride flag" />
<div></div>

CSS

同じ borderpadding、およびサイズを <img><div> の両方に設定します。

css
img,
div {
  border: 20px dashed rebeccapurple;
  box-sizing: content-box;
  padding: 20px;
  height: 220px;
  width: 220px;
}

次に、<img> にマスクを適用します。mask-image は、repeating-conic-gradient() 関数を使用して生成されます。これを、画像の content-box の左上隅から繰り返される 100px × 100px のグラデーションとして定義します。 2 つの <geometry-box> 値が含まれます。最初の値は mask-origin を設定し、 2 つ目の値は mask-clip プロパティの値を定義します。グラデーションは、透明から単色の lightgreen へと変化します。マスクの色ではなく、その透過率が重要であることを示すために、ここでは lightgreen を使用しています。

css
img {
  mask: repeating-radial-gradient(
      circle,
      transparent 0 5px,
      lightgreen 15px 20px
    )
    content-box border-box 0% 0% / 100px 100px repeat;
}

最後に、 <div>background 一括指定プロパティに、 mask で使用したのと同じ値を使用します。

css
div {
  background: repeating-radial-gradient(
      circle,
      transparent 0 5px,
      lightgreen 15px 20px
    )
    content-box border-box 0% 0% / 100px 100px repeat;
}

結果

仕様書

Specification
CSS Masking Module Level 1
# the-mask

ブラウザーの互換性

関連情報