1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

svelteでparticles.jsを動かす

Last updated at Posted at 2020-12-12

svelteparticle.jsを使いたかったのですが、軽い気持ちでやろうとしたらライブラリも情報も見つからなかったので備忘録として。

できあがるとこんな感じに表示されます。
sample.png

なお、動作環境や設定の前提として、svelteは、公式で紹介されている方法でインストールしたそのままを使っているものとします。

sapperはよくわかりません。

手順

1、ライブラリをインストール

npm install particles.js

2、rollup.config.js でoutputに strict: false を設定する

export default {
  ...
  output: {
    ...
    strict: false,  
  },
  ...
}

rollupを動かしっぱなしでやっている場合は、一度止めて再実行の必要があります。(多分)

これをやらなかった場合、あとでUncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to themというエラーにひっかかることになります。

以下ページに詳しい情報が載っています。
https://github.com/VincentGarreau/particles.js/issues/123

3、実行用コンポーネントを作成

<script>
  import { onMount } from "svelte";
  import "particles.js";

  const config = {
    particles: {
      number: {
        value: 80,
        density: {
          enable: true,
          value_area: 800,
        },
      },
      color: {
        value: "#ffffff",
      },
      shape: {
        type: "circle",
        stroke: {
          width: 0,
          color: "#000000",
        },
        polygon: {
          nb_sides: 5,
        },
        image: {
          src: "img/github.svg",
          width: 100,
          height: 100,
        },
      },
      opacity: {
        value: 0.5,
        random: false,
        anim: {
          enable: false,
          speed: 1,
          opacity_min: 0.1,
          sync: false,
        },
      },
      size: {
        value: 10,
        random: true,
        anim: {
          enable: false,
          speed: 80,
          size_min: 0.1,
          sync: false,
        },
      },
      line_linked: {
        enable: true,
        distance: 300,
        color: "#ffffff",
        opacity: 0.4,
        width: 2,
      },
      move: {
        enable: true,
        speed: 12,
        direction: "none",
        random: false,
        straight: false,
        out_mode: "out",
        bounce: false,
        attract: {
          enable: false,
          rotateX: 600,
          rotateY: 1200,
        },
      },
    },
    interactivity: {
      detect_on: "canvas",
      events: {
        onhover: {
          enable: false,
          mode: "repulse",
        },
        onclick: {
          enable: true,
          mode: "push",
        },
        resize: true,
      },
      modes: {
        grab: {
          distance: 800,
          line_linked: {
            opacity: 1,
          },
        },
        bubble: {
          distance: 800,
          size: 80,
          duration: 2,
          opacity: 0.8,
          speed: 3,
        },
        repulse: {
          distance: 400,
          duration: 0.4,
        },
        push: {
          particles_nb: 4,
        },
        remove: {
          particles_nb: 2,
        },
      },
    },
    retina_detect: true,
  };

  onMount(() => {
    particlesJS("particles-js", config);
  });
</script>

<style>
  #particles-js {
    background: black;
  }
</style>

<div id="particles-js" />

ちなみにvue-particlesjsのコードを参考にさせていただきましたm(_ _)m

完成

以上の設定を終えたら、3で作成したコンポーネントを適当に読み込めば動くはずです。

ハマりどころ

動いてみれば簡単な話だったのですが、いくつかハマりどころがあったので書き残しておきます。

1、インストールするライブラリ間違えた

出だしにして最大のハマりどころだったのですが、npm上に particles.js とは別に particlejs というライブラリがあり、当初よく確認せずにそちらをインストールしてしまって、公式のサンプルコードがまったく動かず(あたりまえ)、相当な時間を溶かす羽目になりました。
なんとなくそれっぽい名前で〜みたいな無駄なトライしないで、ちゃんと公式のドキュメントを読みながらやりましょう。

2、particlesJS.load はjsonの読み込みにしか対応していない

設定をsvelteのコード内で変えたかったので最終的に上記のようにparticlesJSから実行する方法をとったのですが、公式のREADMEやサンプルコードだとparticlesJS.loadというのがよく使われています。
particlesJSだと生成するパーティクルの設定をそのまま渡せますが、particlesJS.loadは設定の記述されたjsonファイルを読み込んで実行するための関数なので、設定をそのまま渡そうとしても絶対動きません。
これも「なんとなくこれもいけるのでは」と無駄なトライをして時間を無駄にしたやつです。
最終的にはコードを読んで、これは絶対無理なやつ、と納得しました。

3、 strict: false にする必要がある

手順の2ですでに説明済みですが、エラーが出たときには原因がわからなくてしばらくあちこちいじくりまわしました。
なおエラー文言で検索すると一番上に上記でリンクを貼った解決方法が書かれたページが出てきます。(泣ける)

4、表示エリアの背景を黒にしておく

黒でなくてもいいのですが…

さて、エラーはすべて解消した…のに、なぜか表示されません。
色々調べた結果判明したのは、描画されているオブジェクトがすべて白かったために白背景だと見えなかったということでした。背景を黒くしたら見えました^^
※なお、パーティクルの設定は公式のREADMEに書かれていたものを使っています。

以上、お役に立ちましたら幸いです。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?