CSS ブラーってなんですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/0971c787-66c3-c558-8c27-4908456279ee.png)

---

# はじめに

最近、React に携わる機会を頂き、CSS の繊細な感じと格闘しています。
先ほど XD を確認してると、上司から「ここは半透明じゃなくて、ブラー (blur) だね」と指摘を頂いたのですが、「ブラーって何ですか？」と聞き返してしまいました。。。
自身の無知が恥ずかしいですが、ここで知識が増えたと前向きに捉えて、"blur" のメモを投稿です。

あと、LT会でも発表するネタとして、"スライドモード"での記載を試してみたいと思います。

---

# blur（ブラー）

blur は**要素をぼかす**ために使用される視覚効果です。
画像やテキストなどの要素がふんわりとしたぼやけた見た目になります。
例えば、背景をぼかして前景の要素を際立たせたり、スタイリッシュなデザインを作り出したりすることができます。

|元画像 |bler |
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/bcd51736-8cb9-0594-58c2-dfdf2f3d990f.png) |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/2469c046-a2c2-9b67-d7f0-9018028ac3ac.png) |

---

# 半透明との違い

似た感じの（私が勘違いしていた）半透明 (opacity) がありますが、比べると全然違います。

|元画像 |bler |opacity |
|---|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/c785e4a3-0eef-258b-4328-9c355fb5e69c.png) |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/4a103766-074b-32aa-39eb-4b4cdf4b4f08.png) |![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/673b1f17-acdb-0c28-e896-f990ed90838a.png) |

---

# モーダルの背景をぼかしたい

今回、ぼやかしたいのは「親画面」→「モーダル」の表示で、モーダル表示時に親画面をぼかしたかったので、モーダルから bler を利用して"ぼかし"をしていたのですが、モーダルの項目しか"ぼかし"がかからない。
親画面自身に bler を指定してあげないとダメみたいです。そのため、親コンポーネントからプロップスを渡す事が必要でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/a7712eea-36ae-2591-a8ea-8b6cfd6807eb.png)

## サンプルコード

### 親コンポーネント

```
import React, { useState } from "react";
import ChildComponent from "./ChildComponent";

const ParentComponent = () => {
  const [isStyled, setIsStyled] = useState(false);

  const toggleStyle = () => {
    setIsStyled((prev) => !prev);
  };

  return (
    <div
      style={{
        backgroundColor: isStyled ? "lightblue" : "white",
        padding: "20px",
        border: "1px solid black",
      }}
    >
      親コンポーネントのスタイル
      <ChildComponent toggleStyle={toggleStyle} />
    </div>
  );
};

export default ParentComponent;
```

### 子コンポーネント

```
import React from "react";
import GrandchildComponent from "./GrandchildComponent";

type ChildComponentProps = {
  toggleStyle: () => void;
};

const ChildComponent: React.FC<ChildComponentProps> = ({ toggleStyle }) => {
  return (
    <div>
      <GrandchildComponent toggleStyle={toggleStyle} />
    </div>
  );
};

export default ChildComponent;
```

### 孫コンポーネント

```
import React from "react";

type GrandchildComponentProps = {
  toggleStyle: () => void; // 親から渡される関数
};

const GrandchildComponent: React.FC<GrandchildComponentProps> = ({ toggleStyle }) => {
  // 既存のhandle関数
  const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
    console.log("ボタンがクリックされました"); // 既存の処理
    toggleStyle(); // 親のスタイルを切り替える
  };

  return (
    <div>
      <button onClick={handleClick}>親のスタイルを切り替える</button>
    </div>
  );
};

export default GrandchildComponent;
```

---

# おわりに

新しい事を試せた良い機会になりまた。
blur に限らず、調べてみるといろいろな事が HTML+CSS+js で、表現できますね。
次は、UI フレームワークやグラフ系も記事にまとめたいなぁと思います。

---
**参考（感謝）**
- [mdn web docs blur()](https://developer.mozilla.org/ja/docs/Web/CSS/filter-function/blur)
- [mdn web docs opacity](https://developer.mozilla.org/ja/docs/Web/CSS/opacity)
- [画像にフィルターをかける](https://catnose.me/learning/css/filter)
- [画像(img)を指定すると背景画像も同期してぼかし表示するサンプルコード](https://digipress.info/tech/synchronize-the-background-image-sample/)