particles.jsは、幾何学模様を簡単にウェブサイトの実装できるJSです。
上記リンクからJSをダウンロードすると簡単に実装できます。
今回はこのparticles.jsを複数設置する方法をご紹介します。
ダウンロードした「particles.min.js」と私のほうで用意した「test.js」を読み込みます。
<script src="js/particles.min.js"></script> <script src="js/test.js"></script> //particlesの細かい設定用
<body> <div id="particles-js"></div> //particleを表示するブロック </body>
「test.js」には下記のような記述を行います。ほぼコピペですが…。
複数設置ではなく、一つの要素に設置するのであればこれで問題ありません。
particlesJS("particles-js", {"particles":{"number":{"value":80,"density":{"enable":true,"value_area":800}},"color":{"value":"#9e9e9e"},"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":3,"random":true,"anim":{"enable":false,"speed":40,"size_min":0.1,"sync":false}},"line_linked":{"enable":true,"distance":150,"color":"#9e9e9e","opacity":0.4,"width":1},"move":{"enable":true,"speed":6,"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":true,"mode":"repulse"},"onclick":{"enable":true,"mode":"push"},"resize":true},"modes":{"grab":{"distance":400,"line_linked":{"opacity":1}},"bubble":{"distance":400,"size":40,"duration":2,"opacity":8,"speed":3},"repulse":{"distance":200,"duration":0.4},"push":{"particles_nb":4},"remove":{"particles_nb":2}}},"retina_detect":true}); var count_particles, stats, update; stats = new Stats; stats.setMode(0); stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; document.body.appendChild(stats.domElement); count_particles = document.querySelector('.js-count-particles'); update = function() { stats.begin(); stats.end(); if (window.pJSDom[0].pJS.particles && window.pJSDom[0].pJS.particles.array) { count_particles.innerText = window.pJSDom[0].pJS.particles.array.length; } requestAnimationFrame(update); }; requestAnimationFrame(update);
そう、複数設置するにあたってこれでおわりじゃない!!
これじゃ複数設置できません。
そもそもparticle自体、クラスでの指定はソース見ていただくとわかる通りできないのです。
IDしか指定は無理…
となると、私が想像してる以下のような設置は無理じゃない?ってなった。
<body> <div id="sec01"> <div id="particles-js01"></div><!-- ここで使用 --> </div> <div id="sec02"> <div id="particles-js02"></div><!-- ここで使用 --> </div> <div id="sec03"> <div id="particles-js03"></div><!-- ここで使用 --> </div> </body>
で、同じようなことしようとした人絶対おるやろ!って思ったので
複数設置を行うにあたってまずは調べました。
で、発見した記事がこちら。
https://teratail.com/questions/131949
answer部分を見てみると、『particlesJS(要素id,params)をコールすればいくつでも配置できるけど』って
かいてるけど何!?!?
なにをどうしたらいいの!?
いや、パラメーターもたせろよって言いたいことはわかるけど具体的なソースがわからん…。
で結局社内のエンジニアさんに相談して、以下のソースに書き換えた。
const params = { "particles": { "number": { "value": 80, "density": { "enable": true, "value_area": 800 } }, "color": { "value": "#9e9e9e" }, "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": 3, "random": true, "anim": { "enable": false, "speed": 40, "size_min": 0.1, "sync": false } }, "line_linked": { "enable": true, "distance": 150, "color": "#9e9e9e", "opacity": 0.4, "width": 1 }, "move": { "enable": true, "speed": 6, "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": true, "mode": "repulse" }, "onclick": { "enable": true, "mode": "push" }, "resize": true }, "modes": { "grab": { "distance": 400, "line_linked": { "opacity": 1 } }, "bubble": { "distance": 400, "size": 40, "duration": 2, "opacity": 8, "speed": 3 }, "repulse": { "distance": 200, "duration": 0.4 }, "push": { "particles_nb": 4 }, "remove": { "particles_nb": 2 } } }, "retina_detect": true } var count_particles, stats, update; stats = new Stats; stats.setMode(0); stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; document.body.appendChild(stats.domElement); count_particles = document.querySelector('.js-count-particles'); update = function() { stats.begin(); stats.end(); if (window.pJSDom[0].pJS.particles && window.pJSDom[0].pJS.particles.array) { count_particles.innerText = window.pJSDom[0].pJS.particles.array.length; } requestAnimationFrame(update); }; requestAnimationFrame(update); particlesJS("particles-js01", params); //ここでID指定 particlesJS("particles-js02", params); //ここでID指定 particlesJS("particles-js03", params); //ここでID指定
でもね
うまくいかない。
なんなら全部表示されなくなった!(なぜ!)
で、うんちゃらかんちゃらやってるとConsoleにエラーを吐いていることが発覚!
で悪さしてたのか以下の部分!!
var count_particles, stats, update; stats = new Stats; stats.setMode(0); stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; document.body.appendChild(stats.domElement); count_particles = document.querySelector('.js-count-particles'); update = function() { stats.begin(); stats.end(); if (window.pJSDom[0].pJS.particles && window.pJSDom[0].pJS.particles.array) { count_particles.innerText = window.pJSDom[0].pJS.particles.array.length; } requestAnimationFrame(update); }; requestAnimationFrame(update);
ここをコメントアウトすれば複数設置できました。
そもそもパラメーター持たさなくても、上記をコメントアウトして同じソースをコピペで書けばうまくいったと思います。
念のため、最終の解決ソースを…
const params = { "particles": { "number": { "value": 80, "density": { "enable": true, "value_area": 800 } }, "color": { "value": "#9e9e9e" }, "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": 3, "random": true, "anim": { "enable": false, "speed": 40, "size_min": 0.1, "sync": false } }, "line_linked": { "enable": true, "distance": 150, "color": "#9e9e9e", "opacity": 0.4, "width": 1 }, "move": { "enable": true, "speed": 6, "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": true, "mode": "repulse" }, "onclick": { "enable": true, "mode": "push" }, "resize": true }, "modes": { "grab": { "distance": 400, "line_linked": { "opacity": 1 } }, "bubble": { "distance": 400, "size": 40, "duration": 2, "opacity": 8, "speed": 3 }, "repulse": { "distance": 200, "duration": 0.4 }, "push": { "particles_nb": 4 }, "remove": { "particles_nb": 2 } } }, "retina_detect": true } particlesJS("particles-js01", params); //ここでID指定 particlesJS("particles-js02", params); //ここでID指定 particlesJS("particles-js03", params); //ここでID指定
同じようにハマった方がいればその人の手助けになれば幸いです!
では!