用 HTML 实现新春烟花的详细笔记

server/2025/3/6 6:30:27/

新年的钟声即将敲响,绚丽的烟花在夜空中绽放,将节日氛围拉满。想不想把这美好的一幕搬到你的网页上,下面跟着小编用 HTML 和 JavaScript 打造出专属的新春烟花特效吧,制造属于IT的浪漫吧!朋友们

图片

一、准备舞台:搭建 HTML 基础框架

就像举办一场烟花秀需要一个空旷的场地,我们的新春烟花特效也需要一个 “舞台”,这就是 HTML 页面。先看下面这段代码,它就是我们搭建的 “舞台” 基础:

html"><!DOCTYPE html><html lang="zh-CN"><head>&#x20;<meta charset="UTF-8">&#x20;<meta name="viewport" content="width=device-width, initial-scale=1.0">&#x20;<title>新春烟花🎆</title>&#x20;<style>&#x20;   body {&#x20;     margin: 0;&#x20;     overflow: hidden;&#x20;     background: #000;&#x20;   }&#x20;   canvas {&#x20;     display: block;&#x20;   }&#x20; </style></head><body><canvas id="fireworksCanvas"></canvas><script>&#x20; // 这里开始写JavaScript代码</script></body></html>

HTML 基本结构<!DOCTYPE html>声明这是一个 HTML5 文档。<html lang="zh-CN">表示文档语言是中文,就像告诉浏览器 “我们要说中文啦”。

页面头部设置<head>标签里的内容是对页面的一些设置。<meta charset="UTF-8">确保页面能正确显示中文字符,不然可能会出现乱码。<meta name="viewport" content="width=device-width, initial-scale=1.0">让页面能适配不同尺寸的屏幕,不管是电脑、平板还是手机,都能完美展示。<title>新春烟花🎆</title>给页面取了个名字,当你把页面最小化,在任务栏看到的就是这个标题。

页面样式设置<style>标签里设置了页面的样式。body部分,margin: 0;去掉了页面默认的边距,让页面更紧凑;overflow: hidden;隐藏了页面的滚动条,因为我们的烟花秀不需要滚动条来打扰;background: #000;把背景设置成黑色,就像夜晚的天空,这样烟花会更醒目。canvas部分,display: block;<canvas>元素以块级元素显示,为后面绘制烟花做好准备。

搭建画布<body>标签里的<canvas id="fireworksCanvas"></canvas>创建了一个画布,idfireworksCanvas,这就像是我们画画用的白纸,之后的烟花都会在这个画布上绘制。<script>标签是我们放 JavaScript 代码的地方,这里先空着,等下再 “大展身手”。

二、注入灵魂:编写 JavaScript 代码

HTML 搭建好舞台后,接下来就要用 JavaScript 给这个舞台注入灵魂,让烟花在上面绽放。

1. 获取画布并设置尺寸

html">const canvas = document.getElementById("fireworksCanvas");const ctx = canvas.getContext("2d");canvas.width = window.innerWidth;canvas.height = window.innerHeight;

这几行代码就像找到了我们刚刚搭建的画布,并根据浏览器窗口的大小调整画布的尺寸,这样不管窗口怎么变化,烟花都能完美铺满整个屏幕。document.getElementById("fireworksCanvas")通过id找到了<canvas>元素,canvas.getContext("2d")获取了二维绘图上下文,就像是拿到了一支画笔,准备在画布上作画。canvas.widthcanvas.height设置了画布的宽和高,让画布和浏览器窗口一样大。

2. 定义烟花类

html">class Firework {&#x20; constructor(x, y, color, velocity, size) {&#x20;   this.x = x;&#x20;   this.y = y;&#x20;   this.color = color;&#x20;   this.velocity = velocity;&#x20;   this.size = size;&#x20;   this.opacity = 1;&#x20; }&#x20; draw() {&#x20;   ctx.save();&#x20;   ctx.globalAlpha = this.opacity;&#x20;   ctx.beginPath();&#x20;   ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);&#x20;   ctx.fillStyle = this.color;&#x20;   ctx.fill();&#x20;   ctx.restore();&#x20; }&#x20; update() {&#x20;   this.x += this.velocity.x;&#x20;   this.y += this.velocity.y;&#x20;   this.velocity.y += gravity;&#x20;   this.opacity -= 0.01;&#x20; }}

