我用js写了一个,除夕烟花秀和春节随机祝福语

2023-11-15

项目截图

进入后的界面

图片.png

点击按钮

图片.png

点击之后的动画

yanhua.gif

烟花结束后的界面

zhufu.gif

代码实现

涉及的技术:HTML5多媒体,CSS定位,动画,js面向对象,Jquery动画、事件

首先来看HTML代码
<!DOCTYPE html>
<html lang="cn">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2022</title>
    <link rel="shortcut icon" href="./images/favicon.ico" type="image/x-icon">
    <link rel="stylesheet" href="./css/index.css">
    <script src="./js/jquery-3.6.0.min.js"></script>
    <script src="./js/index.js"></script>

</head>

<body>
    <!--这个是点击按钮的盒子,算是烟花筒 -->
    <div class="he">
        <!--这个是点击按钮,点击以后就开始做一些处理 -->
        <button id="fire"></button>
    </div>
    <!--这个是烟花哦-->
    <div class="box">
    </div>
    <!--这个是烟花结束后,出现在上面的2022图片
    <div class="title"></div>
    <!--这个就是随机生成祝福语的大盒子啦-->
    <div class="greetings">
        <!--可以通过这个div来动态的呈现祝福语,默认第一个是虎虎生威-->
        <div class="yu"><span id="blessing">虎虎生威</span></div>
        <!--这个是点击按钮,点击后停下快闪的祝福语-->
        <button id="btn">查看我的祝福</button>
    </div>

    <audio src="./meiti/chuxi.mp3"></audio>
    <audio src="./meiti/yanhua.mp3"></audio>
</body>

</html>

上面的html代码结构就是,烟花盒(.he)点火按钮(.fire)烟花(.box)显示2022虎年logo(.title)祝福语盒子(.greetings)显示祝福的具体容器(.yu 和 .blessing)暂停快速显示的按钮(.btn)两个音频。一共10个重要元素。

接着我们再来看看CSS代码
/*清除默认的边距*/
* {
    margin: 0;
    padding: 0;
}

/*导入字体,用来设置在祝福语上*/
@font-face {
    font-family: 'djs';
    src: url(../font/datk6.ttf);
}

/*设置body超出隐藏,因为后面烟花会超出,导致页面被撑开*/
body {
    /* background: #EF3D04; */
    overflow: hidden;
    background: #F35708 url(../images/hebj.png)no-repeat center center/100% 100%;
}

/*烟花盒子我们让他居于底部居中对齐*/
.he {
    position: absolute;
    width: 160px;
    height: 120px;
    background: url(../images/hebj.png)no-repeat center center/100% 100%;
    border-radius: 5px 5px 0 0;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    z-index: 2;
    transition: all 3s;
}


.he button {
    position: absolute;
    bottom: 20px;
    left: 50%;
    transform: translateX(-50%);
    border: 1px solid #C33830;
    box-shadow: 0 0 5px #D7A057, 0 0 2px #D7A057 inset;
    border-radius: 5px;
    width: 50px;
    height: 50px;
    background: transparent url(../images/huzhua.png)no-repeat center center/100% 100%;
    font-size: 12px;
    color: yellow;
    font-weight: 700;
}

/*烟花盒子,我们也要让他在底部居中对齐,后期我们通过动画,改变top值,实现由下而上的发射效果*/
.box {
    position: absolute;
    width: 50px;
    height: 50px;
    border-radius: 50%;
    overflow: hidden;
    transition: all;
    top: calc(100% - 50px);
    left: 50%;
    transform: translateX(-50%);
}

/*这是烟花绽放生成的小点,就是哪些五颜六色的小点,后面通过js随机生成个数,位置,大小,因为是随机的所有这个只设置绝对定位,不给定具体的top和left值*/
.box span {
    position: absolute;
    display: inline-block;
    border-radius: 50%;
}

/*当box到达指定的top值后,我们就可以给box添加这个带动画的样式了,这个动画具体的效果我们写在后面*/
.fire {
    left: 50%;
    transform: translateX(-50%);
    animation: suofang 4.5s linear;
}

