news 2026/9/16 18:28:11

tsParticles Confetti Bundle 实战指南:用 @tsparticles/confetti 一行代码打造五彩纸屑特效

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tsParticles Confetti Bundle 实战指南:用 @tsparticles/confetti 一行代码打造五彩纸屑特效

tsParticles Confetti Bundle 实战指南:用 @tsparticles/confetti 一行代码打造五彩纸屑特效

【免费下载链接】tsparticlestsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for your website. Ready to use components available for React.js, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Inferno, Solid, Riot and Web Components.项目地址: https://gitcode.com/GitHub_Trending/ts/tsparticles

导读

@tsparticles/confetti是 tsParticles 官方提供的彩带(confetti)专用聚合包,它将粒子引擎、发射器插件、运动插件以及卡片、爱心、星形等形状和旋转、摆动、翻滚等更新器封装成一个开箱即用的confettiAPI。本文以 bundles/confetti/README.md 为核心骨架,结合该包源码(bundles/confetti/src)深入讲解其安装方式、两种调用范式、完整配置参数、CDN 用法与常见坑位,读完即可在任意前端项目或纯 HTML 页面中落地页面庆祝、按钮反馈、抽奖动画等纸屑特效。

包内组成:一个 API,聚合整条粒子技术栈

@tsparticles/confetti不只是一个函数,它通过依赖聚合把渲染彩带效果所需的全部能力打包在一起。按 bundles/confetti/package.json 的dependencies声明,其包含以下包:

类别包名作用
基础@tsparticles/basic基础粒子加载器(含默认交互与形状)
核心@tsparticles/enginetsParticles 引擎本体
插件@tsparticles/plugin-emitters发射器插件,负责一次性喷出全部纸屑
插件@tsparticles/plugin-motion运动插件,用于支持prefers-reduced-motion降级
形状@tsparticles/shape-cards、@tsparticles/shape-emoji、@tsparticles/shape-heart、@tsparticles/shape-image、@tsparticles/shape-polygon、@tsparticles/shape-square、@tsparticles/shape-star扑克牌、Emoji、爱心、图片、多边形、方块、星形等纸屑形状
更新器@tsparticles/updater-life、@tsparticles/updater-roll、@tsparticles/updater-rotate、@tsparticles/updater-tilt、@tsparticles/updater-wobble生命周期、翻滚、旋转、倾斜、摆动动画

从 confetti.ts 的doInitPlugins可以看到,每次调用confetti()前会把这些 loader 一次性注册进引擎:loadBasicloadEmittersPluginSimpleloadMotionPluginloadCardSuitsShapeloadHeartShapeloadImageShapeloadPolygonShapeloadSquareShapeloadStarShapeloadEmojiShape,以及loadRotateUpdaterloadLifeUpdaterloadRollUpdaterloadTiltUpdaterloadWobbleUpdater。正因为注册了这些形状与更新器,彩带才能在空中翻滚、摆动、倾斜地飘落。

其依赖关系可以直观地用 README 中的依赖图表示:

对外 API:围绕confetti的四个入口

该包的全部 API 都集中在confetti这一个函数对象上,源码中 confetti.ts 与 types.ts 定义了如下形态:

import { confetti } from "@tsparticles/confetti"; // 主 API:两种调用形式 await confetti(options); await confetti("canvas-id", options); // 附加辅助方法 await confetti.init(); // 仅初始化插件,不播放动画 const fireOnCanvas = await confetti.create(canvas, defaultOptions); // 绑定自定义 canvas await fireOnCanvas(options); // 通过返回的局部函数播放 console.log(confetti.version); // 打印包版本号

几个关键设计点,值得结合源码理解:

  • 首参即分派confetti的第一个参数ConfettiFirstParamstring | RecursivePartial<IConfettiOptions>联合类型。传入字符串时把它当作 canvas 的id,其余情况视为配置对象,并自动使用默认 id"confetti"
  • 返回 Container:每次调用返回Promise<Container | undefined>,便于进一步操作 tsParticles 容器实例。
  • 主入口不导出引擎@tsparticles/confetti的主入口(index.ts)刻意不暴露tsParticles。如果确实需要引擎底层 API,请直接从@tsparticles/engine导入。不过 browser.ts 这种用于 CDN 打包的入口会额外把tsParticles挂到globalThis上。
  • confetti.create返回偏函数:它会基于传入的 canvas 生成一个"局部 confetti",该函数后续调用时自动复用绑定好的 canvas 与默认配置,见 confetti.ts。
  • confetti.version注入构建版本:版本号通过 rollup 构建时的__VERSION__宏注入,构建配置见 rollup.config.js。

安装与模块加载

通过包管理器安装(仓库使用 pnpm workspace 管理,命令如下):

pnpm add @tsparticles/confetti

安装后,package.json 的exports字段提供了两条子路径:

  • 主入口@tsparticles/confetti:默认 ESM,同时提供typesbrowserimportrequire四种条件导出,覆盖 TypeScript、浏览器直引与 CommonJS 场景;
  • 懒加载入口@tsparticles/confetti/lazy:所有依赖改为运行时动态import()(见 confetti.lazy.ts),适合对首屏体积敏感、希望按需拉取依赖的 ESM 项目。