Firework类就像是烟花的 “制造工厂”,每个烟花都由这个类创建。constructor是构造函数,就像工厂的生产线,创建烟花时会设置烟花的初始位置(x, y)、颜色color、速度velocity、大小size和透明度opacitydraw方法是烟花的 “绘制蓝图”,它告诉计算机怎么在画布上画出烟花,通过设置透明度、绘制圆形并填充颜色来实现。update方法则是烟花的 “运动指南”,它让烟花按照一定的速度和重力移动,并且随着时间推移逐渐变淡。

3. 创建烟花

html">function createFirework(x, y) {&#x20; const colors = ["#FF5733", "#FFBD33", "#33FF57", "#33D4FF", "#AF33FF", "#FF33A6"];&#x20; const particles = [];&#x20; const particleCount = 100;&#x20; for (let i = 0; i < particleCount; i++) {&#x20;   constangle = Math.random() * Math.PI * 2;&#x20;   constspeed = Math.random() * 4 + 2;&#x20;   constvelocity = {x:Math.cos(angle) * speed, y:Math.sin(angle) * speed };&#x20;   constsize = Math.random() * 2 + 1;&#x20;   constcolor = colors[Math.floor(Math.random() * colors.length)];&#x20;   particles.push(newFirework(x, y, color, velocity, size));&#x20; }&#x20; fireworks.push(...particles);}

createFirework函数就像是烟花的 “发射按钮”,它会在指定位置(x, y)创建一个烟花。这里定义了一个颜色数组colors,里面存放了各种绚丽的颜色,就像一个颜料盒。通过循环particleCount次,每次随机生成角度、速度、大小和颜色,创建出不同的烟花粒子,最后把这些粒子组成一个烟花并添加到fireworks数组里。

4. 绘制文字

html">function drawMessage() {&#x20; if (message && messageOpacity > 0) {&#x20;   ctx.save();&#x20;   ctx.globalAlpha = messageOpacity;&#x20;   ctx.fillStyle = "gold";&#x20;   ctx.font = "bold 48px 微软雅黑, SimHei, Arial, sans-serif";&#x20;   ctx.textAlign = "center";&#x20;   // 将文字放到画布的正中央&#x20;   ctx.fillText(message, canvas.width / 2, canvas.height / 2);&#x20;   ctx.restore();&#x20; }}

drawMessage函数就像是在烟花秀现场挂了一个横幅,它会在画布上绘制文字。当message存在且文字透明度messageOpacity大于 0 时,设置文字的颜色、字体、对齐方式,然后把文字绘制在画布的正中央。

5. 动画循环

html">function animate() {&#x20; ctx.fillStyle = "rgba(0, 0, 0, 0.2)";&#x20; ctx.fillRect(0, 0, canvas.width, canvas.height);&#x20; fireworks.forEach((firework, index) => {&#x20;   if (firework.opacity <= 0) {&#x20;     fireworks.splice(index, 1);&#x20;   } else {&#x20;     firework.update();&#x20;     firework.draw();&#x20;   }&#x20; });&#x20; drawMessage();&#x20; if (messageOpacity > 0) {&#x20;   messageOpacity -= 0.01; // 文字逐渐淡出&#x20; }&#x20; requestAnimationFrame(animate);}

animate函数是整个烟花秀的 “总指挥”,它会不断地重复执行,让烟花持续绽放。首先,用一个半透明的黑色矩形覆盖画布,就像清理舞台,准备下一次表演。然后遍历fireworks数组,对每个烟花进行更新和绘制,如果烟花的透明度小于等于 0,就把它从数组中移除。接着调用drawMessage函数绘制文字,并且让文字的透明度逐渐降低,实现文字淡出效果。最后,通过requestAnimationFrame(animate)请求浏览器在下一次重绘之前调用animate函数,形成动画循环。

6. 触发烟花和文字显示

