ボタン一つで感動を！簡単紙吹雪アニメーションの作り方🎉


本記事では、ボタンクリックなどのアクションをきっかけに、画面上に紙吹雪を降らせる方法について紹介します。

今個人的に作っているシステムで、ボタンを押したときに何か動きをつけたいと考えたのがきっかけで、どうやったら実現ができるのかをいろいろ調べてみました。

CSSを使ってイチから作る方法もある様ですが、本記事ではメンテナンス性についても考慮し、canvas confettiというライブラリを利用することにしました。

https://github.com/catdad/canvas-confetti


本記事で紹介している紙吹雪の実際の動きは、以下のURLから確認することができます。ソースコードもgithubで公開していますので、ご確認ください


実際の画面
https://yo-nagase.github.io/react-conffeti-public/

ソースコード（Github）
https://github.com/yo-nagase/react-conffeti-public


## 小さめの紙吹雪
まずはボタンを押したときのアクションとしていくつか作ってみました。

### ノーマル

![normal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/1e6dade6-f1a5-8658-7b8e-061fef6c64bf.gif)

### 控えめに発射

![aaaa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/580c51fb-e696-033a-60a9-3c08c80a5504.gif)

### 強めに発射
![around.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/a64a8e12-66cd-51f9-d598-eeca42384a7e.gif)

### ゆっくり落ちる
![slow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/1b123b43-fd7f-7c30-f3ba-31b1b9293d51.gif)


## 季節のイベントに合わせた紙吹雪
次に、イベントの雰囲気に合わせて色を変化させた紙吹雪を作ってみました。

### クリスマス
![christmas.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/246d10ba-1d6d-fe8d-7982-ced8b041867e.gif)

### ハロウィン
![halloween.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/bbf54768-4f81-b1b8-2027-bb175e7cce58.gif)



## 処理イベントに合わせた紙吹雪
こちらはアプリ内で発生したイベントに合わせた紙吹雪です。

### エラー発生！

エラーが発生してしまった時などは、紙吹雪の色を赤色にして、危機感を煽ります。
発射速度も早めにしてみました。

![batcherror.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/c994f378-6062-f67d-18fc-8c7a85353d47.gif)

### 月次
月次の入力作業が問題なく終わったときなどをイメージして、少し派手目な紙吹雪を出してみました。

![monthlycomplete.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/c4bf3d92-477c-5a7a-bb20-e5ad95ee7b4a.gif)

### 年次
年次の作業終了時は、ゴージャスな黄金色の紙吹雪を時間差で複数回出してみました。
![yearlycomplete.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/6f9ef96b-71fb-84d4-c7b9-761b5edac1d0.gif)

### Gameでフィニッシュ！

何かゲームなどを完遂した時の効果をイメージしてみました。
![iine.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/7bba6a96-0d0d-1176-6a56-51768b07bbba.gif)


### いいね！
Facebookのいいねボタンが押された時をイメージして作ってみました。

![good.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/eb74e08c-463d-afea-566b-fa3ff21a2b1f.gif)


## ソースコード

紙吹雪を出すためのソースコードはこんな感じです。
ここではライブラリで指定できるパラメータを一通り指定する様にしています。
confetti関数を呼び出した時点で処理が動く様になっているため、ボタンクリック時に表示するにはonClick関数の中などで呼び出す必要があります。


```javascript:confetti.ts:
import confetti from 'canvas-confetti'

  confetti({
            // パーティクルの数（デフォルト50)
            particleCount: 100,
            // 発射角度(デフォルト90度)
            angle: 90,
            // 発射範囲(デフォルト45度)
            spread: 90,
            // 失速具合 デフォルト0.9
            // decay: 0.8,
            //重力 (0-1)
            gravity: 0.2,
            // default:0 数値を上げると横に流れる
            drift: 0,
            // confettiが動く長さ (default: 200)
            ticks: 200,
            origin: {
                x: 300,
                y: 400
            },
            // 紙吹雪の色を指定。配列でいくつも指定できる
            colors: ['#165B33', '#BB2528', '#146B3A', '#EA4630'],
            // 紙吹雪の形を指定
            shapes: ['square', triangle],
            // 紙吹雪のサイズを指定
            scalar: 0.8,
            // z-indexを指定(default:100)
            zIndex: 100
        });
```



## まとめ

最近MediumやFacebookでも、ボタンを押したらちょっとしたアニメーションがついていて気になっていたのですが、ライブラリを使うと、かなり簡単にいろんなバリエーションの紙吹雪を出すことができることがわかりました。

独自のCSSなどを作ることでもっといろんなバリエーションを作ることができるとは思いますが、お手軽さを考えるとこのやり方が良いのではないかと思います。

いずれの設定もパラメータを変えるだけで実現ができますので、ぜひ一度やってみてください。

うまく使うことでユーザー体験を向上させる一助となり得るかとは思いますが、この処理は特に紙吹雪の数を増やすと意外と処理負荷が高いので、やり過ぎに注意しましょう🚨