mix-blend-mode を使いこなして、Webデザインの可能性を広げよう！

## はじめに
みなさんは、背景によって追従するロゴの色が反転するサイトを見かけたことはありませんか？実は、この効果は CSS の mix-blend-mode というプロパティを使うことで簡単に実装できます。
私は最近、業務で mix-blend-mode を使う機会があったので、その基礎から注意点までを備忘録としてまとめてみました。これがお役に立てれば幸いです。

## mix-blend-mode とは
MDN では下記のように説明されています。
>mix-blend-mode は CSS のプロパティで、要素の内容物と親要素の内容物や要素の背景をどのように混合するかを設定します。

引用：MDN Web Docs

https://developer.mozilla.org/ja/docs/Web/CSS/mix-blend-mode

つまり、2つの要素が重なったときに、上に重なる要素を反転させたりオーバーレイさせたりできるプロパティです。実際にデモを作りましたので、ぜひスクロールして文字の色が変化する様子を見てみてください。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="xxMBmxo" data-user="miri-inoue" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/miri-inoue/pen/xxMBmxo">
  mix-blend-mode demo</a> by Miri Inoue (<a href="https://codepen.io/miri-inoue">@miri-inoue</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### ブレンドモードとは
普段、Adobe製品のデザインツールをお使いの方なら馴染みがあるとおもいますが、ブレンドモードとは、Photoshop や Illustrator、XD 、Figma に搭載されている基本機能で、要素（レイヤー）と要素（レイヤー）を重ねた時にどのように表示するかを設定できるものです。ツールによって「描画モード」「ブレンドモード」と呼ばれることもありますが機能は同じです。

![design-tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115690/a86800f6-2f4a-3377-dca0-3ee0a771f83f.png)
### mix-blend-mode 効果一覧
初期値の `normal` を含め、合計16の値が存在します。日本語と英語の名称の違いはありますが、ほとんどのブレンドモードの効果が mix-blend-mode に対応しています。
<table>
  <caption>mix-blend-mode ブレンドモード比較表</caption>
  <thead>
    <tr>
      <th> プロパティの値 </th> <th>ブレンドモードの効果</th>
    </tr>
  </thead>
  <tr>
    <td> normal </td> <td> 通常 </td>
  </tr>
  <tr>
    <td> darken </td> <td> 比較（暗） / 暗く　　</td>
  </tr>
  <tr>
    <td> multiply </td> <td> 乗算 </td>
  </tr>
  <tr>
    <td> color-burn </td> <td> 焼き込みカラー </td>
  </tr><tr>
    <td> lighten </td> <td> 比較（明） / 明るく </td>
  </tr>
  <tr>
    <td> screen </td> <td> スクリーン </td>
  </tr><tr>
    <td> color-dodge </td> <td> 覆い焼き </td>
  </tr><tr>
    <td> overlay </td> <td> オーバーレイ </td>
  </tr>
  <tr>
    <td> soft-light </td> <td> ソフトライト </td>
  </tr>
  <tr>
    <td> hard-light </td> <td> ハードライト </td>
  </tr>
  <tr>
    <td> difference </td> <td> 差の絶対値 / 差分</td>
  </tr>
  <tr>
    <td> exclusion </td> <td> 除外 </td>
  </tr>
  <tr>
    <td> hue </td> <td> 色相 </td>
  </tr>
  <tr>
    <td> saturation </td> <td> 彩度 </td>
  </tr>
  <tr>
    <td> color </td> <td> カラー </td>
  </tr>
  <tr>
    <td> luminosity </td> <td> 輝度 </td>
  </tr>
</table>

### ブレンドモードの描画方法と主要なブレンドモードの概要
mix-blend-mode では、上の要素と下の要素をブレンドするため、各要素のRGBの数値を特定の計算方法で混ぜあわせて描画します。

Cm: `ブレンド後の結果の色`
B: `ブレンドを行う式`
Cb: `背景色`
Cs: `ソースカラー`


詳細は仕様書をご覧ください。

https://drafts.fxtf.org/compositing-1/#blending


#### normal:通常
```css:css
 mix-blend-mode: normal; 
```
通常のブレンドモードで、要素同士が単純に重なります。ブレンドは行われず、上の要素が下の要素を覆います。

##### 計算式
```math
B(Cb, Cs) = Cs
```

![normal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115690/a8e65878-6e36-6455-efc4-250f0bc8b05e.png)

#### multiply：乗算

```css:css
 mix-blend-mode: multiply; 
```
上の要素と下の要素の色を掛け合わせて合成されます。元の色よりも暗い色になります。

##### 計算式
```math
B(Cb, Cs) = Cb x Cs
```



![multiply.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115690/d11d83a1-8baf-f35a-0a21-5dfa19434c0b.png)

#### screen:スクリーン

```css:css
 mix-blend-mode: screen; 
```

上の要素と下の要素の色を反転させ、掛け合わせて合成されます。元の色よりも明るい色になり、乗算の反対の効果が得られます。
##### 計算式
```math
B(Cb, Cs) = 1 - [(1 - Cb) x (1 - Cs)] 
          = Cb + Cs -(Cb x Cs)
```

![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115690/2e26d79d-86cf-4bcf-22ce-939393834dfd.png)

#### difference:差の絶対値
```css:css
 mix-blend-mode: difference; 
```

明度の高い方から低い方を引いた値を適用します。反転したような色になります。
##### 計算式
```math
B(Cb, Cs) = | Cb - Cs |
```
![difference.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115690/36b11a8e-12b4-3b50-1908-3e4bb110a9cd.png)




#### その他の効果
各ブレンドモードはそれぞれ異なる計算方法を使用して描画されています。計算式を理解することで、要素同士がどのようにブレンドされるのか予想できるようになると、より適切なブレンドモードを選択できます。

![others.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115690/a6e10414-450c-747f-9ea5-c3adafb2b049.png)

## CSS と Photoshop で違いはあるのか？
上の3つが CSS の mix-blend-mode で描画したもの、下の3つが Photoshop のブレンドモードで描画したものです。
並べてみても差がわからないくらい、同じ表現ができることがわかりました。

![css-ps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115690/df44429c-b380-386e-1832-d98683b26220.png)

## mix-blend-mode を使用した Web サイト
さまざまな表現ができる mix-blend-mode ですが、実際どういうところで使用されているのでしょうか？ロゴやマウスストーカーといった、要素の重なりが変化するものに使用されていることが多いようですね。

### New Logo, New HANEDA.
- マウスストーカーに `mix-blend-mode: difference;`

https://www.tokyo-airport-bldg.co.jp/corporate_profile/identity/

### EYE OPENING LINER(アイオープニングライナー) | UZU BY FLOWFUSHI - ウズバイフローフシ
- header に `mix-blend-mode: difference;`

https://www.uzu.team/pages/eyeopeningliner/

### DeNA×AI｜技術と、革新と、未来と。
- header ロゴに `mix-blend-mode: difference;`

https://dena.ai/


### Service | RESCALAR | 株式会社リスカラ
- header ロゴ、FV、マウスストーカーに `mix-blend-mode: difference;`

https://rescalar.co.jp/

## ブラウザサポート状況
![caniuse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115690/fa0ac0a6-12b9-1247-34f1-059d4ac8b547.png)

引用：https://caniuse.com/?search=mix-blend-mode

2023年12月現在、 Chrome / Edge / Safari / Firefox でサポートされています。
以前からあったプロパティですが、IEがサポート外になったことでようやく一般的に使えるようになってきたのではないでしょうか。

## mix-blend-mode の注意点
一見、簡単に扱えそうなプロパティですが、使い方を知らないとうまくきかなかったり思うような挙動にならない場合があるため、ポイントを紹介します。

### スタッキングコンテキストを揃える

スタッキングコンテキストについては ICS MEDIA に詳しい記事がありましたので割愛します。

https://ics.media/entry/200609/

>An element that has blending applied, must blend with all the underlying content of the stacking context [CSS21] that that element belongs to.

引用：https://drafts.fxtf.org/compositing-1/#csscompositingrules_CSS

要素同士がブレンドされるためには、いずれの要素も同じスタッキングコンテキストに属している必要があります。mix-blend-mode が効かない場合は HTML の構造を変えてみましょう。


## mix-blend-mode が学べるサイト
全て英語になりますが、インタラクティブに学べるサイトがありましたのでご紹介します。
ページ内の Drag me をドラッグすることで、要素が重なったときにどのように表示されるのか変化を見ることができます。

https://garden.bradwoods.io/notes/css/blend-modes

## まとめ
今回は、 mix-blend-mode についてまとめてみました。
以前は IE 非対応だったため、Photoshop などのデザインツールを使わないと再現できなかった表現が、CSSのプロパティで再現できるようになりました。選択するブレンドモードによって2つの要素をなじませたり、反対に目立たせてアクセントにしたり、視認性をアップできたりと、使いこなすことでさまざまな表現が実現できます。
頻出するものではないプロパティですが、頭の片隅に置いていただけると良いかと思います。


## 参考
[CSSのブレンドモードが素敵！ mix-blend-modeを使いこなそう - ICS MEDIA](https://ics.media/entry/7258/)
[mix-blend-modeの使い方を徹底解説！重なり合う要素をオシャレに色変更！ - PENGIN BLOG](https://pengi-n.co.jp/blog/mix-blend-mode/)
[CSSで乗算がかけられる!!css3の新プロパティ「mix-blend-mode」でデザインの幅を広げよう!!](https://wk-partners.co.jp/homepage/blog/hpseisaku/htmlcss/mix-blend-mode/)
[CSSのブレンドモードを美しいデモでインタラクティブに学べる -Brad Woods’ Digital Garden | コリス](https://coliss.com/articles/build-websites/operation/css/css-blend-modes.html)