【用三大件写出的开门烟花特效】

又到了一年一度的春节时期啦!昨天呢是北方的小年,今天是南方的小年,看到大家可以愉快的放烟花,过大年很是羡慕呀!辞旧岁,贺新春,今年我呀要放烟花,过春节!🧨

这个特效简单的使用了前端三件套即可完成,html,js,css,canvas整体效果如下GIF图所示(码内隐藏特殊变量,找到有惊喜!)

背景音乐是《China-E》个人感觉很有新年的感觉,整个China系列的歌曲都很nice,该特效的寓意就是开门大吉,辞旧迎新,2023年的大门向你敞开,新的一年想你招手,小兔子抱着锦鲤,也预示着吉祥,山鱼在这里祝大家前兔无量,大展宏兔!

就是开心,就是玩,就是兔个吉利!,话不多说上代码!

<body><!-- 依旧是简洁的html代码 --><canvas id="mycanvas"></canvas><div id="box"><button type="button" id="unmuteButton">开启新年音乐</button><button type="button" id="unmuteButton2">关闭新年音乐</button><video id="video" muted autoplay src="./audio/新年音乐.mp3" loop></video></div>
</body>

比较多的css代码,所以单独放在了一个文件下,如果用的时候出现图片丢失的问题,可以看看路径写对了没

/* 如果单独放记得去掉style标签哦 */
<style>
* {margin: 0;padding: 0;
}body {overflow: hidden;margin: 0;cursor: pointer;font-size: 30px;background: url("../img/辞旧岁贺新春兔年.png");background-size: 100% 100%;
}#unmuteButton {position: absolute;z-index: -1;top: 0;left: 0;font-size: 10px;font-family: "STHupo";width: 80px;height: 30px;border: 1px solid red;background-color: rgb(255, 115, 0);border-radius: 10%;
}#unmuteButton2 {position: absolute;z-index: -1;top: 0px;left: 120px;font-size: 10px;font-family: "STHupo";width: 80px;height: 30px;border: 1px solid red;background-color: rgb(255, 115, 0);border-radius: 10%;
}#video {position: absolute;top: -100000;left: -100000;
}#box {position: absolute;z-index: 1;width: 100%;height: 100%;top: 0;left: 0;
}#box::before,
#box::after {content: '';z-index: 99;margin-top: -37px;float: left;width: 50%;height: 1000px;background: url("../img/兔子2023.png") no-repeat;transition: .4s;
}#box::before {float: left;background-position: -220px 37px;
}#box::after {float: right;background-position: -210px;
}#box:hover::before {transform: translateX(-100%)
}#box:hover::after {transform: translateX(100%)
}/* 去除滚动条 */
body::-webkit-scrollbar {width: 0 !important
}
</style>

比比比比较多的js代码,注意同上

