次世代Webスタイリングを追う ーbackdrop-filter

## これはなに？
Chrome Dev Summit 2019にて「 [Next-generation web styling](https://www.youtube.com/watch?v=-oyeaIirVC0) 」というセッションがあり、それを（ときどき）追いかけています。昨年のアドベントカレンダーでは、「[次世代Webスタイリングを追う ーScroll Snap, :focus-within, @media (prefers-*), :is()](https://qiita.com/yagi_suke/items/1466508d3ce586b0b981)」という記事を書きました。

本記事はその続きで、今回はCSSプロパティ「backdrop-filter」について記載します。

## CSSプロパティ: filterを振り返る
`backdrop-filter` の紹介の前に、 CSSプロパティの `filter` について振り返っていきます。

[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/filter)によるfilterの説明:
> CSS の filter プロパティは、ぼかしや色変化などのグラフィック効果を要素に適用します。フィルターは画像、背景、境界の描画を調整するためによく使われます。

まずは、よく使われるという画像要素に `filter` のグラフィック効果を適用してみました。良い感じですね。

| Original | Blur | Grayscale | Sepia |
|:-:|:-:|:-:|:-:|
| <img width="80" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191671/addb629b-18d2-cb00-b3df-5b183c016004.png"><br/>filter: none;  | <img width="80" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191671/7409cd02-72bf-81fd-5460-fca74b51f9c9.png"> <br/> filter: blur(7px); | <img width="80" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191671/0a423076-6841-c394-9534-35581b701ad1.png"> <br/> filter: grayscale(0.7); | <img width="80" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191671/b7aac31a-3491-c05e-a4f6-b41500755870.png"> <br/> filter: sepia(0.7); |

またMDNの説明によると、 `filter` は、背景にもグラフィック効果を適用することができるようなので試してみました。
画像ではなく、キャプション要素に `filter` のぼかし効果を適用しています。

<img width="250" alt="ng.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191671/e7a96c9c-513e-f93b-a193-091b3854790c.png">

```html
<style>
figure {
  position: relative;
  background-color: yellowgreen;
}
figcaption {
  position: absolute;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 8px 16px;
  color: #fff;
  background-color: rgba(0, 0, 0, 0.4);
  filter: blur(7px);
}
</style>
<figure>
  <img src="hoge.png" alt="" />
  <figcaption>これはキャプションです。</figcaption>
</figure>
```

意図した通りにはなりませんでした。
どうやら `filter` は、「背景含めて要素全体にグラフィック効果を適用する」ことはできても、「要素の背後のみにグラフィック効果を適用する」ということはできないようです。

## CSSプロパティ: backdrop-filter
そんな時に活躍するのが、 `backdrop-filter` です。
`backdrop-filter` は、`filter` のグラフィック効果を要素の背後のみに適用することができます。

さきほどのキャプションを `backdrop-filter` に書き換えてみました。

<img width="250" alt="ok.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191671/474f52a0-1417-3559-a259-117ebba79fc0.png">

```html
<style>
figure {
  position: relative;
  background-color: yellowgreen;
}
figcaption {
  position: absolute;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 8px 16px;
  color: #fff;
  background-color: rgba(0, 0, 0, 0.4);
  backdrop-filter: blur(7px);
}
</style>
<figure>
  <img src="hoge.png" alt="" />
  <figcaption>これはキャプションです。</figcaption>
</figure>
```

キャプション要素の背後のみにグラフィック効果が適用されており、意図した通りになりました。
今回はblurでしたが、`filter`と同じく多くのグラフィック効果があるので興味がある方は試してみてください。

[こちら](https://css.yagisuke0209.now.sh/styles/backdrop_filter/)に上記サンプルを置いておきます。

## ブラウザの対応状況
| CSS property: backdrop-filter |
|:-:|
| ![backdrop-filter](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191671/ba205223-db64-b281-3c3b-2f4c16d842cc.png)<br />[caniuse.com](https://caniuse.com/#feat=mdn-css_properties_backdrop-filter)  |

## 参考資料
- [backdrop-filter - CSS: Cascading Style Sheets | MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter)
- [backdrop-filter | CSS-Tricks](https://css-tricks.com/almanac/properties/b/backdrop-filter/)

## おわり
また何かできたら紹介していきたいと思います。
おわり。