フィルター効果の使用

モノクロまたはセピア調の画像にカーソルを当てると、フルカラーの画像が瞬時に表示されたことはありませんか?背景画像の一部分が小さくぼやけていることで、その上に表示されたテキストがより読みやすくなるという経験はありませんか? 以前は、このような操作を行うには画像編集ソフトウェア、時間、追加の HTTP リクエストなどが必要でした。

CSS フィルター効果を使用する利点

CSS のフィルター効果モジュールが提供するプロパティと関数を使用すれば、Photoshopを使用したり、余分なHTTPリクエストを送信することなく、上述の視覚効果を適用することができます。必要なソフトウェアはユーザーのブラウザーだけです。さらに、 CSS のフィルター効果は、あらかじめ設定された画像効果とは異なり、レスポンシブでアニメーションが可能です。

CSS フィルター効果モジュールでは、テキスト、画像、背景、境界線、またはこれらのプロパティを適用するその他の要素のレンダリングに影響を与えるために使用できる filter および backdrop-filter プロパティが提供されています。 このモジュールでは、不鮮明化や色変化などのグラフィック効果を追加できる <filter-function> データ型も定義しています。 フィルター関数を使用すると、要素の外観を変更できるだけでなく、作成したフィルターを使用して SVG フィルターを参照することもできます。

フィルター効果のプロパティ

CSS フィルター効果モジュールの以下の 2 つのフィルタープロパティにより、要素にゼロ、 1 つ、または複数のグラフィック効果を適用することができます。

  • filter プロパティを使用すると、要素がレンダリングされる前に、ぼかし、ドロップシャドウ、セピアなどのフィルター効果を適用することができます。フィルター効果は、要素のコンテンツ、境界線、パディングを含め、要素に直接適用されます。

  • backdrop-filter プロパティを使用すると、要素の背後(要素の「背景」)にグラフィック効果を適用することができます。 前景のコンテンツをより読みやすくするために、 backdrop-filter プロパティが使用されることが多く、特にコンテンツが所有する大きな領域がコンテンツに十分なコントラストを提供していない場合に有効です。 フィルター効果は要素の背景のみに適用され、要素のコンテンツには適用されません。

filter および backdrop-filter プロパティは、フィルターのリストを空白で区切って受け入れ、宣言された順に適用されます。

フィルター関数

CSS フィルター効果モジュールは、 10 個の <filter-function> 関数を提供するとともに、 url() 参照を使用して適用する SVG フィルターを使用して、無限に近い配列効果を定義する機能も提供します。

次の表には、 10 個のフィルター関数と、それらの値の型、該当する場合は最小有効値、効果を作成する最大値、および補間に使用される初期値が掲載されています。

フィルター関数 引数の型 最小値 最大効果 補間値 既定値(効果なし)
blur() <length> 0 0 blur(0)
brightness() <number> または <percentage> 0 1 brightness(1) または brightness(100%)
contrast() <length> 0 1 contrast(1) または contrast(100%)
drop-shadow() <shadow> 0 0 0 currentcolor drop-shadow(0 0 0 currentcolor)
grayscale() <number> または <percentage> 0 100% 0 grayscale(0) または grayscale(0%)
hue-rotate() <angle> 0 hue-rotate(0deg)
invert() <number> または <percentage> 0 100% 0 invert(0) または invert(0%)
opacity() <number> または <percentage> 0 100% 1 opacity(1) または opacity(100%)
saturate() <number> または <percentage> 0 100% 1 saturate(100%)
sepia() <number> または <percentage> 0 100% 0 sepia(0%)

最小値のあるフィルター関数は、最小値が含まれます。最小値未満の値をフィルター関数に指定すると、カンマ区切りのリストにある問題のフィルター関数だけでなく、プロパティ宣言全体が不正なものとなります。

最大効果値は超えることができます。 最大値として挙げられている値よりも大きな値を記載することは有効ですが、最大値として挙げられている値以上の効果をもたらすわけではありません。言い換えれば、要素に対する効果は、最大効果値が設定されている場合と同じになります。例えば、セピア調の例で sepia(400%) を設定すると、最大値である sepia(100%) と同じ効果が得られます。

既定値は、効果を作成しない値です。これらの値は効果を作成しませんが、初期補間値を提供し、値を設定する方法の例を示します。これらの既定値は、許可された最小値と最大効果値の間の基準値となります。

フィルター効果の適用

filter および backdrop-filter プロパティは、 1 つ以上の <filter-function>、既定のキーワード none、または SVG フィルターを指定する url() 値のリストを受け入れます。

セピア調フィルター効果の適用

下のセピア調の画像にカーソルを当てると、フルカラーの画像が即座に表示されます。

画像をセピア調にするには、 filter プロパティの値として sepia() フィルター関数を指定します。 :hover および :focus の時には、 filter: none を設定することでィルターが除去されます。

html
<img tabindex="0" alt="Four trans-people, circa 1912" src="activists.jpg" />
css
img {
  filter: sepia(100%);
}
img:hover,
img:focus {
  filter: none;
}

キーボードユーザーがタブ順序を変更せずにフォーカスできるように、 <img> 要素では tabindex0 に設定します。なぜなら、 <img> は操作可能な要素ではないからです。

他の要素へのフィルター効果の適用

一般的に画像に適用される filter および backdrop-filter プロパティは、あらゆる要素や擬似要素に適用することができます。

この例では、 drop-shadow() フィルターを使用して、 3px のぼかしと 0 のオフセットで光彩効果を追加しています。