// 烟花生成
window.requestAnimationFrame = (function () {return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||function (callback) {window.setTimeout(callback, 1000)}
})();
// 获取画布
var area = document.getElementById("mycanvas");
area.width = document.documentElement.clientWidth;
area.height = document.documentElement.clientHeight;var ctx = area.getContext("2d");hue = 120;
timerTick = 0;
timerTotal = 5;
fireworks = [];
particles = [];function random(min, max) {return Math.random() * (max - min) + min;
}function distans(sx, sy, tx, ty) {var xdistan = sx - tx;var ydistan = sy - ty;return Math.sqrt((Math.pow(xdistan, 2) + Math.pow(ydistan, 2)));
}function Firework(sx, sy, tx, ty) {this.x = sx;this.y = sy;this.sx = sx;this.sy = sy;this.tx = tx;this.ty = ty;this.targetDistances = distans(sx, sy, tx, ty);this.distancesc = 0;this.shanyu = [];this.shanyucount = 3;while (this.shanyucount--) {this.shanyu.push([this.x, this.y]);}this.angle = Math.atan2(ty - sy, tx - sx);this.speed = 2;this.jiasudu = 1.05;this.brightness = random(50, 70);this.targetRad = 5;
}Firework.prototype.update = function (index) {this.shanyu.pop();this.shanyu.push([this.x, this.y]);if (this.targetRad < 8) {this.targetRad += 0.3;} else {this.targetRad = 1;}this.speed *= this.jiasudu;var vx = Math.cos(this.angle) * this.speed;var vy = Math.sin(this.angle) * this.speed;this.distancesc = distans(this.sx, this.sy, this.x + vx, this.y + vy);if (this.distancesc >= this.targetDistances) {createparticals(this.tx, this.ty);fireworks.splice(index, 1)} else {this.x += vx;this.y += vy;}
}Firework.prototype.draw = function () {ctx.beginPath();ctx.moveTo(this.shanyu[this.shanyu.length - 1][0], this.shanyu[this.shanyu.length - 1][1]);ctx.lineTo(this.x, this.y);ctx.strokeStyle = 'hsl(' + hue + ',100%,' + this.brightness + '%)';ctx.stroke();ctx.beginPath();ctx.arc(this.tx, this.ty, this.targetRad, 0, Math.PI * 2);ctx.stroke();
}function Particle(x, y) {this.x = x;this.y = y;this.shanyu = [];this.shanyucount = 10;while (this.shanyucount--) {this.shanyu.push([this.x, this.y]);}this.angle = random(0, 2 * Math.PI);this.speed = random(1, 10);this.mocal = 0.95;this.gravity = 0.98;this.hue = random(hue - 20, hue + 20);this.brightness = random(50, 80);this.alpha = 1;this.decay = random(0.015, 0.03);
}Particle.prototype.update = function (index) {this.shanyu.pop();this.shanyu.unshift([this.x, this.y]);this.speed *= this.mocal;this.x += Math.cos(this.angle) * this.speed;this.y += Math.sin(this.angle) * this.speed + this.gravity;this.alpha -= this.decay;if (this.alpha <= this.decay) {particles.splice(index, 1)}
}
Particle.prototype.draw = function () {ctx.beginPath();ctx.moveTo(this.shanyu[this.shanyu.length - 1][0], this.shanyu[this.shanyu.length - 1][1]);ctx.lineTo(this.x, this.y);ctx.strokeStyle = 'hsl(' + hue + ',100%,' + this.brightness + '%)';ctx.stroke();
}function createparticals(x, y) {var particalcount = 500;while (particalcount--) {particles.push(new Particle(x, y))}
}var clientw = document.documentElement.clientWidth;
var clienth = document.documentElement.clientHeight;function loop() {requestAnimationFrame(loop);hue += 0.5;ctx.globalCompositeOperation = 'destination-out';ctx.fillRect(0, 0, clientw, clienth);ctx.fillStyle = 'rgb(0,0,0,0.5)';ctx.globalCompositeOperation = 'lighter';var i = fireworks.length;while (i--) {fireworks[i].draw();fireworks[i].update(i);}var i = particles.length;while (i--) {particles[i].draw();particles[i].update(i);}if (timerTick >= timerTotal) {fireworks.push(new Firework(clientw / 2, clienth, random(0, clientw), random(0, clienth)));timerTick = 0;} else {timerTick++;}
}
window.οnlοad = loop();
window.onload = function starttime() {ptimer = setTimeout(starttime, 1000);
}
// 音乐控制
unmuteButton.addEventListener('click', function () {video.muted = false;
});
unmuteButton2.addEventListener('click', function () {video.muted = true;
});
结束喽,下一篇新春特效就是下一年喽!
点赞:您的赞赏是我前进的动力! 👍
收藏:您的支持我是创作的源泉! ⭐
评论:您的建议是我改进的良药! ✍
山鱼的个人社区:欢迎大家加入我的个人社区—— 山鱼社区

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

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

相关文章

[已解决]HttpMessageNotReadableException: JSON parse error: Unexpected character:解析JSON时出现异常的问题分析与解决方案

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

小小手表探索更多 好玩伴也是好帮手

华为儿童手表 5X 不仅是孩子的好玩伴&#xff0c;也是家长的好帮手。全能形态让小小手表探索更多&#xff0c;高清双摄记录美好&#xff0c;离线定位随时掌握&#xff0c;绿色纯净守护成长&#xff0c;让孩子享受科技带来的安全与乐趣。

「新版」PyCharm 加载condav Environment / Conda executableis not found

在新版的 PyCharm 配置中&#xff0c;设置Conda环境不再与旧版本保持一致&#xff0c;对于新手而言可能不清楚如何加载&#xff0c;作者也是郁闷了好久&#xff0c;经过一顿输出发现需要通过加载conda配置&#xff0c;才调取conda虚拟环境&#xff0c;而不再是直接调取conda的虚…

Linux--fork创建子进程详解

目录 一.初识fork函数 二.fork的返回值 三.fork原理 1.fork是如何创建子进程的&#xff1f; 2.为什么fork会有两个返回值&#xff1f; 3.为什么父进程的返回值是子进程的pid&#xff0c;子进程返回值是0&#xff1f; 4.fork之后&#xff0c;父子进程谁先运行&#xff1f;…

【深度学习】强化学习(四)强化学习的值函数

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数1. 状态值函数&#xff08;State Value Function&#xff09;a. 状态值函数的定义b. 贝尔曼方程&#xff08;Bellman Eq…

亚马逊鲲鹏系统可快速创建大量的买家账户

在数字时代的浪潮中&#xff0c;人们总是在寻找更便捷、高效的方式来完成各种任务&#xff0c;而亚马逊鲲鹏系统的出现&#xff0c;无疑为那些渴望拥有大批量买家号的人提供了一个全新的可能性。在这个系统中&#xff0c;注册买家号变得轻而易举&#xff0c;只需准备好一些必要…

WebRTC AEC回声消除算法拆解

