写一个鼠标拖尾特效

思路和逻辑

要实现鼠标拖尾特效,我们需要:

  1. 监听鼠标移动事件,获取鼠标的当前位置。
  2. 在每次鼠标移动时,绘制一个小圆点或其他形状在鼠标的当前位置。
  3. 将所有绘制的圆点连接起来,形成一条"尾巴"。
  4. 使用动画效果让尾巴看起来像是在跟随鼠标移动。

分析

为了实现上述思路,我们需要:

  1. 使用 JavaScript 和 HTML5 Canvas API 来绘制图形。
  2. 使用 requestAnimationFrame 函数来实现动画效果。
  3. 使用数组来存储所有绘制的圆点的位置。
  4. 在每一帧中,清除画布,重新绘制所有圆点,并更新圆点的位置。

代码块

以下是实现鼠标拖尾特效的关键代码块:

javascript 复制代码
// 获取画布元素和上下文
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

// 设置画布大小
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

// 存储所有圆点的位置
let points = [];

// 鼠标移动事件处理函数
function handleMouseMove(event) {
  // 获取鼠标的当前位置
  const x = event.clientX;
  const y = event.clientY;

  // 将新圆点的位置添加到数组中
  points.push({ x, y });

  // 如果圆点数量超过限制,移除最老的圆点
  if (points.length > 100) {
    points.shift();
  }
}

// 动画循环函数
function animate() {
  // 清除画布
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 绘制所有圆点
  for (let i = 0; i < points.length; i++) {
    const point = points[i];
    ctx.beginPath();
    ctx.arc(point.x, point.y, 5, 0, 2 * Math.PI);
    ctx.fillStyle = 'rgba(255, 255, 255, 0.5)';
    ctx.fill();
  }

  // 更新圆点的位置
  for (let i = 0; i < points.length; i++) {
    const point = points[i];
    point.x += (mouseX - point.x) * 0.1;
    point.y += (mouseY - point.y) * 0.1;
  }

  // 请求下一帧动画
  requestAnimationFrame(animate);
}

// 监听鼠标移动事件
document.addEventListener('mousemove', handleMouseMove);

// 启动动画循环
animate();

完整代码

以下是完整的 HTML 和 JavaScript 代码:

html 复制代码
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Mouse Drag Tail Effect</title>
    <style>
      body {
        margin: 0;
        padding: 0;
        background-color: #333;
      }
      canvas {
        display: block;
      }
    </style>
  </head>
  <body>
    <canvas id="canvas"></canvas>
    <script>
      // 获取画布元素和上下文
      const canvas = document.getElementById('canvas');
      const ctx = canvas.getContext('2d');

      // 设置画布大小
      canvas.width = window.innerWidth;
      canvas.height = window.innerHeight;

      // 存储所有圆点的位置
      let points = [];

      // 鼠标移动事件处理函数
      function handleMouseMove(event) {
        // 获取鼠标的当前位置
        const x = event.clientX;
        const y = event.clientY;

        // 将新圆点的位置添加到数组中
        points.push({ x, y });

        // 如果圆点数量超过限制,移除最老的圆点
        if (points.length > 100) {
          points.shift();
        }
      }

      // 动画循环函数
      function animate() {
        // 清除画布
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        // 绘制所有圆点
        for (let i = 0; i < points.length; i++) {
          const point = points[i];
          ctx.beginPath();
          ctx.arc(point.x, point.y, 5, 0, 2 * Math.PI);
          ctx.fillStyle = 'rgba(255, 255, 255, 0.5)';
          ctx.fill();
        }

        // 更新圆点的位置
        for (let i = 0; i < points.length; i++) {
          const point = points[i];
          point.x += (mouseX - point.x) * 0.1;
          point.y += (mouseY - point.y) * 0.1;
        }

        // 请求下一帧动画
        requestAnimationFrame(animate);
      }

      // 监听鼠标移动事件
      document.addEventListener('mousemove', handleMouseMove);

      // 启动动画循环
      animate();
    </script>
  </body>
</html>

请注意,在上面的代码中,我们假设 mouseXmouseY 变量已经被定义并更新为鼠标的当前位置。通常情况下,你需要在 handleMouseMove 函数中更新这些变量的值。

相关推荐
ssshooter10 分钟前
Promise 和 async/await 被 try-catch 包裹时的行为差异
前端·javascript·面试
肖志-AI全栈15 分钟前
从零讲透 Ajax:XHR、Fetch、JSON 序列化到异步编程全链路
前端·ajax·json
yyt36304584117 分钟前
KlineChartQuant Tooltip 高频交互 200FPS 性能优化完整复盘
前端·经验分享·性能优化·typescript·vue·交互·chrome devtools
2601_963771371 小时前
WordPress SEO Guide: Boost Rankings Without Technical Jargon
前端·php
李顿波1 小时前
Chrome 扩展程序 MV3 架构组件概览
前端·chrome·浏览器插件
KingCodeHan1 小时前
ESLint 完全指南:从入门到精通
前端
GHL2842710901 小时前
安装chrome浏览器
前端·chrome
kisshyshy1 小时前
从0到1彻底理解流式输出:先读懂Vue的“乐高积木”,再拧开LLM的“数据水龙头”
javascript·vue.js·人工智能
谙忆10241 小时前
WebCodecs 实战:用 ImageDecoder 和 VideoFrame 在浏览器里做硬件加速的帧处理
前端
JerrySir1 小时前
密码没泄露,2FA 也没失效:Chrome 146 为什么还要让 Cookie“搬不走”?
前端