☃冬なのに雪が降ってないサイトってダサくない？☃

ゆめみ Advent Calendar 2018 4日目の投稿です。

## 概要

[particles.js snow](https://codepen.io/n-sayenko/pen/qOXKVr)

↑を見て自分もWebサイトにこういうのを降らせたいと思いやってみた結果思ったより簡単にできたので、今回はその手順を解説したいと思います。

### 冬だからWebサイトに雪を降らせたい！！！！！！！！

[デモサイト](https://sugarshootingstar.github.io/particles-snow-test/)

![snowfall.gif](https://qiita-image-store.s3.amazonaws.com/0/264910/c084d9fd-62b8-dde9-9f49-10e97f9f41ec.gif)


## TL;DR

- particles.jsを使うとクールなグラフィックを簡単にWebサイトに導入できるよ
- 作ってくれた先人は偉大だよ
- エモい

## 📁Nuxtのプロジェクトを作成

`create-nuxt-app`を使います。
[nuxt/create-nuxt-app: Create Nuxt.js App in seconds.](https://github.com/nuxt/create-nuxt-app)

インストールしていない人は

```
npm install -g create-nuxt-app
```
でインストールすることで使用可能になります。

またはインストールしなくても`npx create-nuxt-app フォルダ名`で実行できます。

```:プロジェクトの作成
create-nuxt-app フォルダ名
```

対話式で色々聞かれるので、好みの設定を適用します。
とりあえずこんな感じで設定しました。

```zsh:設定例
➜ create-nuxt-app particles-test
> Generating Nuxt.js project in パス/particles-test
? Project name particles-test
? Project description My dandy Nuxt.js project
? Use a custom server framework express
? Use a custom UI framework none
? Choose rendering mode Single Page App
? Use axios module no
? Use eslint yes
? Use prettier yes
? Author name SugarShootingStar
? Choose a package manager yarn
Initialized empty Git repository in パス/particles-test/.git/
yarn install v1.12.3

~インストール時の警告などが表示される~
```

```:終了時
✨  Done in 54.15s.

  To get started:

    cd particles-test
    yarn run dev

  To build & start for production:

    cd particles-test
    yarn run build
    yarn start

```

プロジェクトが作成できました！👊

### 📦できたフォルダの中から今回使うものの紹介

今回は

```
// 容量が軽いものを置く場所 jsや容量が軽い画像など。
assets/
// ページで使用するコンポーネント(共通部品)
components/
// nuxtによって公開されるページ ディレクトリ構造がそのまま公開されるページ構造になる
pages/
// 新しくインストールしたライブラリなどの設定に使用
plugins/
// 素材の置き場所、容量が重いもの　画像など。
static/
// ビルド設定、nuxtまわりのほぼ全ての設定を書く。
nuxt.config.js

```
配下を主に編集します。


## ⬇️particles.jsをインストール

こちらのライブラリを使用します。npm、またはyarnからインストールしましょう。
[particles.js - A lightweight JavaScript library for creating particles](https://vincentgarreau.com/particles.js/)

```
yarn add particles.js
```

## 📜nuxtでparticles.jsを適用する設定を行う

### 📃pluginsフォルダ配下に設定内容のjsを作成

importすることによって、windowオブジェクト内にparticlesJSメソッドが用意されます。

```javascript:plugins/particles.js
import particlesJS from 'particles.js'
```

### 🗒nuxt.config.jsに読み込む設定を書く

nuxtの設定ファイルにpluginsという項目があるので、そちらに先程書いたjsのパスを記述します。

これでnuxt全体でparticles.jsが使用できるようになりました。

```javascript:nuxt.config.js
  plugins: [
    '~plugins/particles.js'
  ],
```

## ☃️雪の画像をstatic配下に置く

![snow.png](https://qiita-image-store.s3.amazonaws.com/0/264910/62fd1e46-3693-09fd-45bf-907605870b0b.png)

初期のstaticフォルダは配下にREADME.mdとfavicon.icoしかないので、`img`フォルダを作成します。`static/img`フォルダ直下に置くのもアレなので`particles`フォルダをimgフォルダに作成しましょう。

そして`static/img/particles`配下に雪の画像を置きます。

名前は何でもいいですが、`snow.png`とかでいいと思います。

## 🍎assets配下に設定を書いたjsを置く

vueファイル内に生書きしてもいいのですが、めちゃくちゃ長いしせっかくなので別ファイルに分けてそこから参照しましょう。

先程のstaticの時と同じように`assets/js/particles`までフォルダを作成しその配下にファイルを置きます。

ソースコードはこちらです。data配下にparticles.jsで使用する設定が記述してあります。

ここの設定に関しての値は

[ライブラリ公式サイト](https://vincentgarreau.com/particles.js/)の右上を弄るとだいたいわかります。

[公式ドキュメント](https://github.com/VincentGarreau/particles.js/#options)

今回はすでにあるものを使用するのでほぼコピペです。

```javascript:assets/js/particles/snow.js
export default {
  data: {
    particles: {
      number: {
        value: 400,
        density: {
          enable: true,
          value_area: 800
        }
      },
      color: {
        value: '#ffffff'
      },
      shape: {
        type: 'image',
        stroke: {
          width: 3,
          color: '#fff'
        },
        polygon: {
          nb_sides: 5
        },
        image: {
          src: '/img/particles/snow.png',
          width: 100,
          height: 100
        }
      },
      opacity: {
        value: 0.7,
        random: false,
        anim: {
          enable: false,
          speed: 1,
          opacity_min: 0.1,
          sync: false
        }
      },
      size: {
        value: 5,
        random: true,
        anim: {
          enable: false,
          speed: 20,
          size_min: 0.1,
          sync: false
        }
      },
      line_linked: {
        enable: false,
        distance: 50,
        color: '#ffffff',
        opacity: 0.6,
        width: 1
      },
      move: {
        enable: true,
        speed: 5,
        direction: 'bottom',
        random: true,
        straight: false,
        out_mode: 'out',
        bounce: false,
        attract: {
          enable: true,
          rotateX: 300,
          rotateY: 1200
        }
      }
    },
    interactivity: {
      detect_on: 'canvas',
      modes: {
        grab: {
          distance: 150,
          line_linked: {
            opacity: 1
          }
        },
        bubble: {
          distance: 200,
          size: 40,
          duration: 2,
          opacity: 8,
          speed: 3
        },
        repulse: {
          distance: 200,
          duration: 0.2
        },
        push: {
          particles_nb: 4
        },
        remove: {
          particles_nb: 2
        }
      }
    },
    retina_detect: true
  }
}

```

## ❄️雪を降らせるコンポーネントを作成

前準備が長かったですが、コンポーネントを作成します。
今回は雪を降らせるのでSnowFallという名前で作成しましょう。
componentsフォルダにSnowFallフォルダを掘って、その配下にindex.vueファイルを作成します。

### ❄️template内に雪を降らせる要素を作る

particles.jsは要素がひとつあれば動くので、とりあえずdivを一つ作っておきます。

また、雪を降らせるときにidを使用するので設定しておきます。

```javascript
<template>
  <div id="snowfall"/>
</template>
```

### 🔧particles.jsで使用する設定ファイルをimport

先程用意したjsファイルを読み込み、このコンポーネントで使えるようにします。

```javascript
// particles.jsで降らせる雪の設定を読み込み
import snow from '~/assets/js/particles/snow.js'
``` 

### ⚒画面が表示された時にparticles.jsが動くように設定

particles.jsを使用するためには、nuxtの[mounted](https://ja.nuxtjs.org/faq/async-data-components/)に処理を書く必要があります。

mountedは画面が表示されたタイミングでjsが動かせるやつと覚えておけば大丈夫です。

particles.jsは`window.particlesJS('tagname', 'setting')`で設定を読み込ませて初期化してあげると動くようになります。

第一引数に雪を振らせたい要素のid、第二引数にparticles.jsで使用する設定Objectを指定します。


```javascript
export default {
  mounted() {
    // 画面が表示された時にparticles.jsを動かす
    window.particlesJS('snowfall', snow.data)
  }
}
```

### 🔮ソース

以上の内容を踏まえたソースがこちらになります。cssはコピペで大丈夫です。


```javascript:components/SnowFall/index.vue
<template>
  <div id="snowfall"/>
</template>

<script>
// particles.jsで降らせる雪の設定を読み込み
import snow from '~/assets/js/particles/snow.js'

export default {
  mounted() {
    // 画面が表示された時にparticles.jsを動かす
    window.particlesJS('snowfall', snow.data)
  }
}
</script>

<style>
#snowfall {
  position: absolute;
  width: 100%;
  height: 100%;
}
</style>

```


## ✅pages/index.vueにSnowFallコンポーネントを入れる

`localhost:3000`で表示される初期表示ページに雪を降らせるコンポーネントを配置しましょう。

ちなみにこの状態の画面はこちらです。

雪を目立たせるため、ソースには`.container`要素に`background:black`だけ設定しています。

![スクリーンショット 2018-12-03 18.25.55.png](https://qiita-image-store.s3.amazonaws.com/0/264910/187124c9-151c-43a5-a31c-3fba057bfdc3.png)

### 💠コンポーネントをimportして、componentsに記述

多分デフォだとLogoの読み込みがされていると思うので、そのコードの下にSnowFallコンポーネントを読み込むコードを記述しましょう。

また、コンポーネントとして使用するにはjs内のcomponentsにimportした変数名を記述する必要があるので、Logoの後ろにSnowFallを記述しましょう。

```javascript
import Logo from '~/components/Logo.vue'
// 雪を降らせるコンポーネントの読み込み
import SnowFall from '~/components/SnowFall'

export default {
  components: {
    Logo,
    SnowFall
  }
}
</script>
```

### 🚀template内にSnowFallコンポーネントを配置

画面全体に雪を降らせたいので、section配下にSnowFallコンポーネントを配置します。
これですべての準備が整いました。

```javascript
<template>
  <section class="container">
    <!-- 雪を降らせる -->
    <SnowFall/>
    <div>
      <logo/>
      <h1 class="title">
        particles-test
      </h1>
      <h2 class="subtitle">
        My dandy Nuxt.js project
      </h2>
      <div class="links">
        <a
          href="https://nuxtjs.org/"
          target="_blank"
          class="button--green">Documentation</a>
        <a
          href="https://github.com/nuxt/nuxt.js"
          target="_blank"
          class="button--grey">GitHub</a>
      </div>
    </div>
  </section>
</template>
```


![snowfall.gif](https://qiita-image-store.s3.amazonaws.com/0/264910/c084d9fd-62b8-dde9-9f49-10e97f9f41ec.gif)


## 雪が降った！！！！！！！！！！！！！！！！！！！！

## 最高！！！！！！！！！！！！！！！！！！！！！！！！

## みんなも雪を降らそう！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！

## 備考

[creotip/vue-particles: Vue.js component for particles backgrounds ✨](https://github.com/creotip/vue-particles)

[Vue Particlesでイケてるサイトをサクっと作る - Qiita](https://qiita.com/takato0903/items/3b199b994322a8b07281)

vue-particlesというものを使うと似たことができるらしいです。

最初はこれでやろうと思っていたんですが、細かい設定などに対応していないらしく試行錯誤してもうまく行かなかったため使用しませんでした。

## particles.js以外にも色々ある降らせるやつ

## 🌸春

- [almightynay/jQuery-Sakura: Make it rain - sakura petals or anything else for that matter.](https://github.com/almightynay/jQuery-Sakura)
  -  jQuery
- [Amazing Sakura - jsdo.it - Share JavaScript, HTML5 and CSS](http://jsdo.it/lebedev/yicd)
  - ?
- [サクラマイチル（canvas）](https://codepen.io/glitchworker/pen/YwJeWj)
  - scss + js(canvas操作)
- [Sakura rain effect](https://codepen.io/andy23512/pen/JpBWaN)
  - js(canvas操作)

## 🌴夏

- [Falling Leaves](https://codepen.io/brunoimbrizi/pen/QKqpNo)
  - Three.js

## 🍁秋

- [Falling Leaves](https://codepen.io/smhigley/pen/gwYPvR)
  - css animation + js
- [Autumn Leaves](https://codepen.io/kriz/pen/NNqYaq)
  - css(Stylus) + jquery
- [Autumn falling leaves ( GSAP )](https://codepen.io/MAW/pen/KdmwMb)
  - css + js(Tween.js)

## ❄️冬

- [loktar00/JQuery-Snowfall: Makes it snow on any web page or specific element.](https://github.com/loktar00/JQuery-Snowfall)
  - jQuery
- [particles.js snow](https://codepen.io/n-sayenko/pen/qOXKVr)
  - particles.js
- [Canvas Snow Threejs - JSFiddle](http://jsfiddle.net/3drjwj2n/)
  - Three.js