Back

JavaScriptで紙吹雪エフェクトを追加する:楽しい実装ガイド

JavaScriptで紙吹雪エフェクトを追加する:楽しい実装ガイド

Webアプリに祝福の瞬間を追加したいですか?JavaScript紙吹雪アニメーションは、普通のインタラクションを記憶に残る体験に変えます。購入完了、フォーム送信、実績解除など、紙吹雪はユーザーが覚えている特別な輝きを加えます。

このガイドでは、2つの実用的なアプローチを取り上げます:軽量なHTML Canvas紙吹雪エフェクトをゼロから構築する方法と、js-confettiやcanvas-confettiのような本番環境対応ライブラリを使用した高速実装です。

重要なポイント

  • JavaScript紙吹雪ライブラリは、自動クリーンアップとクロスブラウザ互換性を備えた本番環境対応ソリューションを数分で提供します
  • Vanilla Canvas実装は、わずか50行のコードで物理演算とレンダリングを完全に制御できます
  • 常にユーザーのモーション設定を尊重し、モバイルパフォーマンスのためにパーティクル数を最適化してください
  • 紙吹雪エフェクトの効果を維持するため、本当に祝福すべき瞬間のみに使用してください

紙吹雪アプローチの選択

クイックライブラリ統合(デプロイまで2分)

ほとんどの本番アプリケーションでは、確立された紙吹雪アニメーションJavaScriptライブラリが、機能とシンプルさの最適なバランスを提供します。

js-confetti は、依存関係ゼロのアーキテクチャと絵文字サポートで際立っています:

<!-- CDNインストール -->
<script src="https://cdn.jsdelivr.net/npm/js-confetti@latest/dist/js-confetti.browser.js"></script>
// 基本的な使い方
const jsConfetti = new JSConfetti()

// カラフルな紙吹雪をトリガー
jsConfetti.addConfetti({
  confettiColors: ['#ff0a54', '#ff477e', '#ff7096'],
  confettiNumber: 100
})

// または絵文字を使用
jsConfetti.addConfetti({
  emojis: ['🎉', '✨', '💫', '🎊'],
  emojiSize: 50,
  confettiNumber: 30
})

canvas-confetti は、より多くの物理演算カスタマイズを提供します:

<!-- CDNインストール -->
<script src="https://cdn.jsdelivr.net/npm/canvas-confetti@latest/dist/confetti.browser.min.js"></script>
// 特定の原点からの花火エフェクト
confetti({
  particleCount: 100,
  spread: 70,
  origin: { x: 0.5, y: 0.6 }, // 中央、中央よりやや下
  colors: ['#bb0000', '#ffffff']
})

両方のライブラリは軽量で、よくメンテナンスされており、自動的にクリーンアップを処理します。js-confettiライブラリはアニメーション完了時にPromiseを返すため、アクションのチェーンに最適です:

await jsConfetti.addConfetti()
console.log('お祝い完了!')
// 次のアクションに進む

Vanilla Canvas紙吹雪の構築(依存関係ゼロ)

完全な制御が必要な場合や、すべてのバイトが重要な場合、vanilla HTML Canvas紙吹雪実装は最小限のコードで済みます:

const canvas = document.getElementById('confetti-canvas')
const ctx = canvas.getContext('2d')
const particles = []

// canvasをウィンドウサイズにリサイズ
canvas.width = window.innerWidth
canvas.height = window.innerHeight

// ランダムなプロパティを持つパーティクルを作成
function createParticle() {
  return {
    x: Math.random() * canvas.width,
    y: -10,
    vx: (Math.random() - 0.5) * 2,
    vy: Math.random() * 3 + 2,
    color: `hsl(${Math.random() * 360}, 70%, 50%)`,
    size: Math.random() * 3 + 2
  }
}

// アニメーションループ
function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height)
  
  particles.forEach((p, index) => {
    p.x += p.vx
    p.y += p.vy
    p.vy += 0.1 // 重力
    
    ctx.fillStyle = p.color
    ctx.fillRect(p.x, p.y, p.size, p.size)
    
    // 画面外のパーティクルを削除
    if (p.y > canvas.height) {
      particles.splice(index, 1)
    }
  })
  
  if (particles.length > 0) {
    requestAnimationFrame(animate)
  }
}

// 紙吹雪バーストをトリガー
function triggerConfetti() {
  for (let i = 0; i < 100; i++) {
    particles.push(createParticle())
  }
  animate()
}