/*2022虎年logo的样式*/
.title {
    position: absolute;
    width: 300px;
    height: 150px;
    background: url(../images/hunian.png)no-repeat center center/100% 100%;
    top: 10px;
    left: 50%;
    transform: translateX(-50%);
    transition: all 1s;
    display: none;
}

/*祝福语盒子的样式,这里指的注意的是自身的目标top值,必须加上.title的top值*/
.greetings {
    position: absolute;
    top: 180px;
    width: 260px;
    height: 400px;
    background: #FFE5C8;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 30px;
    box-sizing: border-box;
    border-radius: 20px;
    overflow: hidden;
    opacity: 0;
}

/*这是显示句子的第二层盒子,其作用是让文本垂直排列,居中对齐*/
.yu {
    display: flex;
    justify-content: center;
    align-items: center;
    writing-mode: tb;
    width: 100%;
    height: 85%;
    border-radius: 10px;
    background: url(../images/zhufu.png)no-repeat center center/100% 100%;
}

/*这就是祝福与显示盒子的本体啦,这里主要设置字体样式*/
#blessing {
    font-size: 50px;
    font-weight: 800;
    color: rgba(0, 0, 0, 0.74);
    letter-spacing: 6px;
    font-family: 'djs';
}

/*暂停按钮*/
#btn {
    width: 100%;
    height: 15%;
    margin-top: 50px;
    border-radius: 10px;
    border: 1px solid #D7A057;
    color: #D7A057;
    font-size: 14px;
    font-weight: 700;
    background: url(../images/btn.png)no-repeat center center/100% 100%;
}

/*动画函数,我在写这个动画函数之前,就猜测,如果父元素缩放,
里面的子元素会不会随着一起缩放,写出来后,证明我的猜测是正确的*/
@keyframes suofang {
    0% {
        transform: scale(1);
        opacity: 1;
    }
    50% {
        transform: scale(20);
        opacity: .5;
    }
    100% {
        transform: scale(100);
        opacity: 0;
        display: none;
    }
}

以上的css代码,可以看到,我使用了大量的定位。这是因为后面的动画都需要基于定位的left和top来实现。

好啦结构和样式都有了,我们就来看看js(行为)吧

