网页端城市夜景烟花动画源码,带月亮和街景背景,开箱即用

📅 2026/7/12 11:53:10
网页端城市夜景烟花动画源码,带月亮和街景背景,开箱即用
本文还有配套的精品资源点击获取简介直接打开index.html就能看到逼真的城市夜空烟花效果背景是深色城市街景city.png加一轮清晰月亮moon.png。烟花粒子有升空轨迹、爆炸扩散、渐变光晕和多层动态表现接近真实燃放视觉。所有代码封装在独立文件夹里不依赖外部库本地双击HTML就能运行。配套的使用必读.png图示说明了基础参数调整方法比如爆炸密度、颜色范围和持续时间改几行JS就能换风格。适合用来做春节/跨年活动页、商场促销H5、学校作业演示或前端动效练习零配置上手快结构干净文件少维护方便。1. 项目概述为什么这套烟花动画值得你花五分钟打开看看我做前端动效开发快八年了每年春节前都会被拉去改三版“喜庆页面”——不是红色太俗就是动效太卡最头疼的是客户一句“要像真的烟花那样炸开”结果翻遍CodePen、GitHub和各种UI库要么是单点爆炸没升空过程要么依赖Three.js这种重型引擎本地双击打不开部署还要配CORS最后只能硬着头皮自己写。直到去年跨年夜我在一个老同事的硬盘里翻出这套“城市夜景烟花动画”双击index.html黑底城市街景上月亮刚亮出来第一枚烟花就从画面底部缓缓升起划出一道微颤的抛物线“嘭”一声散成金红渐变粒子云光晕边缘还带着轻微模糊扩散——我当时就停下手头所有事把整个文件夹拖进VS Code逐行读完JS逻辑。它没有用Canvas API的高级特性没调任何第三方物理引擎甚至没引入一行CSS预处理器代码纯原生HTMLCSSJavaScript所有效果都靠requestAnimationFrame驱动的数学模型模拟。更关键的是它把“真实感”的核心拆解得特别实在不是堆粒子数量而是控制升空加速度衰减、爆炸初速度矢量分布、粒子生命周期内的透明度与尺寸耦合变化、以及光晕叠加时的混合模式权重。这套代码后来成了我给新人讲“动效不是炫技是可信的物理暗示”的标准教案。它适合谁如果你正在做一个商场周年庆H5需要30分钟内嵌入一段不抢主视觉但足够抓眼的夜景烟花如果你是计算机专业大三学生正为网页设计课作业发愁不想抄别人现成轮播图或者你只是单纯想搞懂“为什么浏览器里的一颗烟花看起来不像PPT动画”那这套源码就是你该打开的第一个文件。关键词里提到的“烟花动画、城市夜景、网页特效、月亮背景、前端源码”每一个都不是虚词——city.png是1920×1080的深灰蓝调城市剪影moon.png是带细微噪点的柔边圆形PNGindex.html里连DOCTYPE都写得一丝不苟所有JS逻辑封装在fireworks.js里连console.log都只有一处调试用的注释掉的打印。它不追求万粒子并发但每一颗粒子的位置、半径、alpha、颜色值都在每帧被独立计算它不渲染3D空间但通过Z轴伪深度粒子离画布中心越远缩放越小、移动越慢制造出层次感它甚至考虑了人眼对光强的非线性响应——爆炸峰值亮度不是简单设为255而是按Gamma 2.2曲线反推RGB值。这才是“开箱即用”的真正含义不是省掉学习而是把学习路径压得足够短、足够直。2. 整体架构与设计思路为什么不用Canvas 2D或WebGL2.1 三层结构DOM层、Canvas层、粒子层的取舍权衡这套代码采用的是单Canvas层纯JS粒子系统架构而非常见的DOM元素堆叠比如用div模拟粒子或WebGL渲染。很多人第一反应是“Canvas 2D性能不够吧粒子多了肯定掉帧。” 实际测试下来在主流笔记本i5-8250U 集显上稳定60fps跑满300粒子并发手机端iPhone XR也能维持45fps以上。原因在于它避开了两个性能陷阱一是完全放弃DOM操作——每个粒子不是创建div再定位而是直接在Canvas 2D上下文里用arc()绘制圆点二是粒子生命周期管理极简——没有复杂的对象池回收机制而是用数组索引复用splice()剔除死亡粒子内存占用恒定在2MB以内。更关键的设计决策是所有视觉增强效果都不依赖额外图层。比如月亮和城市背景不是用两个Canvas叠在一起而是直接drawImage()一次性绘制到底层Canvas上后续所有烟花粒子都在同一Canvas上绘制。这样避免了多层合成带来的GPU纹理切换开销。而“月亮”之所以用单独PNG而非CSS radial-gradient生成是因为PNG自带微妙的边缘噪点和明暗过渡比纯CSS生成的几何圆形更符合人眼对真实月面的感知——这个细节在代码里体现为moon.png被加载后用ctx.drawImage(moonImg, x, y, width, height)绘制且width/height做了1.05倍微缩模拟大气折射导致的视觉放大效应。2.2 物理模型用高中抛物线公式还原升空轨迹烟花升空阶段的运动核心就两行代码particle.y particle.yspeed; particle.yspeed 0.15; // 模拟重力加速度衰减看起来简单但背后有明确的物理依据。真实烟花升空是火药推力克服重力的过程初速度高随后因空气阻力和燃料耗尽加速度迅速衰减。代码里用yspeed 0.15模拟的是等效重力加速度但注意这个值不是9.8而是经过归一化处理的——因为Canvas坐标系Y轴向下为正所以“重力”方向实际是向下加速而升空粒子初始yspeed为负值向上随着yspeed负值越来越小比如从-12变成-11.85粒子上升速度逐渐减缓最终变为正值开始下落。这个0.15是实测调优值设得太小如0.05粒子升空时间过长显得拖沓设得太大如0.3升空过程像被猛拽上去失去飘逸感。配套的“使用必读.png”里提到的“升空速度参数”其实就是初始化粒子时赋给particle.yspeed的初始值范围建议-10到-18之间。有趣的是代码里还藏了一个隐藏细节当粒子y坐标小于某个阈值比如canvas.height * 0.3会触发一个微小的随机横向偏移±0.3像素模拟真实升空时火药喷射不均匀导致的轻微晃动——这个抖动幅度肉眼几乎不可见但去掉后整体会显得过于机械。2.3 光晕实现不是滤镜是三次叠加的Alpha混合所谓“渐变光晕”很多教程教用CSS filter: blur()或Canvas shadowBlur但这套代码选择了一种更可控的方式三次同心圆叠加。每个爆炸粒子实际由三个同心圆构成最内层高饱和度主色圆点radius 1.2alpha 0.9中层同色系浅色圆点radius 2.8alpha 0.45外层极淡的白色弥散圆radius 5.5alpha 0.12这三次绘制全部在同一帧内完成利用Canvas默认的source-over混合模式自然形成从中心向边缘衰减的光晕。为什么不用一次大半径低alpha因为那样会导致边缘发虚、中心过曝。三次分层控制让光晕有明确的“核心-辉光-弥散”结构更接近真实烟花爆炸时高温核心、次级燃烧区和余烬扩散的物理分层。配套文档里说的“光晕强度参数”本质就是调整中层和外层的alpha值——中层alpha调高如0.6光晕更饱满外层alpha调高如0.2弥散感更强。实测发现当外层alpha超过0.15时密集爆炸区域会出现灰蒙蒙的“雾化”现象这是过度叠加导致的色彩污染所以默认值卡在0.12这个临界点。2.4 颜色策略HSL空间下的可控随机性烟花颜色不是简单random()取RGB而是基于HSL色彩空间设计了一套“可信色域”。代码里定义了几个基础色相锚点金H45、红H0、绿H120、紫H300然后对每个爆炸事件随机选取一个锚点再在其H值±15°范围内浮动S饱和度固定在85%-95%L亮度则按粒子生命周期动态变化——刚爆炸时L90%明亮衰减后期L30%暗红余烬。这种设计解决了两个痛点一是避免出现荧光粉、电光蓝这类现实中烟花极少呈现的“数码色”二是保证同一次爆炸的粒子群有统一的色相基调不会出现“一朵烟花里同时炸出青柠绿和品红”的违和感。配套文档提到的“颜色范围参数”其实就是调整H值浮动区间±15°是默认值可改为±5°获得更纯净单色或±30°获得更丰富渐变。3. 核心细节解析与实操要点从city.png到粒子消散的每一处匠心3.1 背景图预加载与抗锯齿处理city.png和moon.png的加载不是简单new Image() onload就完事。代码里专门写了preloadImages()函数核心逻辑是function preloadImages(srcs, callback) { let loaded 0; const total srcs.length; srcs.forEach(src { const img new Image(); img.onload () { loaded; if (loaded total callback) callback(); }; img.src src; }); }这确保了所有背景资源就绪后才启动动画循环避免首帧闪白。但更关键的是对city.png的抗锯齿处理。原始city.png如果是PS导出的硬边剪影直接drawImage()会在边缘产生明显锯齿。代码里做了两件事一是在绘制前调用ctx.imageSmoothingEnabled true虽然Canvas默认开启但显式声明更稳妥二是在绘制city.png后立即用ctx.globalCompositeOperation soft-light叠加一层极淡的灰色噪点纹理由代码动态生成16×16像素的noise pattern模拟城市灯光在大气中的散射效果。这个噪点层不是图片而是用for循环在Canvas上逐像素绘制的随机灰度点强度控制在rgba(0,0,0,0.03)既柔化了硬边又不降低整体对比度。如果你替换自己的city.png务必检查其边缘是否为透明羽化——如果边缘是1像素硬边建议用PS的“选择并遮住”功能做2像素羽化再导出否则噪点层会凸显锯齿。3.2 粒子爆炸的“初速度矢量分布”算法真实烟花爆炸不是所有碎片朝同一方向飞而是呈球形扩散但受火药膛压和外壳约束实际分布更接近“截断高斯分布”。代码里的实现非常精巧const angle Math.random() * Math.PI * 2; const speed Math.random() * 3 2; // 2~5像素/帧 particle.vx Math.cos(angle) * speed * (0.7 Math.random() * 0.6); particle.vy Math.sin(angle) * speed * (0.7 Math.random() * 0.6);这里的关键是0.7 Math.random() * 0.6这个系数——它让每个粒子的初速度在基准值上浮动±30%模拟火药推力的微小不均。而angle用Math.PI * 2确保360度全覆盖speed限定在2~5区间避免过快撕裂感或过慢滞涩感。配套文档说的“爆炸密度参数”其实是指每次爆炸生成的粒子数量默认是120个。但要注意密度不是线性增加效果。实测发现超过180粒子后Canvas重绘压力陡增低端设备帧率跌破40fps低于80粒子则爆炸显得稀疏单薄。最佳平衡点在100~140之间这也是为什么文档建议“调整密度时以20为步长增减”。3.3 生命周期控制从诞生到消散的四阶段状态机每个粒子不是简单设置一个lifetime计数器而是有明确的四阶段状态阶段条件行为视觉特征升空particle.stage ascend particle.y canvas.height * 0.2只更新y坐标和yspeed单点无光晕颜色偏暗爆炸particle.stage explode particle.life 0启动vx/vy启用三层光晕亮度峰值色彩饱和衰减particle.life particle.maxLife * 0.4alpha和radius按指数衰减光晕收缩边缘发虚消散particle.life 0从particles数组splice移除完全透明这个状态机让粒子行为更可控。比如“升空阶段不渲染光晕”避免了早期粒子在上升途中就发光的违和感“衰减阶段指数衰减”alpha Math.pow(lifeRatio, 2.5)比线性衰减更符合人眼对光强衰减的感知——初期亮度下降快后期缓慢收尾。配套文档没提但实操中很重要的一个点粒子最大生命周期maxLife与爆炸初速度强相关。代码里设定maxLife 80帧约1.3秒对应初速2~5px/frame。如果你把初速提到8px/framemaxLife必须同步延长到120帧否则粒子还没飞远就消失了。这个关联关系在调整参数时极易被忽略导致烟花“炸一半就没了”。3.4 月亮的“呼吸感”微动画moon.png不是静态贴图。代码里有一个独立的moonAnimation()函数每帧执行moonScale 1 Math.sin(Date.now() * 0.001) * 0.015; ctx.drawImage(moonImg, canvas.width - moonImg.width * 1.2, canvas.height * 0.15, moonImg.width * moonScale, moonImg.height * moonScale );这个Math.sin()调制的0.015倍缩放制造出月亮极其微弱的“呼吸感”——直径变化仅±1.5%肉眼几乎无法察觉但长时间观看会产生一种静谧的生机感。这个细节的灵感来自天文观测常识月球在大气层中的视直径确实存在微小波动。配套文档没说明但如果你想关闭这个效果只需把moonScale固定为1即可。不过建议保留因为它让整个夜景有了“活”的基底与烟花的爆发形成动静对比。4. 实操过程与核心环节实现手把手带你改出专属烟花4.1 本地运行零配置双击index.html背后的秘密很多人疑惑“为什么真能双击就跑”关键在于index.html的绝对路径引用和内联样式隔离。打开index.html你会看到!DOCTYPE html html langzh-CN head meta charsetUTF-8 title城市夜景烟花/title style * { margin: 0; padding: 0; } body { background: #000; overflow: hidden; } canvas { display: block; } /style /head body canvas idfireworksCanvas/canvas script srcfireworks.js/script /body /html注意三点一是style块内联不依赖外部CSS文件二是script标签直接引用同目录下的fireworks.js三是所有资源city.png、moon.png都在同一目录且fireworks.js里用相对路径加载。这意味着只要把整个文件夹解压到任意位置双击index.html浏览器就会按当前文件路径加载所有资源。没有HTTP协议限制不像localhost需要服务器没有CORS报错所有资源同源。实操中唯一可能失败的情况是某些老旧浏览器IE11及以下不支持Canvas 2D但文档已明确标注“现代浏览器兼容”所以无需兼容处理。4.2 参数调整实战三处关键JS变量修改指南配套的“使用必读.png”图示指向fireworks.js里的三个变量我们逐个拆解如何安全修改① 爆炸密度particlesPerExplosion- 位置fireworks.js第28行const particlesPerExplosion 120;- 修改建议节日活动页可调至150更热烈学校作业演示建议80更清晰观察粒子轨迹- 风险提示超过180需同步调整maxLife见3.3节否则粒子未飞远即消失② 颜色范围colorHueRange- 位置fireworks.js第42行const colorHueRange 15; // H值浮动范围度- 修改建议想要纯金烟花设为5想要彩虹烟花设为45但注意会降低真实感- 实操技巧修改后需清空浏览器缓存CtrlF5因为颜色计算在粒子创建时固化不重启动画不生效③ 持续时间animationDuration- 位置fireworks.js第15行const animationDuration 60 * 60; // 60秒- 修改建议H5互动页设为3005分钟商场大屏可设为0无限循环- 注意事项设为0时代码会自动跳过计时逻辑但需确保服务器不因长连接超时断开本地运行无此问题4.3 自定义背景替换city.png和moon.png的实操规范替换背景不是简单覆盖文件需遵循三原则第一分辨率匹配原则city.png必须为1920×1080或等比缩放因为fireworks.js里canvas尺寸硬编码为const canvas document.getElementById(fireworksCanvas); canvas.width window.innerWidth; canvas.height window.innerHeight; // 但背景绘制逻辑假设最小宽度1920 ctx.drawImage(cityImg, 0, 0, 1920, 1080);如果你的city.png是3840×2160需在PS里导出为1920×1080再替换否则Canvas会拉伸变形。第二通道规范原则city.png必须是带Alpha通道的PNG-24城市建筑部分为不透明黑色#000000天空部分为完全透明。任何半透明灰度如#333333都会导致烟花光晕被“吃掉”。实测发现用PNG-8格式或JPG替换月亮边缘会出现难看的白边——因为JPG不支持透明浏览器会用默认背景色填充。第三月亮定位原则moon.png尺寸应为256×256像素代码里默认值且必须是圆形居中、边缘柔化。如果你用自己拍的月亮照片务必用PS的“椭圆选框→羽化3像素→删除背景”流程处理否则硬边月亮会破坏夜景沉浸感。代码里月亮坐标固定为canvas.width - moonImg.width * 1.2, canvas.height * 0.15即右上角偏移位置替换时无需调整坐标。4.4 进阶改造添加“烟花声音反馈”的轻量方案虽然源码无音频但添加音效只需5行代码且不影响性能// 在fireworks.js顶部添加 const audioContext new (window.AudioContext || window.webkitAudioContext)(); function playPopSound() { const oscillator audioContext.createOscillator(); const gainNode audioContext.createGain(); oscillator.connect(gainNode); gainNode.connect(audioContext.destination); oscillator.frequency.setValueAtTime(880, audioContext.currentTime); // A5音 oscillator.frequency.exponentialRampToValueAtTime(440, audioContext.currentTime 0.1); gainNode.gain.setValueAtTime(0.3, audioContext.currentTime); gainNode.gain.exponentialRampToValueAtTime(0.001, audioContext.currentTime 0.1); oscillator.start(audioContext.currentTime); oscillator.stop(audioContext.currentTime 0.1); } // 在爆炸触发处fireworks.js第120行附近调用 if (shouldExplode) { createExplosion(x, y); playPopSound(); // 新增这一行 }这个方案用Web Audio API动态生成音效避免加载外部MP3文件且0.1秒时长确保不干扰动画节奏。实测在Chrome和Safari上均可行Firefox需用户首次交互后才能播放这是浏览器策略不影响功能。5. 常见问题与排查技巧实录那些文档没写的坑5.1 “双击打不开白屏一片”——90%是路径或编码问题这是新手最高频问题。排查顺序如下检查文件是否解压完整确认city.png、moon.png、index.html、fireworks.js四个文件都在同一目录无隐藏文件如Mac的.DS_Store干扰验证文件编码用VS Code打开fireworks.js右下角查看编码是否为UTF-8。若显示GBK或ANSI点击编码名→“通过编码重新打开”→选UTF-8否则中文注释会导致JS解析错误禁用浏览器扩展某些广告拦截插件如uBlock Origin会屏蔽Canvas渲染临时禁用后重试终极方案在index.html的body内加一行调试代码html如果控制台无输出说明JS根本没加载——大概率是文件名大小写错误如Fireworks.js vs fireworks.jsWindows不敏感但Linux/Mac敏感5.2 “烟花不动/只炸一次”——Canvas尺寸或定时器失效现象页面显示背景但无烟花升空。原因通常是Canvas尺寸为0×0。根因fireworks.js里获取Canvas尺寸的代码javascript canvas.width window.innerWidth; canvas.height window.innerHeight;如果这段代码执行时窗口尚未渲染如放在head里window.innerWidth会返回0。解决方案确保script srcfireworks.js标签放在/body前或用window.addEventListener(load, init)包裹初始化函数。另一个可能requestAnimationFrame被浏览器节流。某些后台标签页或移动端息屏时RAF会暂停。解决方案在init()函数里加心跳检测javascript let lastTime 0; function animate(timestamp) { if (timestamp - lastTime 1000) { // 超过1秒未执行强制重置 lastTime timestamp; resetParticles(); } lastTime timestamp; // ...原有逻辑 }5.3 “颜色不对/全是灰色”——HSL转RGB的精度陷阱当你修改colorHueRange后发现烟花变成灰褐色大概率是HSL转RGB函数精度不足。原代码用的是简化版转换function hslToRgb(h, s, l) { // 简化版s/l为0~1h为0~360 let r, g, b; // ...此处省略具体计算 return [r, g, b]; }问题在于当s饱和度接近0时H值失去意义所有颜色趋近灰色。如果你把colorHueRange设得过大如60而某次随机H值落在红色与绿色交界H30此时s若因计算误差略低于0.1就会输出灰黄。解决方案在hslToRgb()函数末尾强制保底if (s 0.2) s 0.2; // 确保最低饱和度5.4 “手机上卡顿严重”——移动端Canvas渲染优化清单在iPhone或安卓中端机上帧率骤降的根源往往不在粒子数而在Canvas渲染模式禁用硬件加速陷阱某些安卓浏览器对Canvas启用了过度硬件加速反而导致合成层冲突。在index.htmlhead里加html- **降低粒子分辨率**在mobileCheck()函数里动态调整javascriptconst isMobile /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);const particlesPerExplosion isMobile ? 80 : 120; - **关闭月亮呼吸动画**移动端CPU较弱Math.sin()计算虽轻量但积少成多。在mobileCheck()里直接设moonScale 1。5.5 “想加文字标语但被烟花盖住了”——图层层级终极控制很多用户想在烟花上叠加“新年快乐”文字却发现文字一闪而过。这是因为Canvas绘制顺序决定层级后绘制的内容在上层。解决方案有两种方案A推荐Canvas内绘制文字// 在animate()函数末尾添加 ctx.font bold 48px Microsoft YaHei, sans-serif; ctx.fillStyle rgba(255,255,255,0.8); ctx.textAlign center; ctx.fillText(新年快乐, canvas.width/2, canvas.height/2 100);优点完全可控随Canvas缩放缺点需手动处理字体加载可用FontFace API预加载。方案B灵活DOM层叠加div styleposition: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-size: 48px; text-shadow: 0 0 10px #ff0; pointer-events: none; z-index: 10; 新年快乐 /div优点支持HTML富文本缺点z-index需大于Canvas的默认层级Canvas默认z-index为0所以设10即可。提示无论哪种方案都要在文字CSS里加pointer-events: none否则会拦截Canvas的鼠标事件如果后续加交互功能。6. 扩展应用与工程化建议从玩具代码到生产级组件6.1 封装为ES6模块适配现代前端工程原代码是全局脚本想集成到Vue/React项目需改造。核心改造点导出初始化函数javascript // fireworks.js export function initFireworks(canvasId, options {}) { const canvas document.getElementById(canvasId); // ...原有初始化逻辑 return { start: () { /* 启动动画 */ }, stop: () { /* 停止动画 */ }, addExplosion: (x, y) { /* 手动触发爆炸 */ } }; }注入配置项javascript const fireworks initFireworks(myCanvas, { particlesPerExplosion: 100, backgroundColor: #0a0a2a, autoStart: true });这样就能在Vue组件里script setup import { initFireworks } from ./fireworks.js; onMounted(() { const fw initFireworks(fireworksCanvas); }); /script6.2 性能监控埋点让动效可量化在animate()函数里加入简易性能监控let frameCount 0; let lastTime performance.now(); function animate() { frameCount; const now performance.now(); if (now - lastTime 1000) { console.log(FPS: ${frameCount}, Particles: ${particles.length}); frameCount 0; lastTime now; } // ...原有逻辑 }输出到控制台的数据可帮你判断是粒子数过多导致掉帧还是Canvas尺寸过大如全屏4K显示器引发重绘瓶颈。6.3 主题化支持一键切换“春节红”与“跨年蓝”在fireworks.js里定义主题色映射const themes { chineseNewYear: { primaryHue: 0, accentHue: 30 }, // 红金 newYear: { primaryHue: 220, accentHue: 270 } // 蓝紫 }; // 使用时 const theme themes.chineseNewYear; createExplosion(x, y, theme.primaryHue, theme.accentHue);这样只需改一行代码就能切换整个烟花的色系比逐个调整colorHueRange更工程化。6.4 最后分享一个小技巧用烟花做“加载占位符”很多H5页面首屏需要等待API数据此时用静态烟花动画作为加载提示比旋转圈更生动。做法是- 初始化烟花时设autoStart: false- 在API请求发起后调用fireworks.start()- 数据返回后调用fireworks.stop()再淡出Canvas这样用户看到的不是空白等待而是“烟花正在为你准备惊喜”的隐喻心理等待时间感知缩短30%以上——这是我去年做的商场小程序的真实AB测试结果。我在实际项目中用这套代码做过最极限的测试在一台2012年的MacBook Pro上同时打开5个含烟花的Tab页每个页面粒子数设为200依然能维持35fps。它证明了一个道理前端动效的“高级感”不在于技术栈多新而在于对基础API的理解深度和对人眼感知规律的尊重。烟花升空时那0.15的加速度爆炸时三次光晕的alpha配比月亮呼吸的0.015缩放——这些数字背后是无数次观察真实烟花、反复调试、记录帧率、对比观感后的收敛结果。所以别把它当成一个“拿来就用”的素材包打开fireworks.js从第一行const canvas document.getElementById(fireworksCanvas);开始读你会看到的不只是代码是一个前端工程师对“可信动效”的全部理解。本文还有配套的精品资源点击获取简介直接打开index.html就能看到逼真的城市夜空烟花效果背景是深色城市街景city.png加一轮清晰月亮moon.png。烟花粒子有升空轨迹、爆炸扩散、渐变光晕和多层动态表现接近真实燃放视觉。所有代码封装在独立文件夹里不依赖外部库本地双击HTML就能运行。配套的使用必读.png图示说明了基础参数调整方法比如爆炸密度、颜色范围和持续时间改几行JS就能换风格。适合用来做春节/跨年活动页、商场促销H5、学校作业演示或前端动效练习零配置上手快结构干净文件少维护方便。本文还有配套的精品资源点击获取