快速上手:三种典型用法

1. ESM / TypeScript:全局全屏彩带

不指定 canvas 时,特效会以全屏浮层的方式播放(对应fullScreen.enable: true),适合页面级庆祝:

import { confetti } from "@tsparticles/confetti"; await confetti({ count: 80, spread: 60, position: { x: 50, y: 50 }, colors: ["#ffffff", "#ff0000"], });

2. 指定已有 canvas id

传入 id 时,特效会渲染到页面中 id 匹配的 canvas 元素上:

import { confetti } from "@tsparticles/confetti"; await confetti("tsparticles", { count: 50, angle: 90, spread: 45, });

3. 绑定自定义 canvas:confetti.create

适合把彩带约束在某个局部 DOM 区域(如按钮、卡片)内。它返回一个已经绑定好 canvas 的函数,后续每次调用只需传覆盖配置:

import { confetti } from "@tsparticles/confetti"; const canvas = document.getElementById("my-canvas") as HTMLCanvasElement; const localConfetti = await confetti.create(canvas, { count: 30 }); await localConfetti({ spread: 70 });

从源码看,confetti.create会先读取 canvas 的id属性(没有则用默认"confetti")并回写该属性,随后创建容器;返回的闭包再次调用时复用同一个 canvas,实现"一次绑定、多次发射"。

CDN / Vanilla JS / jQuery 用法

CDN 场景提供两个文件,均来自 rollup.config.js 的打包产物:

  • Bundle 文件:所有依赖内联进一个脚本,加载后confetti直接挂在globalThis(即浏览器中的window.confetti),开箱即用;
  • 非 Bundle 文件:只包含confettiAPI 本身,页面必须按Included Packages一节列出的依赖顺序手动逐个加载脚本,配置成本更高。

Bundle 加载后的典型用法:

<script src="https://cdn.example.com/@tsparticles/confetti/bundle.min.js"></script> <script> // 方式一:直接触发 confetti({ count: 60 }); // 方式二:异步等待播放完成 (async () => { await confetti({ count: 60, spread: 55 }); })(); // 方式三:指定目标 canvas confetti("tsparticles", { count: 50, position: { x: 50, y: 50, }, }); </script>

注意:非 Bundle 方案中globalThis.confetti的挂载逻辑见 browser.ts(只挂confetti),而完整 Bundle 的入口 browser.ts 还会额外暴露tsParticles

完整参数表与默认值

confettiAPI 接受两种签名:confetti(options)confetti(id, options)。所有配置都实现于 ConfettiOptions.ts 的构造器默认值,汇总如下:

参数类型默认值说明
countInteger50一次发射的纸屑粒子数量
angleNumber90发射角度(度),90 表示朝正上方喷
spreadNumber45发射张角(度),越大越"散开"
startVelocityNumber45初始速度
decayNumber0.9速度衰减系数,越小减速越快
flatBooleanfalse是否扁平纸屑(关闭旋转/倾斜/翻滚/摆动)
gravityNumber1重力倍数(基于 9.81 基准)
driftNumber0水平漂移量,可为负值
ticksNumber200动画帧数(持续时间),越大飘得越久
positionObject{ x: 50, y: 50 }发射原点(百分比坐标)
colorsArray<String>见下方默认色板纸屑颜色列表
shapesArray<String>["square", "circle"]纸屑形状
shapeOptionsRecord<string, unknown>{}各形状的专属配置(如图片 url、文本内容)
scalarNumber1粒子尺寸缩放系数
zIndexInteger100全屏模式下浮层的 z-index
disableForReducedMotionBooleantrue系统开启"减弱动态效果"时自动禁用

默认色板为 7 色糖果色:

["#26ccff", "#a25afd", "#ff5e7e", "#88ff5a", "#fcff42", "#ffa62d", "#ff36ff"]

兼容的废弃别名(仍被接受,但建议迁移):

  • particleCount→ 用count
  • origin→ 用positionorigin按 0~1 归一化值换算,见 ConfettiOptions.ts 的 getter/setter)。

参数背后的引擎映射:源码级原理

confetti之所以"轻",是因为它在内部把一套精简的配置翻译成完整的 tsParticles 源配置(utils.ts 的convertOptions),几个值得注意的换算:

  • 物理量换算gravity * 9.81作为重力加速度,startVelocity * 3作为初速度,1 - decay作为速度衰减率,spread映射为移动角度、angle取负作为移动方向;
  • 发射模型:粒子数不直接写在particles.number,而是通过 emitters 插件在life: { duration: 0.1, count: 1 }的瞬间一次性喷出(startCount),并配合透明度从max衰减到min的动画营造"消散"感;
  • ticks换算透明度速度opacitySpeed = 120 * 100 / (60 * ticks),即动画帧率按 120 FPS、基准 60 FPS 折算,确保纸屑在指定帧数内完成淡出;
  • reduced-motion 降级disableForReducedMotion直接映射到motion.disable,由 motion 插件检测prefers-reduced-motion后跳过动画;
  • 复用优化setConfetti内部维护了一个ids -> Container的 Map(utils.ts)。若同一 id 的容器仍存活,后续调用走addEmitter快速路径,直接在原容器上再喷一轮,避免重复建容器;并发调用期间则用 Promise 加锁等待初始化完成。