このアプローチにより、物理演算、パーティクルの形状、レンダリングを完全に制御できます。ただし、クリーンアップ、パフォーマンス最適化、ブラウザ互換性は自分で処理する必要があります。

紙吹雪エフェクトの本番環境ベストプラクティス

ユーザー設定の尊重

紙吹雪アニメーションJavaScriptエフェクトをトリガーする前に、常にモーション感度をチェックしてください:

const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches

if (!prefersReducedMotion) {
  jsConfetti.addConfetti()
} else {
  // 代わりに静的な成功メッセージを表示
  showSuccessMessage()
}

モバイルパフォーマンスの最適化

スムーズなモバイル体験のために、パーティクル数を適切に保ちます:

const isMobile = window.innerWidth < 768
const particleCount = isMobile ? 50 : 150

jsConfetti.addConfetti({
  confettiNumber: particleCount
})

お祝い後のクリーンアップ

canvas-confettiは自動的にクリーンアップを処理します。js-confettiはclearCanvas()メソッドを提供してcanvasをリセットしますが、既に進行中のアニメーションはキャンセルしません。vanilla実装では、常にリソースをクリアしてください:

// js-confettiの場合
jsConfetti.clearCanvas()

// vanilla実装の場合
function cleanup() {
  particles.length = 0
  ctx.clearRect(0, 0, canvas.width, canvas.height)
}

戦略的な使用パターン

紙吹雪エフェクトは、本当に祝福すべき瞬間のために取っておくと最も効果的です:

  • ✅ 購入完了
  • ✅ アカウント作成成功
  • ✅ 実績解除
  • ✅ マイルストーン到達
  • ❌ すべてのボタンクリック
  • ❌ ページ読み込み
  • ❌ 軽微なインタラクション

実装例

ボタンクリックのお祝い

document.getElementById('purchase-btn').addEventListener('click', async () => {
  // まずアクションを処理
  const success = await processPurchase()
  
  if (success) {
    // それからお祝い
    jsConfetti.addConfetti({
      confettiColors: ['#00ff00', '#ffffff'],
      confettiNumber: 75
    })
  }
})

位置ベースの紙吹雪

canvas-confettiのみが、画面上の正確な位置から紙吹雪をトリガーすることをサポートしています。js-confettiでは、紙吹雪は常に原点制御なしでcanvas全体を埋めます。

// canvas-confetti: マウスクリック座標からトリガー
element.addEventListener('click', (e) => {
  confetti({
    particleCount: 80,
    spread: 70,
    origin: {
      x: e.clientX / window.innerWidth,
      y: e.clientY / window.innerHeight
    }
  })
})

これにより、クリックされたボタンからのバースト、サイドキャノン、特定の場所での花火などのエフェクトを作成できます。

まとめ

JavaScript紙吹雪エフェクトは、日常的なインタラクションを記憶に残る瞬間に変えます。Vanilla Canvas実装は完全な制御を提供しますが、js-confettiやcanvas-confettiのようなライブラリは、クロスブラウザ互換性、パフォーマンス最適化、クリーンアップの複雑さを処理する本番環境対応ソリューションを提供します。

迅速で信頼性の高い実装と適切なデフォルト設定が必要な場合はライブラリを選択してください。正確な制御や依存関係ゼロが必要な場合はvanillaで構築してください。いずれにしても、最高の紙吹雪は控えめに使用されることを忘れないでください—本当にお祝いに値する瞬間のために取っておきましょう。

よくある質問

最新の紙吹雪ライブラリは最小限のオーバーヘッドを追加し、通常gzip圧縮で10KB未満です。パフォーマンスへの影響は主にパーティクル数に依存します。ほとんどのデバイスでスムーズな60fpsを実現するには100パーティクル未満に保つか、最適なレンダリングのためにrequestAnimationFrameを使用してください。

はい、js-confettiとcanvas-confettiの両方が最新のフレームワークとシームレスに動作します。npmでインストールし、ライブラリをインポートして、ライフサイクルメソッドやイベントハンドラで紙吹雪をトリガーするだけです。多くはフレームワーク固有のラッパーパッケージも提供しています。

常にprefers-reduced-motionメディアクエリをチェックし、スクリーンリーダー用の代替視覚フィードバックを提供し、発作を引き起こす可能性のある点滅する色を避け、紙吹雪が重要なコンテンツやコントロールを隠さないようにしてください。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay