难道你也不能放烟花嘛?那就来看看这个吧!

news2024/12/23 0:34:07

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

这个特效简单的使用了前端三件套即可完成,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.coloradmin.cn/o/164548.html

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

相关文章

农产品商城简单demo-Android

项目概述 随着科学技术的不断提高和社会经济的不断发展&#xff0c;一些农产品的销售逐渐的落后于社会信息化的潮流之中&#xff0c;尤其是一些年龄较大的中老年人来说是极为不便的&#xff0c;国家大力倡导并十分重视三农问题&#xff0c;倡导推动农村农业的发展&#xff0c;为…

第二章 搜索求解

人工智能中的搜索&#xff1a; 搜索算法的形式化描述&#xff1a;<状态、动作、状态转移、路径、测试目标> 状态&#xff1a;从原问题转化出的问题描述。 动作&#xff1a;从当前时刻所处状态转移到下一时刻所处状态。 状态转移&#xff1a;对某一时刻对应状态进行某一…

泛型的学习

这里写目录标题一、泛型的使用自定义泛型类泛型方法说明泛型在继承方面的体现通配符的使用有限制条件的通配符的的使用每日一考一、泛型的使用 1、jdk5.0新增特性 2、在集合中使用泛型 ①集合接口或集合类在jdk5.0时都修改为带泛型的结构 ②实例化集合时&#xff0c;可以指明具…

是Spring啊!

一.概念spring概念一个包含了众多工具方法的 IoC 容器okk~~分析一下这句话意思,众多方法,IoC 是形容词,容器是名词 -> 众多方法:比如一个类里有许多方法, 容器:存储的东西 重点就是IoC是什么?Ioc2.1解释IoC -> Inversion of Control 控制反转 -> 对象的生命周期 ->…

Git版本控制工具详解

1、版本控制 1.1、认识版本控制&#xff08;版本控制&#xff09; 什么是版本控制&#xff1f; 版本控制的英文是Version control&#xff1b;是维护工程蓝图的标准作法&#xff0c;能追踪工程蓝图从诞生一直到定案的过程&#xff1b;版本控制也是一种软件工程技巧&#xff…

红米 12C earth 秒解锁 跳过168小时 红米note12 note12pro note12pro+系列机型解锁bl root教程步骤Fastboot

最近上手体验了Redmi 12C/红米12C&#xff0c;这是红米新推出的百元机&#xff0c;起售价699元&#xff0c;464G版本&#xff0c;具有不错的性能&#xff0c;具有5000mAh大电池&#xff0c;具有双频wifi&#xff0c;支持双卡双待&#xff0c;支持SD卡扩展等。 如果你近期想要给…

UTF-8和Unicode

文章目录Unicode与网络传输Unicode网络传输UTF&#xff1a;Unicode Transformation Format UTF-8是在网络上传输Unicode的一个转换标准&#xff0c;发送时将字符串Unicode转为UTF-8&#xff0c;接收时将字节转为Unicode&#xff0c;就完成来字符串的传输 Unicode与网络传输 U…

移动端 - 搜索组件(search-list篇)

移动端 - 搜索组件(search-input篇) 移动端 - 搜索组件(suggest篇) 这里我们需要去封装搜索历史组件 这一个组件还是很简单的, 但是逻辑部分需要根据实际的需求来进行书写; 所以这里我不太好去写实际的代码, 不过可以提供我的思路(主要的就是去实现增, 删, 改, 查) 第一步: 首…

【STL】string的常见接口使用

目录 1、string类的基础概念 2、string类的常见接口说明及应用 2.1、string类的成员函数 constructor&#xff08;构造函数&#xff09; destructor&#xff08;析构函数&#xff09; operator&#xff08;赋值&#xff09; string类对象的容量操作 迭代器 string类…

【vue2】组件基础与组件传值(父子组件传值)

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;组件基础概念与全局|局部组件的写法、组件之间传值&#xff08;父传子、子传父&#xff…

rcfile和orcfile

一、数据存储要考虑哪些方面 数据加载时间 Facebook数仓每天存储的数据量超过20TB&#xff0c;数据加载既有磁盘I/O又有网络传输&#xff0c;时间占用大 快速的数据查询 低的空间占用 数据压缩/数据编码 适合多种查询模式 如果所有人都查相同的字段&#xff0c;那么就可以针…

QT添加使用图片与UI资源

QT添加使用图片与UI资源1 QT添加使用图片资源1.1 添加新文件1.2 添加QT - QT Resources File 【UI资源文件】1.3 命名资源包名称 并 添加到项目文件1.4 .pro 文件发生变化 art.qrc1.5 点击qrc文件&#xff0c;添加现有文件 - 添加进去的图片文件可以进行正常引用。1.6 修改样式…

分布式任务处理xxljob

7.1 分布式任务处理 7.1.1 什么是分布式任务调度 视频上传成功需要对视频的格式进行处理&#xff0c;如何用Java程序对视频进行处理呢&#xff1f;这里有一个关键的需求就是当视频比较多的时候我们如何可以高效处理。 如何去高效处理一批任务呢&#xff1f; 1、多线程 多线…

通过Docker启动DB2,并在Spring Boot整合DB2

1 简介 DB2是IBM的一款优秀的关系型数据库&#xff0c;简单学习一下。 2 Docker安装DB2 为了快速启动&#xff0c;直接使用Docker来安装DB2。先下载镜像如下&#xff1a; docker pull ibmcom/db2:11.5.0.0 启动数据库如下&#xff1a; docker run -itd \--name mydb2 \--…

Allegro如何导入和导出Pin Delay操作指导

Allegro如何导入和导出Pin Delay操作指导 在做PCB设计等长设计的时候,Pin Delay是个非常重要的数据,关系到信号的长度,Allegro支持把Pin Delay数据导入到PCB中,并且还支持导出,如下图 具体操作如下 导入Pin Delay,选择File选择Import

图论基础: 邻接矩阵与邻接表(c++实现)

文章目录邻接矩阵邻接表邻接矩阵 邻接矩阵&#xff08;Adjacency Matrix&#xff09;是表示顶点之间相邻关系的矩阵。 设G(顶点&#xff0c;边)&#xff1a;G(V,E)是一个图。其中V{v1,v2,…,vn} [1] 。G的邻接矩阵是一个具有下列性质的n阶方阵&#xff1a; 无向图的邻接矩阵…

手眼标定,9点标定过程及其运算

在工业领域常常会遇到将相机安装在机器手中&#xff0c;由相机快速引导机器手进行工作的方式。其中9点标定的作用是将图像的坐标转化为机器手的坐标。 9点标定的作用意义&#xff1a; 1.计算像素当量&#xff0c;通过9点标定后的计算&#xff0c;可以得出一个由像素值转化为机器…

水平分表、分库和垂直分表、分库和公共表的代码实现和讲解

文章目录一、环境准备二、水平分表1.概念2.代码三、水平分库1.概念2.代码四、垂直分表1.概念2.代码五、垂直分库1.概念2.代码六、公共表1.概念2.代码一、环境准备 操作系统&#xff1a;Win10数据库&#xff1a;MySQL5.7JDK&#xff1a;64位 jdk1.8.0_202应用框架&#xff1a;s…

DOS和DDOS攻击和防御(ATTACK)

目录 一、DOS攻击和DDOS攻击的区别 第一、我们可以从他们两个的英文全称上来看初步的区别 第二、攻击方法不同 二、DOS和DDOS攻击的实现方式 1.DOS攻击 1、SYN Flood(是DOS和DDOS攻击方式之一) 2、UDP洪水攻击 3、Ping洪流攻击 4、teardrop攻击 5、Land攻击 6、Smurf攻击 7、Fr…

【 uniapp - 黑马优购 | 登录与支付 1】登录组件布局实现、用户信息布局与渲染

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;讨厌编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;见文末 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;…