css
h1 {
  color: midnightblue;
  filter: drop-shadow(0 0 3px magenta);
}

複数のフィルターの適用

セピア調 filter の例では、フィルター関数を 1 つしか指定していませんが、複数のフィルターを設定することができます。 filter および backdrop-filter プロパティには、空白で区切られたフィルターのリストを受け入れることができ、宣言された順番に適用されます。

この例では、 hue-rotate()blur() の 2 つのフィルターを、 backdrop-filter プロパティを介して適用しています。背景(<p> 要素の背後の領域)には、色の変化とぼかしが適用されています。

css
.container {
  background: url(image.jpg) no-repeat left / contain goldenrod;
}
p {
  backdrop-filter: hue-rotate(240deg) blur(5px);
  background-color: rgb(255 255 255 / 10%);
  text-shadow: 2px 2px black;
}

反復フィルターの適用

フィルターは順番に適用されるため、フィルター関数を複数回使用することができます。この例では、 drop-shadow() フィルターが 4 回使用されており、その時点ごとに異なる <shadow> 値が指定されています。

html
<img src="mandala.svg" alt="Colorful mandala" role="img" />
<img src="mandala.svg" alt="Plain mandala" role="img" />
css
img {
  filter: drop-shadow(2px 2px 0 hsl(300deg 100% 50%))
    drop-shadow(-2px -2px 0 hsl(210deg 100% 50%))
    drop-shadow(2px 2px 0 hsl(120deg 100% 50%))
    drop-shadow(-2px -2px 0 hsl(30deg 100% 50%));
}
img + img {
  filter: none;
}

最初のマンダラの例では、 4 つのドロップシャドウが線描の SVG に適用されています。同じ SVG で、フィルターが filter: none で除去されたものが、比較用に含まれます。

フィルター関数の順の指定

フィルター効果を作成する際、 filter または backdrop-filter プロパティには、フィルターの別個のリストが指定されます。これらのフィルター効果は、現れる順番に適用されます。

この例では、レベル 1 見出しに magenta のドロップシャドウと 180deg 色相回転が適用されています。例えば、これらのフィルターが異なる順序で適用された場合の効果を示します。

css
h1 {
  color: midnightblue;
}
#hueFirst {
  filter: hue-rotate(180deg) drop-shadow(3px 3px magenta);
}
#shadowFirst {
  filter: drop-shadow(3px 3px magenta) hue-rotate(180deg);
}

同じフィルターが両方のテキスト行に適用されますが、順序は異なります。最初の行では、影が適用される前にテキストの色相が変更されるため、影は magenta になります。 2 つ目の行では、濃い青色のテキストにドロップシャドウが追加され、その後、テキストと影の色相が変更されます。

3 行目にはフィルター効果を適用せず、比較用に元の効果を表示させています。そのため、3行目は midnightblue または #191970 のままです。 hue-rotate(180deg) フィルターは、最初の 2 行のテキストを #252500 に変更します。

メモ: 16 進数表記の RGB 色 #191970hsl(240deg 63.5% 26.9%) と等しく、一方、#252500hsl(60deg 100% 7.3%) です。色の回転は sRGB 色空間で行われるため、彩度が同じ値を示さない場合でも、色相は予想通りに変化します。

SVG フィルターの使用

10 種類の定義済み <filter-function> に加えて、 CSS フィルター効果は url() に対応しており、引数には SVG フィルターを指定します。この引数は、内部または外部の SVG ファイルに埋め込むことができます。

単一の SVG を使用して、それぞれに id を持つ複数のフィルターを定義することができます。

html
<svg role="none">
  <defs>
    <filter id="blur1">
      <feGaussianBlur stdDeviation="1" edgeMode="duplicate" />
    </filter>
    <filter id="blur3">
      <feGaussianBlur stdDeviation="3" edgeMode="duplicate" />
    </filter>
    <filter id="hue-rotate90">
      <feColorMatrix type="hueRotate" values="90" />
    </filter>
  </defs>
</svg>

インラインおよび外部の SVG のどちらの url() でも、フィルターの id が参照されます。

css
filter: url(#blur3);
filter: url("https://example.com/svg/filters.svg#blur3");

画像のぼかし

blur() フィルター関数が適用された要素にガウスぼかしを適用するように、 SVG の <feGaussianBlur> フィルター要素もコンテンツをぼかすために使用することができます。

どちらの場合も、ぼかし半径の値は、 CSS では <length> として、また SVG ではピクセル数相当の <number> として指定され、ガウス関数に対する標準偏差の値を定義します。言い換えれば、画面に表示されるピクセルの内側へ溶け込むピクセル数を定義します。値が大きいほど、ぼかしが強くなります。

<filter>stdDeviation 属性は、最大 2 つの値を受け入れ、より複雑なぼかし値を作成することができます。同等のぼかしを作成するには、 stdDeviation に 1 つの値を記載します。

html
<svg role="img" aria-label="Flag">
  <filter id="blur">
    <feGaussianBlur stdDeviation="3.5" edgeMode="duplicate" />
  </filter>
  <image
    xlink:href="https://mdn.github.io/shared-assets/images/examples/progress-pride-flag.jpg"
    filter="url(#blur)" />
</svg>

SVG の url() フィルター値は、SVG の <image> 要素の filter 属性の値として、または CSS の filter および backdrop-filter プロパティの数値の一部として含めることができます。

css
.filter {
  filter: blur(3.5px);
}
.svgFilter {
  filter: url(#blur);
}

関連情報