【JS+H5+CSS实现烟花特效】
话不多说直接上代码
注意:背景图路径是picture/star.jpg,自己在同级目录先创键picture目录再下载一张图片命名为star.jpg
HTML:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Fireworks Animation</title><link rel="stylesheet" href="style.css" /></head><body><canvas id="fireworksCanvas"></canvas><script src="script.js"></script></body>
</html>
JS:
// 获取canvas元素const canvas = document.getElementById('fireworksCanvas');const ctx = canvas.getContext('2d');// 设置canvas宽度和高度为窗口宽度和高度canvas.width = window.innerWidth;canvas.height = window.innerHeight;let fireworks = [];// 创建烟花类class Firework {constructor() {this.x = Math.random() * canvas.width; // 随机生成烟花的起始x坐标this.y = canvas.height; // 烟花起始y坐标为画布底部this.radius = 2; // 烟花半径this.speed = 7; // 烟花上升速度this.color = 'white'; // 烟花颜色this.exploded = false; // 烟花是否已经爆炸this.particles = []; // 烟花爆炸后的粒子数组this.explosionHeight = Math.random() * (canvas.height * 0.4) + (canvas.height * 0.1); // 生成随机的爆炸高度this.initialAlpha = 1; // 初始透明度this.currentAlpha = this.initialAlpha; // 当前透明度}update() {if (!this.exploded) {this.y -= this.speed; // 烟花向上运动// 逐渐减少烟花的透明度this.currentAlpha -= 0.005;if (this.currentAlpha < 0) {this.currentAlpha = 0;}if (this.y <= this.explosionHeight) {this.explode();}} else {this.particles.forEach((particle, index) => {particle.update(); // 更新粒子的运动状态if (particle.alpha <= 0) {this.particles.splice(index, 1);}});}}draw() {ctx.beginPath(); // 开始绘制路径ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2); // 绘制一个以(x, y)为中心,半径为radius的圆ctx.fillStyle = this.color; // 设置填充颜色为烟花的颜色ctx.globalAlpha = this.currentAlpha; // 使用当前透明度ctx.fill(); // 填充圆ctx.closePath(); // 结束绘制路径if (this.exploded) {this.particles.forEach(particle => {particle.draw(); // 绘制每个粒子});}}explode() {this.exploded = true; // 设置烟花为已经爆炸状态for (let i = 0; i < 100; i++) {let particle = new Particle(this.x, this.y); // 创建一个新的粒子,位置为烟花的位置this.particles.push(particle); // 将新创建的粒子添加到烟花的粒子数组中}}}// 创建粒子类class Particle {constructor(x, y) { // 粒子类的构造函数,接收x和y坐标作为参数this.x = x; // 设置粒子的x坐标this.y = y; // 设置粒子的y坐标this.radius = 2; // 设置粒子的半径this.speedX = Math.random() * 5 - 2; // 随机生成粒子在x轴上的速度this.speedY = Math.random() * 5 - 2; // 随机生成粒子在y轴上的速度this.color = `hsl(${Math.random() * 360}, 100%, 50%)`; // 随机生成粒子的颜色this.alpha = 1.2; // 设置粒子的透明度为1.2this.fade = Math.random() * 0.02 + 0.01; // 随机生成粒子透明度的减少速度}update() { // 更新粒子的位置和透明度this.x += this.speedX; // 更新粒子的x坐标this.y += this.speedY; // 更新粒子的y坐标this.alpha -= this.fade; // 减少粒子的透明度}draw() { // 绘制粒子ctx.beginPath(); // 开始绘制路径ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2); // 绘制一个以(x, y)为中心,半径为radius的圆ctx.fillStyle = this.color; // 设置填充颜色为粒子的颜色ctx.globalAlpha = this.alpha; // 设置全局透明度为粒子的透明度ctx.fill(); // 填充圆ctx.closePath(); // 结束绘制路径}}function animate() { // 动画函数,更新画布内容并绘制烟花和粒子ctx.fillStyle = 'rgba(0, 0, 0, 0.1)'; // 设置画布背景颜色及透明度ctx.fillRect(0, 0, canvas.width, canvas.height); // 填充矩形覆盖画布fireworks.forEach((firework, index) => { // 遍历烟花数组firework.update(); // 更新烟花的位置和状态firework.draw(); // 绘制烟花及其粒子if (firework.exploded && firework.particles.length === 0) { // 如果烟花已经爆炸且没有粒子了fireworks.splice(index, 1); // 从烟花数组中移除该烟花}});requestAnimationFrame(animate); // 递归调用自身,实现连续动画效果}function init() { // 初始化函数setInterval(() => { // 每隔2秒执行一次let firework = new Firework(); // 创建一个新的烟花对象fireworks.push(firework); // 将新创建的烟花对象添加到烟花数组中}, 100);//每次循环的时间不能太长animate(); // 调用动画函数开始动画}init();
CSS:
body {margin: 0;padding: 0;overflow: hidden;background: url('picture/star.jpg') no-repeat center center fixed;background-size: cover;
}
canvas {display: block;margin: auto;position: absolute;top: 0;left: 0;right: 0;bottom: 0;opacity: 0.5; /* 设置画布的透明度为0.5 */
}
代码可以直接用。设计思路如下:
1.设计了烟花类,粒子类
2.烟花从上升开始,直到爆炸,爆炸点创建100个粒子对象,粒子用来模拟烟花爆炸后散开的状态
3.烟花和粒子分别拥有初始透明度,经过随机的透明度衰减,达到完全透明,来模拟烟花和粒子的消失
相关文章:
【JS+H5+CSS实现烟花特效】
话不多说直接上代码 注意:背景图路径是picture/star.jpg,自己在同级目录先创键picture目录再下载一张图片命名为star.jpg HTML: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vi…...
uniapp小程序使用webview 嵌套 vue 项目
uniapp小程序使用webview 嵌套 vue 项目 小程序中发送 <web-view :src"urlSrc" message"handleMessage"></web-view>export default {data() {return {urlSrc: "",};},onLoad(options) {// 我需要的参数比较多 所以比较臃肿// 获取…...
命令模式在金融业务中的应用及其框架实现
引言 命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,并且支持请求的排队和撤销操作。在金融业务中,命令模式可以用于实现交易请求、撤销操作等功能。本文将介绍命令模式在金融业务中的使用,并探讨…...
WordPress的性能优化有哪些方法?
WordPress的性能优化方法主要包括以下几个方面: 1. 使用缓存插件:缓存插件可以降低服务器负载,提高网站加载速度。常用的缓存插件有WP Rocket、WP Fastest Cache和Cache Enabler等。 2. 代码压缩和整合:通过压缩JavaScript、CSS…...
【Python基础】代码如何打包成exe可执行文件
本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢! 文章目录 一、前言二、安装PyInstaller三、使用PyInstaller打包四、验证打包是否成功五、总结 一、前言 本文介绍如何…...
Golang | Leetcode Golang题解之第227题基本计算器II
题目: 题解: func calculate(s string) (ans int) {stack : []int{}preSign : num : 0for i, ch : range s {isDigit : 0 < ch && ch < 9if isDigit {num num*10 int(ch-0)}if !isDigit && ch ! || i len(s)-1 {switch preS…...
云端美味:iCloud中食谱与餐饮计划的智能存储方案
云端美味:iCloud中食谱与餐饮计划的智能存储方案 在数字化生活管理中,我们的食谱和餐饮计划是日常饮食健康与乐趣的重要部分。iCloud提供了一个无缝的解决方案,让我们可以在所有设备上存储、同步和访问这些珍贵的信息。本文将详细介绍如何在…...
leetcode:1332. 删除回文子序列(python3解法)
难度:简单 给你一个字符串 s,它仅由字母 a 和 b 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。 返回删除给定字符串中所有字符(字符串为空)的最小删除次数。 「子序列」定义:如果一个字符串可以通过删除原字…...
智慧交通的神经中枢:Transformer模型在智能交通系统中的应用
智慧交通的神经中枢:Transformer模型在智能交通系统中的应用 随着城市化进程的加快,交通拥堵、事故频发、环境污染等问题日益严重。智能交通系统(ITS)作为解决这些问题的关键技术之一,受到了广泛关注。Transformer模型…...
PCIe驱动开发(1)— 开发环境搭建
PCIe驱动开发(1)— 开发环境搭建 一、前言 二、Ubuntu安装 参考: VMware下Ubuntu18.04虚拟机的安装 三、QEMU安装 参考文章:QEMU搭建X86_64 Ubuntu虚拟系统环境 四、安装Ubuntu 下载地址:https://old-releases.ubuntu.com…...
YOLOv10改进 | Conv篇 | CVPR2024最新DynamicConv替换下采样(解决低FLOPs陷阱)
一、本文介绍 本文给大家带来的改进机制是CVPR2024的最新改进机制DynamicConv其是CVPR2024的最新改进机制,这个论文中介绍了一个名为ParameterNet的新型设计原则,它旨在在大规模视觉预训练模型中增加参数数量,同时尽量不增加浮点运算&#x…...
变革设计领域:Transformer模型在智能辅助设计中的革命性应用
变革设计领域:Transformer模型在智能辅助设计中的革命性应用 在人工智能技术的推动下,智能辅助设计(Intelligent Assisted Design, IAD)正逐渐成为现实。Transformer模型,以其卓越的处理序列数据的能力,为…...
Spring——配置说明
1. 别名 别名:如果添加了别名,也可以使用别名获取这个对象 <alias name"user" alias"user2"/> 2. Bean的配置 id:bean 的唯一标识符,也就是相当于我们学的对象名class:bean 对象所对应的…...
禁用华为小米?微软中国免费送iPhone15
微软中国将禁用华为和小米手机,要求员工必须使用iPhone。如果还没有iPhone,公司直接免费送你全新的iPhone 15! 、 这几天在微软热度最高的话题就是这个免费发iPhone,很多员工,收到公司的通知。因为,登录公司…...
nginx初理解
没有ngix时,有两台服务器,供访问 1. 现在有两台服务器上同样的路径下都放了一个, 都能通过ip加端口访问到页面 后端项目 (查看tomcat中的配置中的 server.xml,能找到项目路径) tomacat 也都有 两个…...
FreeCAD源码分析:属性系统
按照面向对象设计(Object-Oriented Design, OOD)的信条,OOD大体上包括两方面的内涵:一方面,需要将业务数据抽象成(树状/层状)数据对象,这就是所谓的数据对象模型(Data Object Model);另一方面就是职责的分摊与聚合&…...
C++入门 模仿mysql控制台输出表格
一、 说明 控制台输出表格,自适应宽度 二、 源码 #include <iostream> #include <map> #include <string> #include <vector>using namespace std;void printTable(vector<vector<string>> *pTableData) {int row pTableDa…...
SpringBoot新手快速入门系列教程五:基于JPA的一个Mysql简单读写例子
现在我们来做一个简单的读写Mysql的项目 1,先新建一个项目,我们叫它“HelloJPA”并且添加依赖 2,引入以下依赖: Spring Boot DevTools (可选,但推荐,用于开发时热部署)Lombok(可选,…...
开源大势所趋
一、开源项目的发展趋势 技术栈多样化与专业化:随着技术的不断进步,开源项目涵盖了从云计算、大数据、人工智能到区块链、物联网等各个领域,技术栈日益丰富和专业化。这种趋势使得开发者能够根据自己的需求选择最适合的技术工具,促…...
智能无人机飞行控制系统:基于STM32的设计与实现(内附资料)
摘要 智能无人机的飞行控制系统是确保无人机安全、高效运行的核心。本文将探讨基于STM32微控制器的智能无人机飞行控制系统的设计与实现,包括系统架构、关键组件选择、控制算法开发以及代码实现。 1. 引言 智能无人机在军事侦察、物流配送、环境监测等多个领域展…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
