便利なフロントエンド向け confetti アニメーションライブラリ
(github.com/catdad)-
インストール方法
- NPM 経由でモジュールとしてインストール可能
npm install --save canvas-confetti require('canvas-confetti')でプロジェクト内で利用可能- クライアントコンポーネントのため Node では動作しない。webpack などを使ってプロジェクトをビルドする必要がある
- CDN 経由で HTML ページに直接含めることも可能
<script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.9.2/…; - プロジェクトに含める際は releases ページの最新版を使うことを推奨
- NPM 経由でモジュールとしてインストール可能
-
アニメーション削減モード
- 一部のユーザーはモーションを好まないため、その点を考慮する必要がある
disableForReducedMotionオプションにより、気が散るアニメーションを望まないユーザーに配慮できる- デフォルトでは無効だが、今後のメジャーリリースで既定値が変更される予定
API
-
confetti([options {Object}])→Promise|null- 単一のオプションオブジェクトを引数に取る
window.Promiseが利用できる場合は Promise を返し、利用できない場合(IE など)はnullを返す- Polyfill や
confetti.Promiseを通じて Promise 実装を提供可能 - 完了前に
confettiを複数回呼び出すと同じ Promise を返す。内部的には同じ canvas 要素を再利用する - すべてのアニメーションが完了すると、各呼び出しで返された Promise が resolve される
optionsオブジェクトの主なプロパティparticleCount,angle,spread,startVelocity,decay,gravity,drift,ticks,origin,colors,shapes,scalar,zIndexなど
-
confetti.shapeFromPath({ path, matrix? })→Shape- SVG Path 文字列を使ってカスタム confetti 形状を生成
- 単色のみ対応で、Stroke は未実装
- 変換行列が必要。直接渡すか helper を使って計算可能
Path2Dをサポートするブラウザに限定されるShapeオブジェクトを返す
-
confetti.shapeFromText({ text, scalar?, color?, fontFamily? })→Shape- 絵文字 confetti をレンダリングするための機能
- 単一文字、特に絵文字の使用を推奨
- テキストはラスタライズされるため、生成後のサイズ変更には向かない
scalarでサイズ変更する場合は、ここでも同じ値を使う必要があるtext,scalar,color,fontFamilyオプション
-
confetti.create(canvas, [globalOptions])→function- カスタム canvas を使う
confetti関数のインスタンスを作成 - canvas のサイズ制限が可能
- グローバルオプション
resize: canvas の画像サイズを設定し、ウィンドウサイズ変更時にも維持するかどうかuseWorker: 可能な場合に非同期 Web Worker を使ってレンダリングするかどうかdisableForReducedMotion: アニメーション削減モードのユーザー向けに confetti を完全に無効化するかどうか
useWorker: true使用時の注意事項- canvas を直接操作してはいけない。制御権が Web Worker に移される
- カスタム canvas を使う
-
confetti.reset()- アニメーションを停止し、すべての confetti を削除
- 未解決の Promise を即座に resolve する
confetti.createで作成したインスタンスは独自のresetメソッドを持つ
使用例
-
基本的な使い方
confetti(); -
大量の confetti を使う
confetti({ particleCount: 150 }); -
大きく拡散させる
confetti({ spread: 180 }); -
ランダムな位置から少量を発射
confetti({ particleCount: 100, startVelocity: 30, spread: 360, origin: { x: Math.random(), y: Math.random() - 0.2 } }); -
30 秒間、複数方向から連続発射
var duration = 30 * 1000; var end = Date.now() + duration; (function frame() { confetti({ particleCount: 7, angle: 60, spread: 55, origin: { x: 0 } }); confetti({ particleCount: 7, angle: 120, spread: 55, origin: { x: 1 } }); if (Date.now() < end) { requestAnimationFrame(frame); } }());
GN⁺ の意見
-
canvas-confettiは、Web ページに手軽にコンフェッティ効果を適用できる軽量ライブラリのようです。NPM によるインストールと CDN 方式の両方に対応しており、開発者にとって使いやすそうです。 -
コンフェッティ効果に関するさまざまな設定をサポートしており、柔軟性が高いです。コンフェッティの数、拡散具合、サイズ、形状、色などを自由に調整できるため、さまざまな雰囲気を演出できそうです。
-
テキストや SVG パスを使ってカスタム形状のコンフェッティも作れる点が興味深いです。特に絵文字を活用したコンフェッティは面白いアイデアだと思います。
-
Web Worker を活用してメインスレッドをブロックせずにアニメーションを実行できる点も利点です。ただしこの場合、canvas を直接制御できなくなるため、trade-off があります。
-
アニメーションに敏感な一部のユーザーに配慮してモーション削減モードをサポートしているのは、Web アクセシビリティの観点から好ましいです。今後のバージョンではこのモードがデフォルトで有効になる予定とのことで、確認しておくとよさそうです。
-
全体として、使いやすく多彩なオプションを備えたライブラリのようです。軽快な雰囲気の演出が必要な祝賀ページやゲームなどに適していそうです。ただし使いすぎるとユーザー体験を損なう可能性があるため、適度な範囲で活用するのが望ましいでしょう。
1件のコメント
Hacker Newsの意見