javaScript代码
1、生成烟花球和焰火
$(function() {
//封装一个生成随机数的函数,方便后期随机生成烟花焰火的个数,大小,位置
    function rand(min, max) {
        return Math.random() * (max - min) + min;
    }
    //创建一个构造函数,构造函数中调用随机函数,生成500-1000之间随机的随机数,用于生成焰火的个数
    function Birth() {
        this.sum = parseInt(rand(500, 1000));
    }
    //在构造函数的原型对象上添加随机生成位置,大小的函数,里面调用之前定义的随机函数
    Birth.prototype.suiji = function() {
        //随机生成一个X轴坐标
        this.x = parseInt(rand(0, 50));
        //随机生成一个Y轴坐标
        this.y = parseInt(rand(0, 50));
        //随机生成一个宽度,因为生成的焰火式正圆,所以这里生成的焰火宽高式相等
        this.w = parseInt(rand(1, 3));
        //随机生成一个rgb颜色(0-255之间哦)
        this.color = parseInt(rand(0, 255));
        //将生成的对象返回(抛出)
        return this;
    }
    
    //将上面的构造函数实例化为对象,这样这个对象就可以访问上面构造函数生成的所有数据了
    const qiu = new Birth();
    //定义一个文档碎片,优化程序性能(减少页面重绘与回流)
    const jsbox = document.createDocumentFragment();
    //使用循环生成焰火,这里焰火使用span标签来表示
    for (var i = 0; i < qiu.sum; i++) {
        //获取本次循环生成的x轴坐标
        var x = qiu.suiji().x;
        //获取本次循环生成的y轴坐标
        var y = qiu.suiji().y;
        //获取本次循环生成的高和宽
        var w = qiu.suiji().w;
        //生成span元素,并将其追加到文档碎片中
        $(jsbox).append('<span></span>').children().eq(i).css({ 'background': `rgb(${qiu.suiji().color},${qiu.suiji().color},${qiu.suiji().color})`, 'width': w, 'height': w, 'left': x, 'top': y });
    }
    //将文档碎片追加到烟花盒子里,至此烟花部分结束
    $('.box').append(jsbox);
    
    
})
2、祝福语快速切换与暂停查看
    //我们将需要展示的祝福语,写在数组中,后期遍历这个数组就可以了
    const arr = ['虎虎生威', '财源滚滚', '虎年大运', '虎气冲天', '虎越新春', '虎虎虎虎'];
    
    //声明一个全局变量,用来当作下标访问数组
    let ind = 0;
    /*声明一个全局变量,用来当作节流阀,防止用户反复点击导致定时器叠加,
    祝福语切换太快,还能防止用户反复点击导致BGM重复播放*/
    let isok = false;
    
    //定义一个全局变量用来存储页面中的定时器
    let t;
    
    //快速切换祝福语的函数
    function setZf() {
    //使用定时器,每0.01秒执行一次定时器中的代码
    t = setInterval(function() {
        /*判断ind是不是等于数组长度-1,以免小标超出数组实际长度出现undefinde,
        如果是,就将ind归零,不是就继续自加*/
            if (ind >= arr.length - 1) {
                ind = 0;
            } else {
                ind++;
            }
            /*将从数组中读取出来的祝福语,渲染到页面中*/
            $('#blessing')[0].innerHTML = arr[ind];
        }, 10);
    }
    /*调用上面的函数,让页面一打开就开始执行,因为其CSS样式设置了隐藏,
    所以这里即使页面一打开,用户也看不见*/
    setZf();
    
    /*当暂停按钮被点击后,我们开始判断,节流阀如果是真,就调用上面的函数,
    实现开始切换祝福语的效果,并将节流阀关闭*/
     $('#btn')[0].onclick = function() {
        if (isok) {
            setZf();
            isok = false;
        } else {
        /*如果节流阀是关闭的(isok=false),就清除定时器,到达暂停的效果,
        然后将节流阀打开,方便下次开启切换*/
            clearInterval(t);
            isok = true;
        }
    }
3、点击开火按钮后所做的事情(一下代码使用了Jquery)
//获取元素并重新赋值
    const box = $('.box');
     const fire = $('#fire');
     
    let count;
    //当点火按钮被点击时,立马让烟花发射BGM开始播放,并将按钮设为禁止点击,防止用户反复点击,造成BUG重叠
    fire[0].onclick = function() {
        $('audio')[1].play();
        fire[0].disabled = true;
    }
    
    //当开火按钮被点击,利用这个事件的一点点的延迟效果(刚好是烟花发射BGM播放结束)播放新年BGM
    fire.click(function() {
        $('audio')[0].play();
        //给烟花盒子添加CSS样式,达到烟花居中显示
        box.css({
            left: '50%',
            transform: 'translateX(-50%)',
        })
        /*给烟花盒子添加动画,改变的是top值,当top等于100px时动画结束,因为box的top
        初始值位于屏幕的底部,让其top值改为100px,就形成了慢慢向上移动的视觉效果。*/
        box.animate({
            top: '100px',
            /*动画结束后,开始执行的函数*/
        }, function() {
        /*当烟花球到达指定位置后,给其添加带有动画(缩放)效果的CSS样式,达到烟花绽放的视觉效果*/
            box.addClass('fire');
            /*使用定时器判断,烟花是否绽放完成,绽放完成就让烟花球隐藏,让2022虎年logo显示,让祝福语盒子显示*/
            count = setInterval(() => {
                if (Math.abs(box.offset().top) == 100) {
                    box.css({ 'opacity': '0' })
                    $('.he').hide();
                    $('.title')[0].style.display = 'block';
                    $('.greetings')[0].style.opacity = '1';
                    $('body').css({
                    })
                    clearInterval(count);
                }
            }, 100);
        });
    })

