❤️创意网页:HTML5 Canvas技术实现绚丽多彩的烟花特效

博主:命运之光 

🌸专栏:Python星辰秘典

🐳专栏:web开发(简单好用又好看)

❤️专栏:Java经典程序设计

☀️博主的其他文章:点击进入博主的主页

前言:欢迎踏入我的Web项目专栏,一段神奇而令人陶醉的数字世界!

🌌在这里,我将带您穿越时空,揭开属于Web的奥秘。通过HTML、CSS和JavaScript的魔力,我创造了一系列令人惊叹的Web项目,它们仿佛是从梦境中涌现而出。

🌌在这个专栏中,您将遇到华丽的界面,如流星划过夜空般迷人;您将感受到动态的交互,如魔法般让您沉浸其中;您将探索响应式设计的玄妙,让您的屏幕变幻出不同的绚丽景象。

🌌无论您是一个探险家还是一位嗜血的代码巫师,这个专栏将成为您的魔法书。我将分享每个项目的秘密,解开编码的谜题,让您也能够拥有制作奇迹的力量。

🌌准备好了吗?拿起您的键盘,跟随我的指引,一起进入这个神秘而充满惊喜的数字王国。在这里,您将找到灵感的源泉,为自己创造出一段奇幻的Web之旅!

目录

引言

动态图展示

静态图展示

图1

图2 

准备工作

代码解析

HTML结构

JavaScript代码

项目完整代码

代码的使用方法(超简单什么都不用下载)

🍓1.打开记事本 

🍓2.将上面的源代码复制粘贴到记事本里面将文件另存为HTML文件点击保存即可

🍓3.打开html文件(大功告成(●'◡'●))

结语


引言

烟花特效一直以来都是网页设计中的热门元素之一,它能够为用户带来视觉上的愉悦和惊喜。在这篇技术博客中,我们将使用HTML5 Canvas和JavaScript来实现一个绚丽多彩的烟花特效。我们将逐步解释代码的不同部分,介绍如何利用Canvas API和动画效果来创造这个引人注目的效果。


动态图展示

 


静态图展示

图1

图2 


准备工作

在开始之前,我们需要了解一些基本知识。Canvas是HTML5新增的一个2D绘图API,它允许我们通过JavaScript来绘制图形、动画和特效。在本次实现中,我们将使用Canvas来生成烟花爆炸的效果,并通过动画来让烟花绽放在屏幕上。


代码解析

我们将按照代码的结构来逐步解析烟花特效的实现。

HTML结构

首先,我们在HTML文件中添加了一个<canvas>元素,用于在其中绘制烟花。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Fireworks Effect</title><style>body {margin: 0;overflow: hidden;background-color: black;}canvas {display: block;}</style>
</head>
<body><canvas id="fireworksCanvas"></canvas><!-- JavaScript代码将在这里插入 -->
</body>
</html>

JavaScript代码

接下来,让我们来看一下JavaScript部分的代码。

首先,我们创建一个Particle类,用于表示烟花爆炸后的每个粒子效果。每个粒子的位置、颜色、速度和透明度都是随机生成的,以达到多样化的效果。

接着,我们创建了Firework类,用于表示完整的烟花效果。每个烟花爆炸时,会产生多个粒子效果。

animate函数中,我们通过调用requestAnimationFrame来实现动画效果,每帧都会更新画布和粒子的状态,并进行绘制。

最后,在setInterval函数中,我们定时触发烟花的生成,以便让烟花不断地绽放在画布上。

