今回は簡単に幾何学模様のパーティクルアニメーションが実装できるjsプラグインparticles.jsをご紹介します。
公式サイトはこちら↓
https://vincentgarreau.com/particles.js/
実際のデモ
こんな風に配置できます。
後述しますが、粒子の形状は画像のようにカスタマイズが豊富にできますよ~
早速実装していきましょう
JSファイルの設置
実装の際はparticles.js(もしくはparticles.min.js)とオプションを書くためのjs(今回の場合app.js)が必要です。
①公式サイトhttps://vincentgarreau.com/particles.js/にアクセスして、真ん中にでてくるDownloadボタンを押す
②particles.js-master.zipをデスクトップにおとしてきて、ファイルを右クリック→解凍する。
③解凍したparticles.js-master.zipファイルの中のparticles.jsと、demoの中のjsの中のapp.jsを自分のhtmlのjsフォルダーにコピーして設置します。
ファイルの場所に合わせてパスは変更すること。
HTML全体は下記のようになります。
HTML
<!DOCTYPE html>
<html lang="ja">
<head>
~省略~
</head>
<body>
<!-- Header -->
<header>
~省略~
<!--particles-->
<script src="js/particles/particles.js"></script>
<script src="js/particles/app.js"/></script>
<!--/particles-->
</header>
<!-- /Header -->
<!-- Main -->
<main>
<!-- パーティクルを動かすエリア -->
<div class="wrap">
<div id="particles-js"></div>
<p>ダミーテキストダミーテキストダミーテキスト<br>
ダミーテキストダミーテキストダミーテキスト</p>
</div>
<!-- パーティクルを動かすエリアここまで -->
<div>
<p>下のコンテンツ</p>
</div>
</main>
<!-- /Main -->
<!-- Footer -->
<footer>
~省略~
</footer>
<!-- /Footer -->
</body>
</html>
アニメーションをつけたいラッパー要素の中に空の状態でidを指定して配置します。今回の場合「particles-js」というidで配置しています。
CSS
particles-jsがうまく読み込まれると、自動的にparticles-jsのタグの中にcanvasという図の描画用のタグが吐き出されます。(デバッカーで確認できます)
背景にするならCSSファイルにて、canvasがラッパー要素の中に納まるようにpositionプロパティで下記のような感じに設定します。
*positionプロパティは、表示位置を指定するプロパティです。
/*コンテンツを囲むラッパー要素*/
.wrap{
width:100%;
height:700px;
position:relative;/*基準要素、子の基準となる*/
}
/*アニメーション描画用*/
canvas{
position:absolute;/*親のブロックを基準にして相対位置に配置する*/
/*位置指定*/
top:0;
right:0;
z-index:-1;/*重ね順を-1に ※1以上だとほかのコンテンツの上に被さってしまいます*/
}
この指定をしてあげることで.wrapに重なってくれるのでデモのようにテキストなどを上に乗せれます。
プロパティの指定
ここからはオプションの種類のお話になります。
各プロパティに説明を追加しているので、オプション用のjs(ここではapp.js)を開いて、下記をコピペしていろいろいじっていただければわかりやすいかもしれません。
詳細はさらに下の方で説明しますので是非最後までお読みください。
window.addEventListener('load', function(){
//下記particles-js↓のところはHTMLで指定したidと合わせてください
particlesJS('particles-js',{
//パーティクルの設定
"particles": {
//シェイプの数
"number": {
"value": 20,//シェイプの数
"density": {
"enable": true,//密度を変更する
"value_area": 1000//密集度
}
},
//色
"color": {
"value": ["26B7BC","008FB3","FAF44B","5B98D2","4DE2D6"]
},
//シェイプの形状
"shape": {
"type": "circle",//シェイプの形(円)
"stroke": {
"width": 0,//外線つけない
"color": "#000000"//つける場合の線色
},
//※typeがpolygon(多角形)の場合
"polygon": {
"nb_sides": 5//角の数
},
//typeがimageの場合
"image": {
"src": "img/gazou.png",//画像の指定
"width": 100,//画像の幅
"height": 100//画像の高さ
}
},
//シェイプの透明度
"opacity": {
"value": 1,//透明度(1で不透明)
"random": false,//透明度をランダムにしない
//randomがtrueの場合
"anim": {
"enable": false,//透明度のアニメーションをしない
"speed": 1,//アニメーションスピード
"opacity_min": 0.1,//透明度の最小値
"sync": false//各シェイプを同時に動かさない
}
},
//シェイプの大きさ
"size": {
"value": 80,//大きさ
"random": true,//大きさをランダムにする falseで均一
"anim": {
"enable": false,//シェイプの大きさをアニメーションしない
"speed": 10,//アニメーションのスピード
"size_min": 0.1,//サイズの最小値
"sync": false//各シェイプを同時に動かさない
}
},
//シェイプ間を結ぶ線
"line_linked": {
"enable_auto": false,//線をつけない
"distance": 0,//繋がりの数
"color": "#000",//線の色
"opacity": 1,//透明度 1で不透明
"width": 1//線の太さ
},
//シェイプの動き
"move": {
"enable": true,//動きを付ける
"speed": 2,//シェイプが動くスピード数値が大きいと早い
"direction": "none",//動きの方向(none、top、top-right、right、bottom-right、bottom、bottom-left、left、top-left)
"straight": false,//動きを動きを止めるか否か
"out_mode": "bounce",//外枠に達した際のシェイプの動き bounce→跳ね返る out→フレームアウト
/*シェイプを引き寄せる*/
"attract": {
"enable": false,//引き寄せない
"rotateX": 600,//横軸の指定
"rotateY": 1200//横軸の指定
}
}
},
//相互作用
"interactivity": {
"detect_on": "canvas",
"events": {
//カーソルを乗せた時の動き
"onhover": {
"enable": false,//無効
"mode": "repulse"//enableがtrueの場合の動き(下の★のリストの名前入れるとその動きが発動)
},
//クリックしたときの動き
"onclick": {
"enable": false,//無効
"mode": "push"//(下の★のリストの名前入れるとその動きが発動)
},
"resize":true//リサイズしたとき拡縮しない
},
//各モード設定した場合の動き
"modes": {
//★シェイプとカーソルの間に線ができる
"grab": {
"distance": 400,//カーソルからの反応距離
"line_linked": {
"opacity": 1//線の不当明度
}
},
//★シェイプが膨らむ
"bubble": {
"distance": 200,//カーソルからの反応距離
"size": 40,//膨らむ際の大きさ
"duration": 2,//持続時間
"opacity": 8,//透明度
"speed": 3//速度
},
//★シェイプに触れるとカーソルから逃げる
"repulse": {
"distance": 200//カーソルからの反応距離
},
//★シェイプを増やす
"push": {
"particles_nb": 4//数
},
//★シェイプを減らす
"remove": {
"particles_nb": 2//数
}
}
},
"retina_detect": true,//Retina Display(*高画素密度のディスプレイ)を対応する
}
);
});
2022/06/23 修正
head内で読み込みをするwindow.addEventListener('load', function(){~});を追加しました。
DOMと関連データを読み込み後にオプションjsが読み込まれるようになるため bodyの閉じタグ前に入れずに動作します。※画面リサイズ時にレイアウト崩れがあったため読み込み方を変更しました
jQueryを使用している場合は下記の記事の「はじめに」の部分をご参考ください。
---------------------------------------------------------
*enable値はtrueで有効(使用する)にする、falseで無効(使用しない)となります。
シェイプの数の部分の指定
//数
"number": {
"value": 20,//シェイプの数
"density": {
"enable": true,//密集度を変更する
"value_area": 1000//密集度
}
}
シェイプの数を指定します。
valueで数を指定し、densityのenableがfalse(無効)の場合は指定した数の分だけ生成されます。
trueの場合は密集度を変更でき、value_areaの数値が大きければ余白が大きく取れ、小さいほど余白がなくなるようです。
色の部分の指定
//シェイプの色
"color": {
"value": ["26B7BC","008FB3","FAF44B","5B98D2","4DE2D6"]
}
色を指定します。複数の色を生成したい場合は上記のようにカラーをvalueに配列で指定できます。(カンマ区切り)
シェイプの形状の指定
//シェイプの形状
"shape": {
"type": "circle",//シェイプの形(円)
"stroke": {
"width": 0,//外線つけない
"color": "#000000"//つける場合の線色
},
//※typeがpolygon(多角形)の場合
"polygon": {
"nb_sides": 5//角の数
},
//typeがimageの場合
"image": {
"src": "img/gazou.png",//画像の指定
"width": 100,//画像の幅
"height": 100//画像の高さ
}
}
typeでシェイプの形状を指定できます。
設定できるtypeの種類は以下の通り
- circle
- 円
- edge
- 四角形
- triangle
- 三角形
- polygon
- 多角形
- star
- 星
- image
- 画像指定
typeでpolygonを選んだ場合、角の数を指定できます。
//※typeがpolygon(多角形)の場合
"polygon": {
"nb_sides": 5//角の数
}
typeでimageを選んだ場合、角の数を指定できます。
//typeがimageの場合
"image": {
"src": "img/gazou.png",//画像の指定
"width": 100,//画像の幅
"height": 100//画像の高さ
}
シェイプの透明度の指定
//シェイプの透明度
"opacity": {
"value": 1,//透明度(1で不透明)
"random": false,//透明度をランダムにしない
//randomがtrueの場合
"anim": {
"enable": false,//透明度のアニメーションをしない
"speed": 1,//アニメーションスピード
"opacity_min": 0.1,//透明度の最小値
"sync": false//各シェイプを同時に動かさない
}
}
valueで透明度を指定できます。0.1~1の間で指定し、1で不透明。
randomがtrueの場合、各シェイプの透明度がランダムになります
また、アニメーションが指定できるようになり、enableをtrueにすると透明度が移り変わるアニメーションがつきます。
speedの値が高いほど早く動きます。
opacity_minで透明度の最小値を設定可能
syncがtrueの場合、アニメーションが同時に動作します。falseでバラバラに動作
シェイプの大きさの指定
//シェイプの大きさ
"size": {
"value": 80,//大きさ
"random": true,//大きさをランダムにする falseで均一
"anim": {
"enable": false,//シェイプの大きさをアニメーションしない
"speed": 10,//アニメーションのスピード
"size_min": 0.1,//サイズの最小値
"sync": false//各シェイプを同時に動かさない
}
}
valueで大きさを指定できます。
randomがtrueの場合、各シェイプの大きさがランダムになります。falseで均一に設定されます。
ランダムの場合animでアニメーションが指定ができます。
enableがtrueの場合、シェイプの大きさが変化するアニメーションがつきます
speedの値が高いほど早く動きます。
syncがtrueの場合、アニメーションが同時に動作します。falseでバラバラに動作
シェイプ間を結ぶ線の指定
//シェイプ間を結ぶ線
"line_linked": {
"enable_auto": false,//線をつけない
"distance":0,//繋がりの数
"color": "#000",//線の色
"opacity": 1,//透明度 1で不透明
"width": 1//線の太さ
}
enable_autoで線の表示の有無を設定できます。
distanceでは数値が高いほどシェイプ間を結ぶ線が増えます。
colorでは、線の色が指定できます。
opacityでは、線の透明度を指定できます。
widthでは、線の太さを指定できます。
シェイプの動きの指定
//シェイプの動き
"move": {
"enable": true,//動きを付ける
"speed": 2,//シェイプが動くスピード数値が大きいと早い
"direction": "none",//動きの方向(none、top、top-right、right、bottom-right、bottom、bottom-left、left、top-left)
"straight": false,//動きを止めるか否か
"out_mode": "bounce"//外枠に達した際のシェイプの動き bounce→跳ね返る out→フレームアウト
/*シェイプを引き寄せる*/
"attract": {
"enable": false,//引き寄せない
"rotateX": 600,//横軸の指定
"rotateY": 1200//縦軸の指定
}
enableで動きの設定を付けるか否かの指定ができます。
speedでシェイプが動くスピードを指定できます。数値が大きいほど早くなります。
directionでは動きの方向を指定できます。
directionで指定できるプロパティの種類は下記のようになります
- none
- 特に方向を決めない
- top
- 上昇
- top-right
- 右に上昇
- right
- 右へ
- bottom-right
- 右へ降下
- bottom
- 降下
- bottom-left
- 左へ降下
- left
- 左へ
- top-left
- 左へ上昇
attractはenableがtrueの場合、シェイプを引き寄せます?検証の必要あり
rotateXで横軸、rotateYで縦軸を指定します。
デモプレイでみてもピンとこなかったので数が多くない場合は必要がないかもしれません
straightはtrueでシェイプの動きがとまります。
*enable:falseとの違いは、後述のホバー、クリックイベント(onhover,onclick)の動作までは止まらないという点です。
enable:falseではイベントの動作も効きません。
out_modeでは、シェイプが外枠に達した際の動作が指定できます。
- bounce
- 外枠に達した際跳ね返ります
- out
- 外枠に達した際、フレームアウトします
イベントの指定
ユーザーがカーソルで操作を行う際に発生させるイベントを指定できます。
"events": {
//カーソルを乗せた時の動き
"onhover": {
"enable": false,//無効
"mode": "repulse"//enableがtrueの場合の動き(下の★のリストの名前入れるとその動きが発動)
},
//クリックしたときの動き
"onclick": {
"enable": false,//無効
"mode": "push"//(下の★のリストの名前入れるとその動きが発動)
}
"resize":true//リサイズしたとき拡縮しない
}
}
onhoverは、マウス乗せた時の動きを指定します。
onclickは、クリックしたときの動きを指定します。
resizeは画面に合わせて拡縮するか、しないかを指定します。
falseで拡縮、trueで拡縮されずはみ出したアイテムははじかれます
enableでイベントの有効、無効を指定できます。
enableがtrueの場合、mode(発生する動き)を下記の中から指定、実装が可能です。
//各モード設定した場合の動き
"modes": {
//★シェイプとカーソルの間に線ができる
"grab": {
"distance": 400,//カーソルからの反応距離
"line_linked": {
"opacity": 1//線の不当明度
}
},
//★シェイプが膨らむ
"bubble": {
"distance": 200,//カーソルからの反応距離
"size": 40,//膨らむ際の大きさ
"duration": 2,//持続時間
"opacity": 8,//透明度
"speed": 3//速度
},
//★シェイプに触れるとカーソルから逃げる
"repulse": {
"distance": 200//カーソルからの反応距離
},
//★シェイプを増やす
"push": {
"particles_nb": 4//数
},
//★シェイプを減らす
"remove": {
"particles_nb": 2//数
}
}
高画素密度のディスプレイ対応
"retina_detect": true,//Retina Display(*高画素密度のディスプレイ)を対応する
trueで高解像度、ハイコントラストなディスプレイに対応します。
私もまだ全部の動作の理解まではいっていないのですが、試してみた限りの説明を加えてみました。
公式サイトでは実際にオプションがいろいろいじれるので是非そちらで一度お試しください~