radial-gradientでスポットライト風の背景くり抜き（Safari対応）

## 作ったもの
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExBoaVe" data-pen-title="radial-gradientで背景くり抜いてさらに後ろを見せる" data-user="IKEMAKI" 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/IKEMAKI/pen/ExBoaVe">
  radial-gradientで背景くり抜いてさらに後ろを見せる</a> by MAKI I (<a href="https://codepen.io/IKEMAKI">@IKEMAKI</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### スポットライトにするとたのしい
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="JjQMoyV" data-pen-title="Untitled" data-user="IKEMAKI" 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/IKEMAKI/pen/JjQMoyV">
  Untitled</a> by MAKI I (<a href="https://codepen.io/IKEMAKI">@IKEMAKI</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 経緯
背景色を丸くくり抜いて、そのさらに後ろにある要素を見せるデザインがありました。
（カットアウトというのでしょうか）

CSSの進化によって、clip-pathやmaskでいろいろなくり抜きができるようになった昨今。

しかしベタ塗りを透明の丸でくり抜くのが意外とむずくてハマってしまいました。

- clip-path
任意の形にくり抜けるが、透明にくり抜くのができなかった

- mask
任意の形やSVGを使ってくり抜けるが、さらに後ろの要素を見せるとき、親子関係でないといけない
（全然関係ない位置にある要素同士ではうまくいかなかった）

↑これらでもやりようによってはできるかもしれませんが、私の場合はうまくいきませんでした……。

そこで今回使ったのがradial-gradientです。

## radial-gradient()
[radial-gradient() - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/gradient/radial-gradient)

radial-gradientは円形のグラデーションを描く用の関数です。

```css
background-image:
    radial-gradient(
        circle 180px at 50% 230px,
        transparent 180px,
        rgba(74, 61, 52,.5),
        rgba(74, 61, 52,.5)
    );
```

`circle 180px at 50% 230px,`
ここではグラデーションの図形と大きさ、位置を指定しています。
180pxの円を左右中央・上から230pxに配置 という意味です。
（at centerとかもいけます）

次は色の変化を指定していきます。
`transparent 180px,`
ここがくり抜き部分です。透明エリア180px = 円の大きさ とすることでキレイな丸にくり抜けます。 

`rgba(74, 61, 52,.5)`
そして最後にベタ塗りエリアの色を指定します。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="ExBoaVe" data-pen-title="radial-gradient 背景くり抜き" data-user="IKEMAKI" 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/IKEMAKI/pen/ExBoaVe">
  radial-gradient 背景くり抜き</a> by MAKI I (<a href="https://codepen.io/IKEMAKI">@IKEMAKI</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### iOS Safari対応
radial-gradientの例を見つつ、最初は以下のように書いていました。

```css
background-image:
    radial-gradient(
        circle 180px at 50% 230px,
        transparent 180px,
        rgba(74, 61, 52,.5) 0
    );
```

完成形と異なるのは `rgba(74, 61, 52,.5) 0` の箇所です。
これでChromeは問題なかったのですが、Safariで見ると背景色が黒になってしまいました。
↓こんな感じ

![2024-08-15_11-20-45_0010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189779/0a1192bd-47f5-8abd-87a9-83bc0399da84.png)

いろいろといじくり回してみても一向に色が変わらず困ったのですが、先ほど書いたコードのようにベタ塗りの色を二回指定すれば反映できました。
（おそらく省略して書いたのがダメだったのかと思われます）

`rgba(74, 61, 52,.5) 0`  
-> `rgba(74, 61, 52,.5), rgba(74, 61, 52,.5)`

### ぼかしでそれっぽく
circleの大きさと最初のグラデーションの大きさを変えると、ぼかしでよりスポットライトっぽくなるので紹介です。

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="JjQMoyV" data-pen-title="Untitled" data-user="IKEMAKI" 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/IKEMAKI/pen/JjQMoyV">
  Untitled</a> by MAKI I (<a href="https://codepen.io/IKEMAKI">@IKEMAKI</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

circleの大きさを70px、transparentの大きさを40pxにしています。
この30pxの差でグラデーションになり、今回はtransparent(透明)と混ざることでイイカンジのぼかしになります。

## おわりに
思ったよりめちゃ苦戦してしまいました今回のくり抜き。
全体が透明で、任意の色にくり抜くのは簡単にできたのですが、そっちじゃねえのよ～～～～～と騒ぎながら作っておりました。

maskもたいへん便利なのですが、要素の重なりを特定の位置にしておかないといけない（と思う）ので、今回の要件では厳しく……。

このやり方なら、後ろの要素の位置などは関係なく出来るので、便利！なはず！！

みんなもくり抜いてみてね！

## 参考
[radial-gradient() - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/gradient/radial-gradient)
["radial-gradient()" | Can I use... Support tables for HTML5, CSS3, etc](https://caniuse.com/?search=radial-gradient())

背景パターン使わせていただきました
[【CSS】使える背景パターン、実装サンプル25選（コピペで簡単です） | 125naroom / デザインするところ（会社）です。](https://125naroom.com/web/3737)