const canvas = document.getElementById('fireworksCanvas');
const ctx = canvas.getContext('2d');
let fireworks = [];canvas.width = window.innerWidth;
canvas.height = window.innerHeight;window.addEventListener('resize', () => {canvas.width = window.innerWidth;canvas.height = window.innerHeight;
});class Particle {constructor(x, y, color, velocityX, velocityY) {this.x = x;this.y = y;this.color = color;this.velocityX = velocityX;this.velocityY = velocityY;this.radius = 2.5;this.opacity = 1;}update() {this.x += this.velocityX;this.y += this.velocityY;this.velocityY += 0.1;this.opacity -= 0.01;}draw(ctx) {ctx.beginPath();ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);ctx.fillStyle = this.color;ctx.globalAlpha = this.opacity;ctx.shadowBlur = 10;ctx.shadowColor = this.color;ctx.fill();}
}class Firework {constructor(x, y) {this.x = x;this.y = canvas.height; // 从画布底部发射this.particles = [];this.velocityY = -10; // 初始向上速度for (let i = 0; i < 50; i++) {const color = `hsl(${Math.random() * 360}, 100%, 50%)`;const velocityX = (Math.random() - 0.5) * 6;this.particles.push(new Particle(x, y, color, velocityX, this.velocityY));}}update() {this.particles.forEach(particle => particle.update());}draw(ctx) {this.particles.forEach(particle => particle.draw(ctx));}
}function animate() {ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';ctx.fillRect(0, 0, canvas.width, canvas.height);fireworks.forEach((firework, index) => {if (firework.particles[0].opacity <= 0) {fireworks.splice(index, 1);} else {firework.update();firework.draw(ctx);}});requestAnimationFrame(animate);
}// 定时触发烟花效果
setInterval(() => {for (let i = 0; i < 25; i++) {const x = Math.random() * canvas.width;const y = Math.random() * (canvas.height / 2) + canvas.height / 2;fireworks.push(new Firework(x, y));}
}, 2000); // 每2秒触发一次烟花效果// 启动动画
animate();

项目完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Fireworks Effect</title><style>body {margin: 0;overflow: hidden;background-color: black;}canvas {display: block;}</style>
</head>
<body><canvas id="fireworksCanvas"></canvas><script>const canvas = document.getElementById('fireworksCanvas');const ctx = canvas.getContext('2d');let fireworks = [];// 设置画布大小canvas.width = window.innerWidth;canvas.height = window.innerHeight;// 监听窗口大小变化window.addEventListener('resize', () => {canvas.width = window.innerWidth;canvas.height = window.innerHeight;});class Particle {constructor(x, y, color, velocityX, velocityY) {this.x = x;this.y = y;this.color = color;this.velocityX = velocityX;this.velocityY = velocityY;this.radius = 2.5;this.opacity = 1;}update() {this.x += this.velocityX;this.y += this.velocityY;this.velocityY += 0.1;this.opacity -= 0.01;}draw(ctx) {ctx.beginPath();ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);ctx.fillStyle = this.color;ctx.globalAlpha = this.opacity;ctx.shadowBlur = 10;ctx.shadowColor = this.color;ctx.fill();}}class Firework {constructor(x, y) {this.x = x;this.y = canvas.height; // Set the starting position at the bottom of the canvasthis.particles = [];this.velocityY = -10; // Initial upward velocityfor (let i = 0; i < 50; i++) {const color = `hsl(${Math.random() * 360}, 100%, 50%)`;const velocityX = (Math.random() - 0.5) * 6;this.particles.push(new Particle(x, y, color, velocityX, this.velocityY));}}update() {this.particles.forEach(particle => particle.update());}draw(ctx) {this.particles.forEach(particle => particle.draw(ctx));}}function animate() {ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';ctx.fillRect(0, 0, canvas.width, canvas.height);fireworks.forEach((firework, index) => {if (firework.particles[0].opacity <= 0) {fireworks.splice(index, 1);} else {firework.update();firework.draw(ctx);}});requestAnimationFrame(animate);}// 自动触发烟花效果setInterval(() => {for (let i = 0; i < 25; i++) {const x = Math.random() * canvas.width;const y = Math.random() * (canvas.height / 2) + canvas.height / 2;fireworks.push(new Firework(x, y));}}, 2000); // Fireworks will be triggered every 2 seconds// 启动动画animate();</script>
</body>
</html>

代码的使用方法(超简单什么都不用下载)

🍓1.打开记事本 

🍓2.将上面的源代码复制粘贴到记事本里面将文件另存为HTML文件点击保存即可

🍓3.打开html文件(大功告成(●'◡'●))


结语

通过使用HTML5 Canvas和JavaScript,我们成功地实现了一个绚丽多彩的烟花特效。这个特效通过粒子的动态绘制,让烟花在画布上绽放。通过定时触发烟花效果,我们让整个页面充满了生动和活力。


本章的内容就到这里了,觉得对你有帮助的话就支持一下博主把~

🌌点击下方个人名片,交流会更方便哦~
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java】【基础2】程序流程控制

目录 一、最经典的三种执行顺序 二、分支结构 2.1 if 2.2 switch 2.3 if与switch区别 三、循环结构 3.1 for循环 3.2 while循环 3.3 do-while循环 3.4 三种循环区别 3.5 补充知识&#xff1a;死循环 3.6 补充知识&#xff1a;循环嵌套 四、跳转关键字&#xff1a;br…

Mysql如何查询出两个日期之间的所有日期?

问题&#xff1a; 有时我们在生成一些时间轴类似的数据时&#xff0c;要求数据库不管有没有指定天的数据&#xff0c;都要生成该时间节点&#xff0c;可用mysql.help_topic来解决此类问题&#xff0c;通过序列和日期函数相结合来满足我们的业务需求。 例如&#xff1a;查询20…

spring启动一下就停止了

spring启动一下就停止了。 这个问题比较简单&#xff0c;百度了下&#xff0c;还是有些人问&#xff0c;记录下吧。 是因为没有引入spring-boot-starter-web包&#xff0c;或者该包没有生效。 有时spring-boot-starter-parent版本不对&#xff0c;就可能没生效&#xff0c;写明…

LeetCode | C++ 动态规划——123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV

目录 123.买卖股票的最佳时机III188.买卖股票的最佳时机IV 123.买卖股票的最佳时机III 123题目链接 根据题意&#xff1a;最多可以完成 两笔 交易&#xff0c;即可以买卖股票一次&#xff0c;可以买卖两次&#xff0c;也可以不买卖 dp数组定义&#xff1a; 此时 一天就有五个…

Web开发的富文本编辑器CKEditor介绍,Django有库ckeditor_uploader对它进行支持,django-ckeditor安装方法及使用注意事项

当需要在网页应用程序中提供富文本编辑功能时&#xff0c;CKEditor是一个流行的选择。CKEditor是一个开源的JavaScript富文本编辑器&#xff0c;它提供了强大的功能和用户友好的界面&#xff0c;使用户可以轻松创建和编辑格式化的文本内容。 以下是CKEditor的一些主要特性&…

kakfa 2.4.1 java的生产者client在发送消息前分配消息属于哪个分区源码

标题是否不是很熟悉&#xff0c;面试不得必问啊 KafkaProducer 1、客户端暴露出来可以让开发人员调用的发送消息的方法send2、send实际调用私有方法doSend获取集群信息(并且得到这条数据写哪个分区)2.1获取kafka服务端集群某个topic的元数据方法waitOnMetadata2.2根据消息是否指…

rabbitMQ杂记

消息队列应用场景 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量 削锋等问题实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性&#xff1a; 解耦&#xff1a; 异步&#xff1a; 削峰&#xff1a; 常…

再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!

在最近发布的Spring 6.1 M2版本中&#xff0c;推出了一个全新的同步HTTP客户端&#xff1a;RestClient。用一句话来让Spring开发者认识RestClient的话&#xff1a;像WebClient一样具备流畅API的RestTemplate。 所以&#xff0c;RestClient的使命就是淘汰已经有14年历史的RestTe…

实习经历总结

写在前面&#xff1a; 临毕业前突发奇想打算找实习&#xff0c;由于准备不是很充分加上没有经验&#xff0c;海投了一些岗位&#xff0c;方向主要是测试开发&#xff0c;base主要是北京&天津。 一些公司的面试&#xff1a; 当时投了很多大厂&#xff0c;美团&#xff0c…

elasticsearch高级功能之跨集群复制CCR

CCR的作用(Cross-Cluster Replication&#xff0c;跨集群复制)常用的场景如何使用工作原理源码分析 CCR的作用(Cross-Cluster Replication&#xff0c;跨集群复制) CCR功能允许用户在不同的Elasticsearch集群之间同步索引数据。这对于实现跨集群复制、数据备份、灾难恢复和多数…

3.12 Bootstrap 超大屏幕(Jumbotron)

文章目录 Bootstrap 超大屏幕&#xff08;Jumbotron&#xff09; Bootstrap 超大屏幕&#xff08;Jumbotron&#xff09; 下面将讲解 Bootstrap 支持的另一个特性&#xff0c;超大屏幕&#xff08;Jumbotron&#xff09;。顾名思义该组件可以增加标题的大小&#xff0c;并为登陆…

详解Windows安装分布式版本控制系统git

文章目录 前言下载安装相关链接 前言 git是一个分布式版本控制软件&#xff0c;最初由Linux创作者Linus Torvalds创作&#xff0c;并于2015年以GPL许可协议发布。git易于学习&#xff0c;占用空间小&#xff0c;性能却快如闪电&#xff0c;可以快速、 高效的管理从小到大的项目…

uniapp-轮播图swiper根据内容图片高度自适应,解决获取图片高度不准确的问题

需求&#xff1a;轮播图swiper根据内容图片高度自适应 但是通过uniapp uni.createSelectorQuery的方法获取图片高度不正确&#xff0c;比如图片是100&#xff0c;获取是200&#xff0c;this.$nextTick也不能解决&#xff0c;setTimeout到是能解决&#xff0c;但是不稳定&#…

DeFi新篇章 | Sui上原生订单簿DeepBook正式上线

随着原生去中心化中央限价订单簿&#xff08; Central Limit Order Book&#xff0c;CLOB&#xff09;DeepBook的推出&#xff0c;Sui上的DeFi开启了新篇章。DeepBook由一群Sui贡献者共同构建&#xff0c;为新一代DeFi应用提供了一个稳定的流动性层。 通过DeepBook&#xff0c…

Kubernetes在数字化转型中的作用

Kubernetes在数字化转型中的作用 数字化转型是指在现代化社会中&#xff0c;利用数字技术来改变企业、组织或个人的业务模式、流程和价值创造方式的过程。这包括使用数字技术来提高效率、创新产品或服务、优化客户体验和开发新的业务模式等方面。数字化转型是一个全球性的趋势…

mac批量修改文件名为不同名字

mac批量修改文件名为不同名字怎么弄&#xff1f;很多小伙伴通过私信向我求助&#xff0c;用什么方法可以在mac电脑上批量修改文件名称&#xff0c;将大量文件修改成不同的名称。这可能是一项比较麻烦的操作&#xff0c;在电脑上进行过批量重命名的小伙伴都知道&#xff0c;一般…

Redis源码篇 - Reactor设计模式 和 Redis Reactor设计模式

Reactor &#xff1a;反应器模式或者应答者模式&#xff0c;它是一种基于事件驱动的设计模式。拥有一个或者多个输入源&#xff0c;通过反应器分发给多个worker线程处理&#xff0c;实现并发场景下事件处理。 此图网上找的&#xff0c;画的很好&#xff1a;

【Javascript】根据表达式(可字符串)过滤数组

正在实现一个基于后台低代码配置的应用&#xff0c;记录一下字符串表达式在项目用的转换与使用。以下是使用表达式过滤数据的实践代码: 表达式如下 item.readFlag1封装使用函数 /*** 获取表格数据* param array 被过滤的数组 * param expression 表达式*/ function filterAr…

C# 抽象类和接口详解

参考视频链接&#xff1a;https://www.bilibili.com/video/BV13b411b7Ht?p27&vd_source10065785c7e10360d831474364e0d3e3 代码的进化与重构&#xff0c;从基本代码的讲解到逐步抽象成抽象类和接口。 文章目录 最初定义利用继承改进对方法进一步改进利用虚函数进行改进利…

如何设计光场2.0(聚焦型光场相机)系统参数

1. 系统参数设计 目前的硬件系统的现状&#xff1a;主透镜50mm&#xff0c;MLA&#xff1a;15*15&#xff0c;d0.5mm&#xff0c;f15mm&#xff0c;s4.8um 开普勒型光场系统&#xff1a; 首先我们需要确定系统的M&#xff0c;M参数表示单个位置的点能被多少个小微透镜成像&am…