WebRTC AEC算法流程分析——时延估计&#xff08;一&#xff09; 其实&#xff0c;网上有很多类似资料&#xff0c;各个大厂研发不同应用场景设备的音频工程师基本都对其进行了拆解&#xff0c;有些闪烁其词&#xff0c;有些却很深奥&#xff0c;笔者随着对WebRTC了解的深入&a…

韵达快递查询入口,将途经指定城市的单号筛选出来

批量查询韵达快递单号的物流信息&#xff0c;并将途经指定城市的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&#x…

生物分子相互作用的奥秘与挑战:探索未来药物设计的新方向

在生命科学领域&#xff0c;生物分子相互作用的研究日益受到关注。这种相互作用涉及蛋白质、核酸、脂质和糖类等生物分子之间的相互识别、结合和调控。理解这些相互作用对于揭示生命现象、疾病机制和治疗策略具有重要意义。 然而&#xff0c;生物分子相互作用的奥秘也带来了诸…

探索“超级服务器” TON:SDK 应用与开发入门

TON 是一个由多个组件构成的去中心化和开放的互联网平台&#xff0c;聚焦于实现广泛的跨链互操作性&#xff0c;同时在高可扩展性的安全框架中运作。TON 区块链被设计为分布式超级计算机或“超级服务器&#xff08;superserver&#xff09;”&#xff0c;旨在提供各种产品和服务…

在Node.js中MongoDB更新数据的方法

本文主要介绍在Node.js中MongoDB更新数据的方法。 目录 Node.js中MongoDB更新数据使用原生 MongoDB 驱动程序更新数据使用 Mongoose 更新数据 Node.js中MongoDB更新数据 在Node.js中&#xff0c;可以使用原生的 MongoDB 驱动程序或者使用 Mongoose 来更新 MongoDB 数据。 下面…

【腾讯云 HAI 域探秘】释放生产力:基于 HAI 打造团队专属的 AI 编程助手

文章目录 前言一、HAI 产品介绍二、HAI 应用场景介绍三、HAI 生产力场景探索&#xff1a;基于 HAI 打造团队专属的 AI 编程助手3.1 申请 HAI 内测资格3.2 购买 HAI 实例3.3 下载 CodeShell-7B-Chat 模型3.4 部署 text-generation-inference(TGI)推理服务3.4.1 下载 text-genera…

Linux 使用 Anaconda+Uwsgi 部署 Django项目和前端项目

一、安装Anaconda 使用Anaconda创建python环境的优点&#xff1a; virtualenv只能创建系统原有的python版本&#xff0c;而不能创建创建任意版本的环境 而Anaconda的虚拟环境中&#xff0c;你可以指定任意现存可使用的python环境&#xff08;包括比原环境版本高的python版本&a…

代码签名证书:数字安全世界的守门员

在这个信息化的时代&#xff0c;如果说互联网是高速流动的信息海洋&#xff0c;那么软件便是承载这些信息的庞大船队。而让人倍感安心地乘坐这些船的&#xff0c;正是被称为代码签名证书的重要安全措施。 你可以把代码签名证书想象成是软件世界的一位神秘守门员。它存在的目的&…

使用Python爬取公众号的合集

文章目录 前言讲解爬取思路开爬爬取文章url文章爬取结果爬取图片图片爬取结果优化下载图片代码 声明结尾关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游…

激活Windows过程及报错解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上, 运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本

激活Windows过程及报错问题解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上&#xff0c;运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本。 前言 最近在激活Windows过程中&#xff0c;遇到了报错: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上…

【数据分析与可视化】利用Python对学生成绩进行可视化分析实战(附源码)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 下面对学生成句和表现等数据可视化分析 1&#xff1a;导入模块 import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][simhei] plt.rcParams[f…

【Android】使用 Glide 给 ImageView 加载图像的简单案例

前言 Android Glide是一个用于在Android应用中加载和显示图片的流行开源库。它提供了简单易用的API&#xff0c;可以帮助开发者高效地加载远程图片、本地图片以及GIF动画&#xff0c;并提供了缓存、内存管理等功能&#xff0c;使得图片加载在移动应用中更加流畅和高效。Glide还…

小白菜QQ云端机器人源码-去除解密授权

小白菜QQ云端机器人源码分享&#xff1a;解密授权学习版已去除 这款源码是专为群机器人爱好者设计的&#xff0c;它基于挂机宝机器人框架构建的网页站点。 用户可以通过网页登录QQ账号至挂机宝框架中&#xff0c;无需通过机器人实现登录。 而且&#xff0c;该源码解决了一个…

运筹学经典问题(三):最大流问题

问题描述 给定一个图网络 G ( V , E ) G(V, E) G(V,E)&#xff0c;网络中连边的权重代表最大容量&#xff0c;在这个图中找出从起点到终点流量最大的路径。 数学建模 集合&#xff1a; I I I&#xff1a;点的集合&#xff1b; E E E&#xff1a;边的集合。 常量&#x…