html">// 初始加载时,立即触发一次烟花效果和文字显示const initialFirework = () => {&#x20; const x = Math.random() * canvas.width;&#x20; const y = Math.random() * canvas.height;&#x20; createFirework(x, y);&#x20; // 显示“新春快乐”&#x20; message = "IT小本本   祝  大家新春快乐!";&#x20; messageOpacity = 1; // 重置文字透明度&#x20; messageTimer = 0; // 重置计时器}// 页面加载时,立即执行一次效果initialFirework();// 每隔1秒触发一次烟花效果和文字显示setInterval(() => {&#x20; const x = Math.random() * canvas.width;&#x20; const y = Math.random() * canvas.height;&#x20; createFirework(x, y);&#x20; // 显示“新春快乐”&#x20; message = "IT小本本   祝  大家新春快乐!";&#x20; messageOpacity = 1; // 重置文字透明度&#x20; messageTimer = 0; // 重置计时器}, 10); // 每秒执行一次window.addEventListener("resize", () => {&#x20; canvas.width = window.innerWidth;&#x20; canvas.height = window.innerHeight;});animate();

这部分代码就像是烟花秀的 “开场哨” 和 “定时炸弹”。initialFirework函数在页面初始加载时被调用,随机在画布上的某个位置创建一个烟花,并显示 “ 祝 大家新春快乐!” 的文字。setInterval函数就像一个定时闹钟,每隔 1 秒(这里设置为 10 毫秒,实际测试中可根据需要调整,可能设置 1000 毫秒即 1 秒效果更好)就会触发一次,随机创建一个烟花并显示文字。window.addEventListener("resize", () => {... })监听窗口大小变化,当窗口大小改变时,重新设置画布的尺寸,保证烟花始终能完美显示。最后调用animate函数,运行烟花秀。

还没学会的同学,复制下面代码,然后保存为.html文件,浏览器打开就可以看到效果了!!

完整详细代码

