CSS Canvas鼠标点击特效之天女散花(文本粒子动画)

1.效果

2.代码

javascript 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    body,
    html {
      margin: 0;
      padding: 0;
      width: 100%;
      height: 100%;
      overflow: hidden;
    }
  </style>
  <title>文本粒子动画</title>
</head>

<body>
  <script>
    const canvas = document.createElement('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    document.body.appendChild(canvas);

    const ctx = canvas.getContext('2d');

    // 粒子类  
    class Particle {
      constructor(x, y) {
        this.x = x;
        this.y = y;
        this.size = Math.random() * 6 + 1; // 随机大小  
        this.velocityY = Math.random() * 10 - 0.5; // 垂直速度  
        this.velocityX = Math.random() * 20 - 1; // 水平速度  
        this.alpha = Math.random(); // 透明度  
        this.lifespan = Math.random() * 200 + 100; // 生命周期  
      }

      // 更新粒子  
      update() {
        this.x += this.velocityX;
        this.y += this.velocityY + 0.5; // 重力效果  
        this.alpha -= 0.01; // 随时间减少透明度  
        this.lifespan--;

        // 如果粒子生命周期结束,则移除它  
        if (this.lifespan <= 0) {
          return true;
        }

        // 设置颜色  
        ctx.globalAlpha = this.alpha;
        ctx.beginPath();
        ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
        ctx.fillStyle = `hsl(${360 * Math.random()}, 100%, 50%)`; // 随机颜色  
        ctx.fill();

        return false;
      }
    }

    // 粒子数组  
    let particles = [];

    // 渲染火焰  
    function renderFlame() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);

      particles = particles.filter(particle => {
        return !particle.update();
      });

      requestAnimationFrame(renderFlame);
    }

    // 在鼠标移动时创建新的粒子  
    canvas.addEventListener('click', (e) => {
      const rect = canvas.getBoundingClientRect();
      const x = e.clientX - rect.left;
      const y = e.clientY - rect.top;

      // 清除之前的粒子(可选,如果你想在每次鼠标移动时都重新开始)  
      particles = [];

      // 在鼠标位置附近创建粒子  
      createFlame(x, y);
    });

    // 创建火焰(粒子)  
    function createFlame(x, y) {
      for (let i = 0; i < 100; i++) {
        // 为了使粒子从鼠标位置向四周扩散,可以添加一些随机性  
        const offsetX = (Math.random() - 0.5) * 50;
        const offsetY = (Math.random() - 0.5) * 50;
        particles.push(new Particle(x + offsetX, y + offsetY));
      }
    }

    // 开始渲染  
    renderFlame();

    // 窗口大小变化时调整canvas大小  
    window.addEventListener('resize', () => {
      canvas.width = window.innerWidth;
      canvas.height = window.innerHeight;
    });
  </script>
</body>

</html>

3.结语

文本粒子动画是一种引人注目的视觉效果,通过使用HTML5 Canvas和JavaScript实现,能够为网页增添活力和趣味。本文利用前端技术实现一个简单的文本粒子动画效果。

我们定义了一个粒子类,每个粒子具有自己的位置、大小、速度、透明度和生命周期等属性。通过不断更新粒子的位置、大小和透明度,再结合随机颜色填充,从而实现了点击鼠标会有天女散花般的动态效果。如果需要更改粒子,让它变成真的花花,参考这篇文章:爱心粒子特效

相关推荐
雪碧聊技术26 分钟前
前端VUE3项目部署到linux服务器(CentOS 7)
前端·linux部署vue3项目
酒尘&6 小时前
JS数组不止Array!索引集合类全面解析
开发语言·前端·javascript·学习·js
学历真的很重要7 小时前
VsCode+Roo Code+Gemini 2.5 Pro+Gemini Balance AI辅助编程环境搭建(理论上通过多个Api Key负载均衡达到无限免费Gemini 2.5 Pro)
前端·人工智能·vscode·后端·语言模型·负载均衡·ai编程
用户47949283569158 小时前
"讲讲原型链" —— 面试官最爱问的 JavaScript 基础
前端·javascript·面试
用户47949283569158 小时前
2025 年 TC39 都在忙什么?Import Bytes、Iterator Chunking 来了
前端·javascript·面试
大怪v9 小时前
【Virtual World 04】我们的目标,无限宇宙!!
前端·javascript·代码规范
狂炫冰美式9 小时前
不谈技术,搞点文化 🧀 —— 从复活一句明代残诗破局产品迭代
前端·人工智能·后端
xw510 小时前
npm几个实用命令
前端·npm
!win !10 小时前
npm几个实用命令
前端·npm
代码狂想家10 小时前
使用openEuler从零构建用户管理系统Web应用平台
前端