当前位置:首页 > JavaScript

js实现粒子特效

2026-03-01 14:41:04JavaScript

实现粒子特效的基本步骤

创建Canvas元素并初始化上下文。在HTML中添加Canvas标签,通过JavaScript获取该元素并设置其宽高以适应屏幕。

<canvas id="particleCanvas"></canvas>
const canvas = document.getElementById('particleCanvas');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

定义粒子类

粒子类包含位置、速度、大小等属性。每个粒子需要更新位置和绘制到画布上的方法。

class Particle {
  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.size = Math.random() * 5 + 1;
    this.speedX = Math.random() * 3 - 1.5;
    this.speedY = Math.random() * 3 - 1.5;
  }

  update() {
    this.x += this.speedX;
    this.y += this.speedY;
    if (this.size > 0.2) this.size -= 0.1;
  }

  draw() {
    ctx.fillStyle = 'rgba(255, 255, 255, 0.8)';
    ctx.beginPath();
    ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
    ctx.fill();
  }
}

管理粒子数组

创建粒子数组并实现添加新粒子的逻辑。通常根据鼠标移动或时间间隔生成新粒子。

let particles = [];

function createParticles(x, y) {
  for (let i = 0; i < 5; i++) {
    particles.push(new Particle(x, y));
  }
}

window.addEventListener('mousemove', (e) => {
  createParticles(e.clientX, e.clientY);
});

动画循环实现

使用requestAnimationFrame创建动画循环,在每一帧中更新和绘制所有粒子,并移除过小的粒子。

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  for (let i = 0; i < particles.length; i++) {
    particles[i].update();
    particles[i].draw();

    if (particles[i].size <= 0.3) {
      particles.splice(i, 1);
      i--;
    }
  }

  requestAnimationFrame(animate);
}

animate();

增强特效效果

添加连线功能使相近粒子之间产生连接线,增强视觉效果。计算粒子间距离,当距离小于阈值时绘制线段。

function connectParticles() {
  for (let a = 0; a < particles.length; a++) {
    for (let b = a; b < particles.length; b++) {
      const dx = particles[a].x - particles[b].x;
      const dy = particles[a].y - particles[b].y;
      const distance = Math.sqrt(dx * dx + dy * dy);

      if (distance < 100) {
        ctx.strokeStyle = `rgba(255, 255, 255, ${1 - distance/100})`;
        ctx.lineWidth = 1;
        ctx.beginPath();
        ctx.moveTo(particles[a].x, particles[a].y);
        ctx.lineTo(particles[b].x, particles[b].y);
        ctx.stroke();
      }
    }
  }
}

在animate函数中调用connectParticles()即可实现连线效果。

响应窗口大小变化

添加事件监听器,在窗口大小改变时调整Canvas尺寸。

window.addEventListener('resize', () => {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
});

优化性能

对于大量粒子,使用对象池技术重用粒子对象而非频繁创建销毁。设置最大粒子数量限制防止性能下降。

js实现粒子特效

const MAX_PARTICLES = 1000;

function createParticles(x, y) {
  if (particles.length < MAX_PARTICLES) {
    for (let i = 0; i < 5; i++) {
      particles.push(new Particle(x, y));
    }
  }
}

标签: 粒子特效
分享给朋友:

相关文章

vue实现各种特效

vue实现各种特效

Vue实现动画效果 使用Vue的过渡系统实现元素进入/离开的动画效果。通过<transition>组件包裹需要动画的元素,并定义CSS过渡类名或JavaScript钩子。 <tra…

react如何实现特效

react如何实现特效

React 实现特效的方法 在 React 中实现特效可以通过多种方式,包括 CSS 动画、JavaScript 动画库以及 React 特定的动画解决方案。以下是几种常见的实现方法: 使用 CSS…

react实现特效

react实现特效

React 实现特效的常见方法 使用 CSS 动画和过渡 通过 CSS 的 @keyframes 和 transition 属性实现基础动画效果,结合 React 的 className 或 styl…

css制作跑车特效

css制作跑车特效

使用CSS制作跑车特效 跑车动画效果 通过CSS的@keyframes和transform属性可以实现跑车移动的动画效果。以下是一个简单的跑车移动动画代码示例: .car { position:…

css 制作特效

css 制作特效

使用 CSS 制作特效的方法 动画效果(@keyframes) 通过 @keyframes 定义动画序列,结合 animation 属性实现动态效果。 示例代码: @keyframes fade…

js实现图片特效

js实现图片特效

使用Canvas实现图片滤镜效果 Canvas API提供了强大的像素操作能力,可以轻松实现各种图片滤镜效果。通过获取图片的像素数据,对每个像素的RGB值进行数学运算。 const canvas =…