No.047
BACKGROUND CSSJS

Particle Field

粒子が漂い近づくと線で結ばれるパーティクル背景。テック系サイトのヒーローに。canvasで描画。

DEMO

CODE

HTML
<div class="demo-stage" style="padding:0"><canvas class="pf-canvas" id="pfCanvas"></canvas></div>
CSS
.pf-canvas { width:100%; height:280px; display:block; background:#0E0E12; }
JS
const pfCanvas = document.getElementById('pfCanvas');
const pfCtx = pfCanvas.getContext('2d');
function pfSize(){ pfCanvas.width = pfCanvas.offsetWidth; pfCanvas.height = pfCanvas.offsetHeight; }
pfSize();
window.addEventListener('resize', pfSize);
const pfNum = 64;
const pfParts = [];
for (let i = 0; i < pfNum; i++){
  pfParts.push({
    x: Math.random() * pfCanvas.width, y: Math.random() * pfCanvas.height,
    vx: (Math.random() - 0.5) * 0.6, vy: (Math.random() - 0.5) * 0.6,
    r: Math.random() * 2 + 1
  });
}
function pfLoop(){
  pfCtx.clearRect(0, 0, pfCanvas.width, pfCanvas.height);
  for (let i = 0; i < pfNum; i++){
    const p = pfParts[i];
    p.x += p.vx; p.y += p.vy;
    if (p.x < 0 || p.x > pfCanvas.width) p.vx *= -1;
    if (p.y < 0 || p.y > pfCanvas.height) p.vy *= -1;
    pfCtx.beginPath();
    pfCtx.arc(p.x, p.y, p.r, 0, Math.PI * 2);
    pfCtx.fillStyle = '#E91B89';
    pfCtx.fill();
  }
  for (let i = 0; i < pfNum; i++){
    for (let j = i + 1; j < pfNum; j++){
      const dx = pfParts[i].x - pfParts[j].x;
      const dy = pfParts[i].y - pfParts[j].y;
      const dist = Math.sqrt(dx * dx + dy * dy);
      if (dist < 92){
        pfCtx.beginPath();
        pfCtx.moveTo(pfParts[i].x, pfParts[i].y);
        pfCtx.lineTo(pfParts[j].x, pfParts[j].y);
        pfCtx.strokeStyle = 'rgba(233,27,137,' + (1 - dist / 92) * 0.4 + ')';
        pfCtx.stroke();
      }
    }
  }
  requestAnimationFrame(pfLoop);
}
pfLoop();

AI PROMPT

Claude Cursor v0
PROMPT
canvasでパーティクル背景を作って。粒子を約64個、ランダムな位置・速度・半径で生成。毎フレームclearRectして粒子を移動(端で速度反転)、arcで円を描画。2粒子間の距離が92px未満なら線で結び、近いほど濃いrgba透明度にする。requestAnimationFrameでループ、resizeでサイズ追従。

BOOKS · PR · AMAZON

📖 なかしまぁ先生のCSSアニメーション入門 📖 UIデザインの心理学 ―わかりやすさ・使いやすさの法則 📖 Fundamentals of Web Animation with GSAP

※当サイトはAmazonアソシエイトプログラムの参加者です。リンクから商品をご購入いただくと、当方に紹介料が発生します。

学びを止めない · AMAZONサブスク

📚 Kindle Unlimited — 技術書・デザイン書が読み放題。30日無料体験 → 🎧 Audible — 移動中に耳で学ぶオーディオブック。30日無料体験 → 📦 Amazon Prime — Prime Reading・配送特典つき。30日無料体験 → 🎵 Music Unlimited — 作業用BGMに。1億曲が聴き放題・30日無料体験 →

※当サイトはAmazonアソシエイトプログラムの参加者です。リンクから商品をご購入いただくと、当方に紹介料が発生します。

パーティクルフィールド(Particle Field)とは

粒子が漂い近づくと線で結ばれるパーティクル背景。テック系サイトのヒーローに。canvasで描画。この効果は見た目をCSSで整えつつ、JavaScriptでクリックやスクロール・マウス移動などの操作を検知して動きを制御します。

使いどころ

ヒーローセクションの背景・セクション区切り・装飾レイヤーなど、空気感づくりに向く。やりすぎると可読性や操作性を損なうため、目的のある一点に絞って使うのがコツです。

CSS実装のポイント

動きはGPUで処理されやすいtransformとopacityを軸に組み立てると、レイアウトの再計算(リフロー)を避けて滑らかに動きます。width・height・top/leftなど位置やサイズを直接変えるアニメーションは負荷が高いため避けるのが定石です。当サイトのコードはprefers-reduced-motionに対応しており、動きを減らす設定にしている利用者には自動でアニメーションを抑えるよう配慮しています。

CSSとJavaScriptの違い

CSSアニメーションは記述が簡潔で軽く、ブラウザ側で最適化されるため高パフォーマンスですが、操作に応じた複雑な分岐や数値計算は不得意です。一方JavaScriptはイベントに反応して動きを動的に組み立てられる反面、書き方を誤ると処理が重くなりがちです。この効果は見た目はCSS・制御はJavaScriptという役割分担で成り立っています。