html"><!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"></style><title>新春烟花🎆</title><style>body {margin: 0;overflow: hidden;background: #000;}canvas {display: block;}</style>
</head>
<body>
<canvas id="fireworksCanvas"></canvas><script>const canvas = document.getElementById("fireworksCanvas");const ctx = canvas.getContext("2d");canvas.width = window.innerWidth;canvas.height = window.innerHeight;const fireworks = [];const gravity = 0.05;let message = null; // 当前文字信息let messageOpacity = 0; // 文字透明度let messageTimer = 0; // 文字显示计时器class Firework {constructor(x, y, color, velocity, size) {this.x = x;this.y = y;this.color = color;this.velocity = velocity;this.size = size;this.opacity = 1;}draw() {ctx.save();ctx.globalAlpha = this.opacity;ctx.beginPath();ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);ctx.fillStyle = this.color;ctx.fill();ctx.restore();}update() {this.x += this.velocity.x;this.y += this.velocity.y;this.velocity.y += gravity;this.opacity -= 0.01;}}function createFirework(x, y) {const colors = ["#FF5733", "#FFBD33", "#33FF57", "#33D4FF", "#AF33FF", "#FF33A6"];const particles = [];const particleCount = 100;for (let i = 0; i < particleCount; i++) {const angle = Math.random() * Math.PI * 2;const speed = Math.random() * 4 + 2;const velocity = { x: Math.cos(angle) * speed, y: Math.sin(angle) * speed };const size = Math.random() * 2 + 1;const color = colors[Math.floor(Math.random() * colors.length)];particles.push(new Firework(x, y, color, velocity, size));}fireworks.push(...particles);}function drawMessage() {if (message && messageOpacity > 0) {ctx.save();ctx.globalAlpha = messageOpacity;ctx.fillStyle = "gold";ctx.font = "bold 48px 微软雅黑, SimHei, Arial, sans-serif";ctx.textAlign = "center";// 将文字放到画布的正中央ctx.fillText(message, canvas.width / 2, canvas.height / 2);ctx.restore();}}function animate() {ctx.fillStyle = "rgba(0, 0, 0, 0.2)";ctx.fillRect(0, 0, canvas.width, canvas.height);fireworks.forEach((firework, index) => {if (firework.opacity <= 0) {fireworks.splice(index, 1);} else {firework.update();firework.draw();}});drawMessage();if (messageOpacity > 0) {messageOpacity -= 0.01; // 文字逐渐淡出}requestAnimationFrame(animate);}// 初始加载时,立即触发一次烟花效果和文字显示const initialFirework = () => {const x = Math.random() * canvas.width;const y = Math.random() * canvas.height;createFirework(x, y);// 显示“新春快乐”message = "IT小本本   祝  大家新春快乐!";messageOpacity = 1; // 重置文字透明度messageTimer = 0; // 重置计时器}// 页面加载时,立即执行一次效果initialFirework();// 每隔1秒触发一次烟花效果和文字显示setInterval(() => {const x = Math.random() * canvas.width;const y = Math.random() * canvas.height;createFirework(x, y);// 显示“新春快乐”message = "IT小本本   祝  大家新春快乐!";messageOpacity = 1; // 重置文字透明度messageTimer = 0; // 重置计时器}, 10); // 每秒执行一次window.addEventListener("resize", () => {canvas.width = window.innerWidth;canvas.height = window.innerHeight;});animate();
</script>
</body>
</html>
文章来源:https://blog.csdn.net/weixin_47139678/article/details/145344181
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/server/164073.html

相关文章

npm cnpm pnpm npx yarn的区别

npm、cnpm、pnpm、npx、yarn 这几个工具都与 Node.js 项目的包管理和命令执行相关&#xff0c;它们的区别具体如下&#xff1a; 本质与功能定位 npm&#xff1a;是 Node.js 官方的包管理工具&#xff0c;提供了安装、卸载、更新、发布等全方位的包管理功能&#xff0c;还能通…

Java定时任务实现方案(四)——Spring Task

Spring Task 这篇笔记&#xff0c;我们要来介绍实现Java定时任务的第四个方案&#xff0c;使用Spring Task&#xff0c;以及该方案的优点和缺点。 ​ Spring Task是Spring框架提供的一个轻量级任务调度框架&#xff0c;用于简化任务调度的开放&#xff0c;通过注解或XML配置的…

C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

Deepseek本地部署(ollama+open-webui)

ollama 首先是安装ollama&#xff0c;这个非常简单 https://ollama.com/ 下载安装即可 open-webui 这个是为了提供一个ui&#xff0c;毕竟我们也不想在cmd和模型交互&#xff0c;很不方便。 第一&#xff0c;需要安装python3.11&#xff0c;必须是3.11&#xff08;其他版…

SG算法解析

Savitzky-Golay 滤波器的核心代码主要集中在计算投影矩阵B并使用这个矩阵对输入信号进行滤波。这部分核心代码包括计算B矩阵、处理边界效应和进行实际滤波操作。以下是对核心代码的一点解释&#xff1a; ① 计算 Savitzky-Golay 投影矩阵B B sgolay(order, framelen, weight…

解决.NET程序通过网盘传到Linux和macOS不能运行的问题

问题描述&#xff1a;.net程序用U盘传到虚拟机macOS和Linux可以正常运行&#xff0c;但是网盘传过去就不行。 解决方法&#xff1a; 这是文件权限的问题。当你通过U盘将文件传输到虚拟机的macOS和Linux系统时&#xff0c;文件的权限和所有权可能得到了保留或正确设置。但如果…

Git进阶之旅:分支管理策略

第一章&#xff1a; Git stash&#xff1a; 介绍&#xff1a; 当正在 dev 分支上开发某个项目&#xff0c;这时项目中出现一个 bug&#xff0c;需要修复&#xff0c;但是项目只完成一半&#xff0c;还不想提交&#xff0c;这时可以使用 git stash 命令将修改的内容保存至堆栈区…

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础组件实现)

目录 基础组件实现 如何将图像和文字显示到OLED上 如何绘制图像 如何绘制文字 如何获取字体&#xff1f; 如何正确的访问字体 如何抽象字体 如何绘制字符串 绘制方案 文本绘制 更加方便的绘制 字体附录 ascii 6x8字体 ascii 8 x 16字体 基础组件实现 我们现在离手…