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实现,能够为网页增添活力和趣味。本文利用前端技术实现一个简单的文本粒子动画效果。

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

相关推荐
weixin_382395237 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__8 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.8 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~9 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华10 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子12 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅12 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni13 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学14 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端