📢 新文章推送 · 每周更新优质内容 · 订阅更新 →
向下滚动
开发编程

鼠标点击特效的前端实现方案

AI 智能总结

效果概览

鼠标点击特效是博客中常见的趣味交互元素。点击页面任意位置时触发短暂的视觉动画,增强用户的参与感和趣味性。

Lumin Blog 支持 6 种点击特效:烟花、文字、爱心、星星、气泡、雪花,每种特效都有独立的颜色、大小、数量等可配置参数。

核心机制

事件监听

全局监听 click 事件,获取鼠标坐标:

1document.addEventListener('click', function(event) {
2  const x = event.clientX;
3  const y = event.clientY;
4  createEffect(x, y);
5});

为避免干扰正常的按钮点击和文本选择,需要判断点击目标:

1document.addEventListener('click', function(event) {
2  const tag = event.target.tagName.toLowerCase();
3  if (tag === 'a' || tag === 'button' || tag === 'input' ||
4      tag === 'textarea' || tag === 'select') {
5    return; // 跳过交互元素
6  }
7  createEffect(event.clientX, event.clientY);
8});

特效分发

 1function createEffect(x, y) {
 2  switch (effectType) {
 3    case 'firework': return createFirework(x, y);
 4    case 'text':     return createTextEffect(x, y);
 5    case 'heart':    return createHeart(x, y);
 6    case 'star':     return createStar(x, y);
 7    case 'bubble':   return createBubble(x, y);
 8    case 'snow':     return createSnowflake(x, y);
 9  }
10}

烟花特效

烟花是最复杂的特效,使用 Canvas 实现。每个爆炸点产生数十个彩色粒子,粒子向外扩散、重力下落、逐渐透明直到消失。

 1function createFirework(x, y) {
 2  const canvas = document.createElement('canvas');
 3  canvas.style.cssText = 'position:fixed;top:0;left:0;pointer-events:none;z-index:9999';
 4  canvas.width = window.innerWidth;
 5  canvas.height = window.innerHeight;
 6  document.body.appendChild(canvas);
 7  const ctx = canvas.getContext('2d');
 8
 9  const particles = [];
10  const colors = ['#ff5252', '#ffd740', '#69f0ae', '#40c4ff', '#b388ff'];
11  const count = 30;
12
13  for (let i = 0; i < count; i++) {
14    const angle = (Math.PI * 2 / count) * i;
15    const velocity = 2 + Math.random() * 4;
16    particles.push({
17      x, y,
18      vx: Math.cos(angle) * velocity,
19      vy: Math.sin(angle) * velocity,
20      color: colors[Math.floor(Math.random() * colors.length)],
21      alpha: 1,
22      size: 2 + Math.random() * 2
23    });
24  }
25
26  function animate() {
27    ctx.clearRect(0, 0, canvas.width, canvas.height);
28    let alive = false;
29
30    particles.forEach(p => {
31      p.x += p.vx;
32      p.y += p.vy;
33      p.vy += 0.05;   // 重力
34      p.alpha -= 0.02; // 衰减
35
36      if (p.alpha > 0) {
37        alive = true;
38        ctx.globalAlpha = p.alpha;
39        ctx.fillStyle = p.color;
40        ctx.beginPath();
41        ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);
42        ctx.fill();
43      }
44    });
45
46    if (alive) {
47      requestAnimationFrame(animate);
48    } else {
49      canvas.remove();
50    }
51  }
52
53  animate();
54}

参数配置

参数默认值说明
particleCount30每次爆炸的粒子数
explosionRadius80最大扩散半径(px)
colors5 种粒子颜色数组

文字特效

点击位置弹出随机文字,文字放大后逐渐透明消失:

 1function createTextEffect(x, y) {
 2  const texts = ['棒', '赞', '妙', '酷', '厉害'];
 3  const text = texts[Math.floor(Math.random() * texts.length)];
 4
 5  const span = document.createElement('span');
 6  span.textContent = text;
 7  span.style.cssText = `
 8    position: fixed; left: ${x - 15}px; top: ${y - 20}px;
 9    color: ${colors[Math.floor(Math.random() * colors.length)]};
10    font-size: 24px; pointer-events: none; z-index: 9999;
11    animation: textPop 1s ease-out forwards;
12  `;
13  document.body.appendChild(span);
14
15  span.addEventListener('animationend', () => span.remove());
16}

CSS 动画:

1@keyframes textPop {
2  0%   { opacity: 1; transform: translateY(0) scale(1); }
3  100% { opacity: 0; transform: translateY(-80px) scale(1.5); }
4}

文字列表和颜色均可通过配置文件自定义。

爱心和星星特效

爱心和星星特效使用 Unicode 字符或 SVG 图标。原理与文字特效类似,通过 CSS 动画控制位移和透明度,但增加了旋转和随机位移。

1@keyframes heartFloat {
2  0%   { opacity: 1; transform: translateY(0) rotate(0deg) scale(1); }
3  50%  { opacity: 0.8; transform: translateY(-60px) rotate(20deg) scale(0.8); }
4  100% { opacity: 0; transform: translateY(-120px) rotate(-10deg) scale(0.4); }
5}

气泡特效

气泡从点击位置向上浮动,伴随左右摇摆:

1@keyframes bubbleRise {
2  0%   { opacity: 0.9; transform: translateY(0) translateX(0) scale(0.3); }
3  50%  { opacity: 0.6; transform: translateY(-60px) translateX(15px) scale(0.8); }
4  100% { opacity: 0; transform: translateY(-150px) translateX(-10px) scale(0.2); }
5}

雪花特效

雪花从点击位置缓慢飘落,随机摇摆:

1@keyframes snowFall {
2  0%   { opacity: 1; transform: translateY(0) translateX(0) rotate(0deg); }
3  100% { opacity: 0; transform: translateY(100px) translateX(20px) rotate(180deg); }
4}

性能考虑

  • Canvas 方案:粒子特效使用 Canvas,性能优于 DOM 操作,适合高粒子数场景
  • DOM 方案:简单特效使用 DOM 动画,代码量小
  • 自动清理:所有特效在动画结束后自动移除 DOM 节点或销毁 Canvas
  • 防抖:限制连续点击时的特效生成频率,避免页面卡顿

配置

在配置文件中可切换特效类型和参数,后台管理系统也提供了可视化配置界面,无需手动修改代码。

3 / 16
版权声明

本文作者 Lumin

本文链接 https://www.zhengquan.xyz/code/click-effect-implementation/

许可协议 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

请作者喝杯咖啡 ☕

  • 微信打赏
    微信支付
  • 支付宝打赏
    支付宝
点击按钮查看打赏二维码
🎁 推荐工具
试试这些实用在线工具,提升工作效率
前往工具集 →

留言评论

期待你的想法

评论加载中