以上就是这个项目的所有代码,再次预祝大家新年快乐,虎年大吉,财源滚滚。
项目体验链接:http://www.starqin920.cn/chuxi/index.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我用js写了一个,除夕烟花秀和春节随机祝福语 的相关文章

  • 如何按单个整数字段对 JSON 进行排序? [复制]

    这个问题在这里已经有答案了 我有以下 JSON title title order 0 order 9 order 2 JSON 包含很多字段 我如何根据字段对它们进行排序order field 我一直在寻找 Nodejs 中内置的东西 但
  • 3 Div 盒子不适合容器

    在页面上 jerkydirect com base opportunity 容器内有 3 个带有图片的盒子 然而 当在大屏幕上查看时 最后一个框粘在右侧 它在较小的窗口或移动设备上看起来很棒 但在较大的屏幕上则不然 我怎样才能让它正确对齐
  • 无法读取setInterval(Hooks)中的最新状态变量[重复]

    这个问题在这里已经有答案了 我想这是因为 JS 的工作原理 但我想你不会在类中遇到这个问题 在此代码中 let open setOpen React useState false let counter setCounter React u
  • 在js中检测浏览器的最佳方法

    JavaScript 中有很多浏览器检测方法 据我所知 使用navigator userAgent或检测特征 例如XMLHttpRequest 等等 谁能告诉我哪种方法最好 最有效 如果你真的需要知道什么browser他们正在使用 你主要需
  • 设置股票数据 Highcharts xAxis 的格式

    我已经浏览了需要为 xAxis 属性设置的 Highcharts 选项来格式化时间标签 但没有运气了解这对于这种情况到底是如何工作的 我在白天 盘中 检索了股票的动态数据 我需要显示这些数据 因为检索的数据每天从 9 30 开始到 17 0
  • 以编程方式触发 highchart 散点图上某个点的单击事件

    实际上 我有一个小要求 其中有一个带有点列表和下拉列表的散点图 当我从下拉列表中选择一个项目时 应触发其相应的数据点单击 当我在图表上选择一个数据点时 必须执行一些操作 并且下拉列表应根据选择进行更新 我们有什么办法可以做到这一点吗 我尝试
  • 从 3.1 返回后加载 Rails 3(服务器)时出现问题

    Rails 完全菜鸟 我正在使用 Hartl 教程 到了第 4 章 CSS 4 1 2 一切看起来都很顺利 但遇到了一个问题 使页面上的文字看起来
  • .net dropdownlist对齐文本

    我正在尝试将 net 下拉列表中的文本向右对齐 使用 CssClass 我可以在 Firefox 中将文本向右对齐 IE 不会将文本右对齐 而是左对齐 我读到 IE 6 不支持这个 这是真的 我使用的是 IE7 但我的大多数用户将使用 IE
  • 两个日期之间间隔 15 分钟 javascript

    问题 我需要将两个日期 时间戳之间的所有 15 分钟时隙 日期格式 2016 08 10 16 00 00 创建为 HH mm 格式的数组 其中分钟限制为 00 15 30 45 示例 中午 12 30 到下午 2 30 将 gt 12 3
  • 是否可以让 webpacks System.import 使用 ajax (用于进度事件)?

    所以我刚刚更新到 webpack 2 并进行了第一个工作设置 其中 webpack 通过查看 System import 调用自动创建块 相当甜蜜 但是 我使用 ajax 调用加载初始块 以便我可以加载时显示进度 https stackov
  • javascript onclick 进入新窗口

    这是我的代码
  • select 元素是否具有标准值属性?

    这是一个简单的问题 但我找不到任何参考资料 所以就在这里 假设我有一个选择元素
  • 如何在 JavaScript 中从代理对构造 UTF-16 字符?

    以下计算 Unicode 代码点的 UTF 16 代理对 戴着医用口罩的脸 https emojipedia org face with medical mask 但是如何从代理对构造字符以在字符串中使用呢 const codepoint
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • CSS 字体在 Firefox 中不起作用

    我下面有这个字体代码 它在谷歌浏览器中工作正常 但在火狐浏览器中根本不起作用 为什么
  • 如何在 Aframe 中的平面上加载 gif(具有透明度)(故障)?

    大家好 我是 Aframe 的新手 正在尝试在空间网络环境中设置一大堆 gif 我在飞机上加载 gif 时遇到了一些困难 我已经通过 Aframe 的资产文件夹加载了图像 故障 目前它看起来像这样
  • 两个 div 之间的匿名空白

    这里是Fiddle http jsfiddle net y6hSV 1 我有两个divs一个用于标题 另一个用于主体 在 的里面div这是标题 我还有另一个div那个 div 是floated left 因为那个floating 两者之间出
  • 将 javascript 变量作为参数传递给 @url.Action()

    是否可以将javascript变量作为参数传递给 url Action 因为据我所知可能存在服务器和客户端问题 我的要求是我必须根据过滤器下载文件 并进行ajax调用不适用于下载文件 所以我对 url Action 进行了编码 但无法实现这
  • 允许 iframe 跨域链接到目标父框架

    我有 2 个域 域 1 上的一个页面使用 iframe 加载域 2 中的内容 如何允许来自domain2 iframe 内 的链接在domain1 的完整父框架中打开 我一直在关注IE和w3c的新沙箱属性 http www w3 org T
  • 将一维数组转换为二维数组[重复]

    这个问题在这里已经有答案了 我正在开发一个程序 我必须将文本文件中的值读入一维数组 我已经成功获取该一维数组中的数字 m1 1 2 3 4 5 6 7 8 9 但我希望数组是 m1 1 2 3 4 5 6 7 8 9 您可以使用此代码 co

