DEMO
CODE
<div class="demo-stage" style="padding:0"><canvas class="pf-canvas" id="pfCanvas"></canvas></div>
.pf-canvas { width:100%; height:280px; display:block; background:#0E0E12; }
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
canvasでパーティクル背景を作って。粒子を約64個、ランダムな位置・速度・半径で生成。毎フレームclearRectして粒子を移動(端で速度反転)、arcで円を描画。2粒子間の距離が92px未満なら線で結び、近いほど濃いrgba透明度にする。requestAnimationFrameでループ、resizeでサイズ追従。
BOOKS · PR · AMAZON
※当サイトはAmazonアソシエイトプログラムの参加者です。リンクから商品をご購入いただくと、当方に紹介料が発生します。
学びを止めない · AMAZONサブスク
※当サイトはAmazonアソシエイトプログラムの参加者です。リンクから商品をご購入いただくと、当方に紹介料が発生します。
粒子が漂い近づくと線で結ばれるパーティクル背景。テック系サイトのヒーローに。canvasで描画。この効果は見た目をCSSで整えつつ、JavaScriptでクリックやスクロール・マウス移動などの操作を検知して動きを制御します。
ヒーローセクションの背景・セクション区切り・装飾レイヤーなど、空気感づくりに向く。やりすぎると可読性や操作性を損なうため、目的のある一点に絞って使うのがコツです。
動きはGPUで処理されやすいtransformとopacityを軸に組み立てると、レイアウトの再計算(リフロー)を避けて滑らかに動きます。width・height・top/leftなど位置やサイズを直接変えるアニメーションは負荷が高いため避けるのが定石です。当サイトのコードはprefers-reduced-motionに対応しており、動きを減らす設定にしている利用者には自動でアニメーションを抑えるよう配慮しています。
CSSアニメーションは記述が簡潔で軽く、ブラウザ側で最適化されるため高パフォーマンスですが、操作に応じた複雑な分岐や数値計算は不得意です。一方JavaScriptはイベントに反応して動きを動的に組み立てられる反面、書き方を誤ると処理が重くなりがちです。この効果は見た目はCSS・制御はJavaScriptという役割分担で成り立っています。