HTML5和JS实现新年礼花效果

news2025/1/23 7:10:20

HTML5和JS实现新年礼花效果

2023兔年再见,2024龙年来临了!

祝愿读者朋友们在2024年里,身体健康,心灵愉悦,梦想成真。

下面是用HTML5和JS实现新年礼花效果:

源码如下:

<!DOCTYPE html>
<html>
<head>
    <title>新年礼花</title>
    <style>
        /* 设置画布占满整个窗口 */
        body {
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
        canvas {
            display: block;
        }
    </style>
</head>
<body>
    <!-- 创建一个画布 -->
    <canvas id="fireworksCanvas"></canvas>

    <script>
        // 获取canvas和context
        const canvas = document.getElementById('fireworksCanvas');
        const ctx = canvas.getContext('2d');
        // 设置canvas宽高为窗口的宽高
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        // 初始化烟花数组
        let fireworks = [];

        // 定义产生min到max之间的随机数的函数
        function random(min, max) {
            return Math.random() * (max - min) + min;
        }

        // 定义烟花类
        class Firework {
            constructor(x, y, color) {
                this.x = x;
                this.y = y;
                this.particles = [];
                this.exploded = false;
                this.life = 0;
                this.color = color;
                this.explodeHeight = random(canvas.height * 0.3, canvas.height * 0.6);
            }

            // 更新烟花状态的方法
            update() {
                // 如果烟花还未爆炸,向上移动,并增加寿命
                if (!this.exploded) {
                    this.y -= random(5, 10);
                    this.life += 1;
                    // 如果烟花达到或超过爆炸高度,爆炸
                    if (this.y <= this.explodeHeight) {
                        this.explode();
                    }
                } else {
                    // 如果烟花已经爆炸,更新和绘制粒子
                    this.particles.forEach((particle, index) => {
                        particle.update();
                        if (particle.life < 0) {
                            this.particles.splice(index, 1);
                        }
                    });
                }
            }

            // 绘制烟花的方法
            draw() {
                if (!this.exploded) {
                    ctx.fillStyle = this.color;
                    ctx.beginPath();
                    ctx.arc(this.x, this.y, 2, 0, Math.PI * 2);
                    ctx.fill();
                } else {
                    this.particles.forEach((particle) => particle.draw());
                }
            }

            // 烟花爆炸的方法
            explode() {
                this.exploded = true;
                for (let i = 0; i < 100; i++) {
                    const angle = random(0, Math.PI * 2);
                    const speed = random(1, 4);
                    this.particles.push(new Particle(this.x, this.y, angle, speed, this.color));
                }
            }
        }

        // 定义粒子类
        class Particle {
            constructor(x, y, angle, speed, color) {
                this.x = x;
                this.y = y;
                this.angle = angle;
                this.speed = speed;
                this.life = random(50, 100);
                this.color = color;
            }

            // 更新粒子状态的方法
            update() {
                this.x += Math.cos(this.angle) * this.speed;
                this.y += Math.sin(this.angle) * this.speed;
                this.speed *= 0.99;
                this.life -= 1;
            }

            // 绘制粒子的方法
            draw() {
                ctx.fillStyle = this.color + ', ' + (this.life / 100) + ')';
                ctx.beginPath();
                ctx.arc(this.x, this.y, 2, 0, Math.PI * 2);
                ctx.fill();
            }
        }

        // 动画函数
        function animate() {
            // 绘制背景
            ctx.fillStyle = 'rgba(0, 0, 0, 0.2)';
            ctx.fillRect(0, 0, canvas.width, canvas.height);

            // 以5%的概率添加新烟花
            if (Math.random() < 0.05) {
                const x = random(0, canvas.width);
                const y = canvas.height;
                const fireworkColor = 'hsla(' + random(0, 360) + ', 100%, 50%';
                fireworks.push(new Firework(x, y, fireworkColor));
            }

            // 更新和绘制烟花
            for (let i = fireworks.length - 1; i >= 0; i--) {
                fireworks[i].update();
                fireworks[i].draw();
                if (fireworks[i].exploded && fireworks[i].particles.length === 0) {
                    fireworks.splice(i, 1);
                }
            }

            // 显示文字
            ctx.font = "50px Arial";
            ctx.fillStyle = "pink";
            ctx.textAlign = "center";
            ctx.fillText("2024年龙年快乐", canvas.width / 2, canvas.height / 2);
            
            // 继续下一帧动画
            requestAnimationFrame(animate);
        }

        // 启动动画
        animate();

        // 监听窗口大小变化,重新设置画布大小
        window.addEventListener('resize', function() {
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;
        });

    </script>
</body>
</html>

OK!

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

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

相关文章

MSPM0L1306例程学习-ADC部分(5)

MSPM0L1306例程学习系列 使用的TI的官方例程&#xff0c;即SDK里边包含的例程代码。 可以到TI官网下载并且安装SDK: https://www.ti.com.cn/tool/cn/download/MSPM0-SDK/ MCU使用的是MSPM0L1306, 对于ADC部分&#xff0c;有10个例程&#xff1a; 今天接着讲2个例程&#xff0…

qt中信号槽第五个参数

文章目录 connent函数第五个参数的作用自动连接(Qt::AutoConnection)直接连接(Qt::DirectConnection - 同步)同线程不同线程 队列连接(Qt::QueuedConnection - 异步)同一线程不同线程 锁定队列连接(Qt::BlockingQueuedConnection) connent函数第五个参数的作用 connect(const …

软件开发新手用哪个IDE比较好?软件开发最好的IDE都在这!

目录 IDES 的优点 最佳编程 IDE 列表 Java 开发的流行集成开发环境 JetBrains 的 IntelliJ IDEA NetBeans 适用于 C/ C、C# 编程语言的最佳 IDE Visual Studio 和 Visual Studio 代码 Eclipse PHP 开发的最佳 IDE PHPStorm Sublime Text Atom JavaScript 的顶级 I…

线程数据共享和安全 -ThreadLocal

什么是 ThreadLocal ThreadLocal 的作用&#xff0c;可以实现在同一个线程数据共享, 从而解决多线程数据安全问题. 2. ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法 [源码!]ThreadLocal 可以像 Map 一样存取数据&#xff0c;key 为当前线程, get 方…

4.25 构建onnx结构模型-Split

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Slice 结点进行分析 方式 方法一…

DL Homework 13

目录 编程实现优化算法&#xff0c;并3D可视化 1. 函数3D可视化 2.加入优化算法&#xff0c;画出轨迹 3.复现CS231经典动画 4.结合3D动画&#xff0c;用自己的语言&#xff0c;从轨迹、速度等多个角度讲解各个算法优缺点 5.总结 编程实现优化算法&#xff0c;并3D可视化 …

语义分割的应用及发展

语义分割(Semantic Segmentation)是一种计算机视觉领域的任务&#xff0c;旨在将一张图像中的每一个像素都分配一个语义标签&#xff0c;即将图像中的每个物体区域进行精确的分类划分。例如&#xff0c;在一张街景图中&#xff0c;语义分割可以将人、车、路、天空等每个像素分别…

java方法(method)概述,计算机中的执行原理及案例

引言&#xff1a; 学习了方法&#xff08;method&#xff09;&#xff0c;整理下心得 概述&#xff1a; 1&#xff0c;什么是方法&#xff08;method&#xff09;: 方法是一种语法结构&#xff0c;它可以把一段代码封装成一个功能&#xff0c;以便重复利用 2&#xff0c;使用…

排序整形数组--------每日一题

大家好这是今年最后的一篇了&#xff0c;感谢大家的支持&#xff0c;新的一年我会更加努力地。 文章目录 目录 文章目录 题⽬描述&#xff1a; 输⼊10个整数&#xff0c;然后使⽤冒泡排序对数组内容进⾏升序排序&#xff0c;然后打印数组的内容 一、题目解读 冒泡排序是⼀种基础…

波特云 集装箱和 海恒蓝 集装箱 自动化集装箱下单方案

背景&#xff1a; 这几天 遇到了一个客户 是做外贸的 需要大量多的集装箱&#xff0c;了解后 他们是需要在平台上 下单集装箱 才有可能预约到集装箱使用&#xff0c;所以公司每天都需要都需要派个人 盯着电脑来 下单集装箱。 波特云 网站&#xff1a;https://www.eportyun.com…

react18框架笔记

React React 是 facebook 出的一款针对视图层的库(library)。它是基于单向数据流思想开发的&#xff0c;主要的一个功能就是针对视图显示&#xff0c;让我们把一个项目拆分成一个一个组件进行开发维护。 官网 目前我们讲的 react 是基于 18.2 的版本。react 每一个版本更新之…

Apollo自动驾驶:从概念到现实的里程碑

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言1. Apollo Client2. Apollo Server3. Apollo Federation4. Apollo Tracing5. Apollo Codegen6. Apollo Link7. 其他工具和框架结论 &#x1f680;&#x1f…

vue+ts element-plu是页码器根据屏幕宽度变化,解决刷新后初始化值问题

实现思路&#xff1a;组件挂载后执行初始化操作&#xff0c;初始化添加事件监听器&#xff0c;当浏览器窗口大小发生变化时会调用这个函数handleResize <el-pagination v-model:current-page"currentPage" background :total"total" layout"prev,…

vue3框架笔记

Vue Vue 是一个渐进式的前端开发框架&#xff0c;很容易上手。Vue 目前的版本是 3.x&#xff0c;但是公司中也有很多使用的是 Vue2。Vue3 的 API 可以向下兼容 2&#xff0c;Vue3 中新增了很多新的写法。我们课程主要以 Vue3 为主 官网 我们学习 Vue 需要转变思想&#xff0…

激光 GPS 卫星实现无边界精度

GPS 卫星领域已经发生了重大创新&#xff0c;将变得更加精确和强大。我们正在谈论激光后向反射器阵列&#xff08; LRA&#xff09;的发展。 这些可以精确跟踪地球的形状、自转和环境变化&#xff0c;从而扩展卫星的能力。 GPS卫星的主要用途是确定各种情况下的位置&#xff…

亚信安慧AntDB数据库两项目分别入选2023“星河”标杆、优秀案例

近日&#xff0c;由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织的第七届大数据“星河&#xff08;Galaxy&#xff09;”案例评选结果公示&#xff0c;亚信安慧AntDB数据库两项目入选&#xff0c;其中“基于Ant…

windows server 2022 启用SYN攻击保护

2023.12.28 SYN攻击是什么&#xff1a; SYN攻击是黑客攻击的常用手段&#xff0c;也是最容易被利用的一种攻击手法&#xff0c;属于DDoS攻击的一种。它利用TCP协议缺陷&#xff0c;通过发送大量的半连接请求&#xff0c;耗费CPU和内存资源。 SYN攻击包括大量TCP连接的第一个包&…

【Proteus仿真】【Arduino单片机】自动除湿器系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用按键、LCD1602液晶、DHT11温湿度、继电器除湿模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示DHT11传感器检测的湿度值阈…

电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…

新手快速上手掌握基础排序<二>快速排序快速入门

目录 引言 一&#xff1a;快速排序qsort的简介 1.qsort是一个库函数 2.库函数的查询了解方法 3.qsort的具体使用方法 4.qsort函数使用的一些注意点 5.qsort函数的特点 6.代码实现 (1)整数数组的快速排序 &#xff08;2&#xff09;结构体的快速排序&#xff08;学…