随机推荐

  • chatgpt赋能python:Python题目搜索软件:提升你的编程水平

    Python题目搜索软件 提升你的编程水平 对于那些喜欢编程的人来说 学习Python是一个非常不错的选择 但是 学习Python的难度并不小 需要大量的时间和精力 一个好的学习方式是通过完成Python编程题目来加深对该编程语言的理解 但
  • firebug 调试ajax,Jquery使用Firefox FireBug插件调试Ajax步骤讲解

    首先 我们用一个示例来说明JQuery的Ajax调用过程 实现的一个功能是 点击确认支付按钮之后 实现余额支付的功能 1 首先在php页面将相关需要调用的函数绑定到按钮上 function pay btn bind click ABC ba
  • qq引流有哪些模式? QQ引流的几种方法

    现在做QQ营销的方法真的是太多了 花样百出 什么招式都有的 QQ作为我们常用的交流工具 用于营销也是无可厚非的事情 现在做互联网的 永远离不开两个话题 就是 流量 和 变现 缺少其中一个 你所做的所有事情就完全没有任何意义 1 QQ空间引流
  • Mysql 多表关联查询

    文章目录 1 Mysql中表之间的关系 1 1 多表关系 1 2 外键约束 2 多表联合查询 2 1 交叉连接查询 笛卡尔积 2 2 内连接查询 inner join 2 3 外连接查询 2 3 1 左连接 2 3 2 右连接 2 3 4
  • 【接口测试 】Day3-Postman高级用法1(附项目实战)

    目录 课程大纲 昨日回顾 今日目标 Postman高级用法1 一 用例管理 二 Postman断言 三 环境变量与全局变量 四 请求前置脚本 了解 五 Postman关联 重点 课程大纲 接口测试 Day1 接口测试基础 附项目实战 小慌慌
  • 父页面调用easyui datagrid

    opener tt datagrid insertRow index 0 row name name
  • 关于kerberos使用keytab安全认证连接hive票据过期的问题及解决方法。

    关于kerberos使用keytab安全认证连接hive票据过期的问题及解决方法 问题描述 解决方法 问题描述 本人在使用HiveStreaming的过程中 使用kerberos keytab进行安全验证 程序会保持长期连接 hive jd
  • 动手强化学习(六):DQN 算法

    动手强化学习 六 DQN 算法 1 简介 2 CartPole 环境 3 DQN 3 1 经验回放 3 2 目标网络 4 DQN 代码实践 5 以图像为输入的 DQN 算法 6 小结 文章转于 伯禹学习平台 动手学强化学习 强推 本文所有代
  • 5.1-集成学习

    文章目录 集成框架 Framework of Ensemble 一 Ensemble Bagging 1 1 决策树 Decision Tree 1 2 随机森林 Random Forest 二 Ensemble Boosting 2 1
  • 大模型的普及与应用,数据保护非常重要

    随着AI技术的不断发展和应用 大模型已经成为了AI领域中的一个热门话题 随着大模型的应用越来越广泛 保护隐私和数据安全的重要性也越来越突出 隐私和数据安全不仅仅是技术要求 更是对个人权利和社会发展的必然需求 在AI大模型的应用中 数据是非常
  • ROS机械臂正逆运动学

    这里做一个六轴机械臂用于正逆运动学实验 这里其实一共只有3轴 只有3轴位置没有姿态 所以urdf文件里我在末端做了3个虚拟关节 以便将kdl的frame能够填满 使得齐次坐标变换是规则的 1 urdf建模
  • I2C学习

    参考链接 I2C基础知识学习 主机向从机写数据的过程 1 start信号 2 从机地址 7位地址 3 读写位 一位读写 R W 位 0 写 1 读 4 等待从机应答信号 5 当主机收到从机的应答信号 然后发送访问的从机寄存器地址 6 再次等
  • HTTP协议各个版本之间区别?

    HTTP协议各个版本之间区别 1 区别 2 持久连接 3 管线化 4 持久连接和管线化区别 5 分块传输编码 6 二进制协议 7 多路复用 7 1多路复用与管线话和持久连接的区别 7 2多路复用是如何实现在同一个TCP连接上同时发送多个HT
  • 如何在DSP CCS开发环境中添加VLIB图像处理的库

    CCS Version 5 5 0 00077 VLIB VLIB Function Reference Release 3 3 2 0
  • IDEA使用手册之Java Web项目 debug调试方法

    点击图中按钮开始运行web工程 启动成功 设置断点 通过浏览器发送请求 请求发送之后会自动跳到断点处 并且在断点之前会有数据结果显示 按F8 在 Debug 模式下 进入下一步 如果当前行断点是一个方法 则不进入当前方法体内 跳到下一条执行
  • IDEA插件系列(11):Translation插件——翻译插件

    1 插件介绍 可以翻译词汇 语句 十分方便 2 安装方式 第一种安装方式是使用IDEA下载插件进行安装 第二种方式是使用离线插件进行安装 插件下载地址 http plugins jetbrains com plugin 8579 trans
  • vscode 方法代码块的注释生成方法

    1 安装插件 Document This 2 将光标放置于function上面 快捷键是 Ctrl Alt D 加 Ctrl Alt D 注 vue里的method方法中的function用这个不行 单独的一个文件中可以 类似下面的代码 获
  • ElasticSearch7.6入门学习笔记

    在学习ElasticSearch之前 先简单了解一下Lucene Doug Cutting开发 是apache软件基金会4 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包 不是一个完整的全文检索引擎 而是一个全文检索
  • ApiPost使用教程

    怎样先新建一个简单的接口 首先打开ApiPost界面点击新建 选择POST请求 输入url 请求参数选择json 输入对应的请求参数 点击发送 就可以请求成功啦 当然我们点击右侧保存 就可以保存该接口 并且左侧可以出现该保存的结果目录 如何
  • 我用js写了一个,除夕烟花秀和春节随机祝福语

    项目截图 进入后的界面 点击按钮 点击之后的动画 烟花结束后的界面 代码实现 涉及的技术 HTML5多媒体 CSS定位 动画 js面向对象 Jquery动画 事件 首先来看HTML代码