点击星光(点击任意位置绽放星芒粒子特效)

CSSJS 许可:自研原创

点击星光组件:点击页面任意位置绽放一圈四角星芒粒子,含中心闪光、随机飞散距离与色彩,粒子动画结束自动回收,纯 JS 生成零依赖。

效果演示(真实可交互)

在演示区任意位置点击,会从落点绽放出一圈四角星芒:先是中心一道白色闪光,紧接着 10-15 颗彩色小星向四周飞散并逐渐缩小淡出。每颗星的飞散角度、距离、大小、颜色与延迟都是随机的,连点多次会叠加出星云般的层次,适合做按钮反馈、点赞彩蛋或空白区域装饰。

✨ 点击下方任意位置,绽放星光

完整代码

HTML(演示区容器):

<div class="cs-demo" id="area">点击这里</div>

CSS(星形用 clip-path 纯 CSS 绘制,动画用自定义属性传参):

.cs-star {
  position: absolute; width: var(--s); height: var(--s);
  background: var(--c);
  clip-path: polygon(50% 0, 62% 38%, 100% 50%, 62% 62%,
                     50% 100%, 38% 62%, 0 50%, 38% 38%);  /* 四角星 */
  transform: translate(-50%, -50%) scale(0);
  animation: cs-fly .7s ease-out forwards;
  pointer-events: none;
}
@keyframes cs-fly {
  from { transform: translate(-50%, -50%) scale(1); opacity: 1; }
  to   { transform: translate(calc(-50% + var(--dx)),
                              calc(-50% + var(--dy))) scale(.15); opacity: 0; }
}

JS(pointerdown 生成粒子,动画结束自动移除,约 30 行):

const area = document.getElementById('area');
const COLORS = ['#ffd76e', '#ff9f68', '#7ee8fa', '#b18cff', '#8affc1'];

area.addEventListener('pointerdown', (e) => {
  const rect = area.getBoundingClientRect();
  const x = e.clientX - rect.left, y = e.clientY - rect.top;
  const count = 10 + Math.floor(Math.random() * 5);
  for (let i = 0; i < count; i++) {
    const s = document.createElement('span');
    s.className = 'cs-star';
    const angle = (Math.PI * 2 * i) / count + Math.random() * 0.6;
    const dist = 38 + Math.random() * 60;
    s.style.left = x + 'px';
    s.style.top = y + 'px';
    s.style.setProperty('--dx', Math.cos(angle) * dist + 'px');
    s.style.setProperty('--dy', Math.sin(angle) * dist + 'px');
    s.style.setProperty('--s', 5 + Math.random() * 6 + 'px');
    s.style.setProperty('--c', COLORS[i % COLORS.length]);
    area.appendChild(s);
    s.addEventListener('animationend', () => s.remove());
  }
});

核心思路:每次点击动态创建一组 span,用 --dx、--dy 自定义属性把随机飞散向量写进 CSS 动画;粒子位移、缩放、透明度全部由 GPU 合成,动画结束立即从 DOM 移除,不会堆积节点。星形用 clip-path 多边形绘制,无需 SVG 或图片。

参数说明

参数位置说明
粒子数量count 的随机范围建议 8-20,太多会糊成一片
飞散半径dist 的随机范围30-100px,越大爆发感越强
星芒大小--s 的随机范围4-12px,配合粒子数量调平衡
动画时长cs-fly 的 0.7s400-900ms,越短越干脆
颜色集合COLORS 数组按品牌色自由替换

兼容性与性能

常见问题

Q: 点击时粒子没有出现在手指位置? 检查坐标计算是否减去了容器的 getBoundingClientRect 偏移;如果监听对象不是点击区域本身,还要确认粒子 append 到了与坐标同坐标系的那个容器。

Q: 粒子飞散后留下残影或卡顿? 确认动画结束后有 remove 回收逻辑;粒子动画时长偏长或数量偏多也会造成视觉残留,建议按上表参数调优。

Q: 想换成爱心、雪花等其他形状? 只需替换 clip-path 的多边形顶点坐标,或者给粒子换成 emoji 文本内容,其余逻辑完全不用动。

Q: 能商用吗? 可以。本组件为粤喵自研原创实现,免费商用无需署名。

许可与来源

  • 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
  • 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
  • 首次发布:2026-09-01 · 最近更新:2026-09-01
  • 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
  • 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理

常见问题

这个组件可以商用吗?

可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。

浏览器兼容性如何?

支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。

怎么修改动画参数?

直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核