常见坑位与规避

README 明确列出了三个最常见的坑:

  1. CDN 场景过早调用:脚本尚未加载完成就调用confetti,会得到 undefined 或直接报错。应等待 DOM/脚本就绪,或使用(async () => { await confetti(...) })()形式,把调用放进异步上下文。
  2. 误以为主入口导出tsParticles@tsparticles/confetti主入口只导出confetti,需要引擎 API 时请从@tsparticles/engine单独导入。
  3. TypeScript 下不传首参confetti的第一个参数是必填的,要么传配置对象(confetti(options)),要么传 id + 配置(confetti(id, options)),不能无参调用。

延伸:配套的 confetti 预设与示例

除直接使用该 bundle 外,仓库内还提供了基于它的高阶预设与模板,可直接参考:

  • 预设:@tsparticles/preset-confetti、@tsparticles/preset-confettiCannon、@tsparticles/preset-confettiExplosions、@tsparticles/preset-confettiFalling、@tsparticles/preset-confettiParade,分别对应礼炮、爆炸、飘落、游行的成品动画;
  • 演示模板:templates/confetti 与 demo 目录下提供多框架可运行示例;
  • 完整配置参考:markdown/Options.md 与 markdown/Options 目录覆盖引擎级全部选项说明。

小结

@tsparticles/confetti以"单个confetti函数"作为统一入口,背后聚合了引擎、发射器、运动插件与十余个形状/更新器模块,是 tsParticles 生态中把"彩带特效"这件事做到极简的官方方案。无论是全屏庆祝、局部 canvas 绑定,还是 CDN 快速接入,本文给出的 API 形态、参数表与源码换算逻辑都足以支撑你在生产项目中直接落地,并能在需要时无缝下沉到引擎层做深度定制。

【免费下载链接】tsparticlestsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for your website. Ready to use components available for React.js, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Inferno, Solid, Riot and Web Components.项目地址: https://gitcode.com/GitHub_Trending/ts/tsparticles

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 18:27:39

深视智能SR系列3D相机SDK开发实践:连接、调参与点云获取

简介&#xff1a;深视智能SR系列3D相机SDK程序文件&#xff0c;面向工业视觉领域需要对该系列相机进行二次开发的工程师与集成商&#xff0c;解决SDK调用中不同数据采集模式的选型与实现问题。包内程序文件围绕SDK提供了四种典型模式说明&#xff1a;一次回调模式适合设定采集行…

作者头像 李华
网站建设 2026/9/16 18:27:08

UE5游戏资源解包实战:从Pak文件到资产提取全流程

2025年的游戏圈&#xff0c;虚幻引擎几乎成了默认选项。Steam新品榜上十款里七八款挂着UE5的标&#xff0c;从独立作品到3A大作都用同一套资源管线。也正是因为这样&#xff0c;游戏目录里那堆.pak文件越来越常见&#xff0c;装满了我按捺不住的好奇心&#xff1a;这些动辄几十…

作者头像 李华
网站建设 2026/9/16 18:27:02

Excel SUM求和为0?一文拆解文本数字与隐藏字符的排查思路

Excel用SUM算出不对或为0的问题&#xff0c;我在群里被问过不下几十次。99%的情况下都不是Excel“坏了”&#xff0c;而是数据本身就是个“披着数字外衣”的文本&#xff0c;或者是公式引用的区域跟你想的不一样。这篇文章我不讲虚的&#xff0c;直接按实际排查顺序&#xff0c…

作者头像 李华
网站建设 2026/9/16 18:26:52

麻雀搜索算法整定PID参数:嵌入式轻量级优化实战

简介&#xff1a;本资源是一份面向自动化控制与智能优化方向初学者及进阶学习者的MATLAB/Simulink实践项目&#xff0c;聚焦于利用麻雀搜索算法&#xff08;SSA&#xff09;实现PID控制器参数的自动整定&#xff0c;解决传统试凑法效率低、精度差的工程痛点&#xff0c;适用于电…

作者头像 李华
网站建设 2026/9/16 18:25:52

工业边缘生成式AI异常检测实战:从模型压缩到确定性部署

1. 工业现场为什么非得把大模型“塞进”边缘设备里&#xff1f;我第一次在某汽车焊装车间看到那台部署在PLC机柜旁的NVIDIA Jetson AGX Orin时&#xff0c;它正用不到8W的功耗实时分析16路高清焊点红外视频流——而同一时间&#xff0c;车间顶棚的Wi-Fi信号强度图上&#xff0c…

作者头像 李华