文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于JavaScript实现除夕烟花秀与随机祝福语

2024-04-02 19:55

关注

项目截图

进入后的界面

点击按钮

点击之后的动画

烟花结束后的界面

代码实现

涉及的技术: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" rel="external nofollow"  type="image/x-icon">
    <link rel="stylesheet" href="./css/index.css" rel="external nofollow" >
    <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 {
    
    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;
}


.box {
    position: absolute;
    width: 50px;
    height: 50px;
    border-radius: 50%;
    overflow: hidden;
    transition: all;
    top: calc(100% - 50px);
    left: 50%;
    transform: translateX(-50%);
}


.box span {
    position: absolute;
    display: inline-block;
    border-radius: 50%;
}


.fire {
    left: 50%;
    transform: translateX(-50%);
    animation: suofang 4.5s linear;
}


.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;
}


.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;
    
    let isok = false;
    
    //定义一个全局变量用来存储页面中的定时器
    let t;
    
    //快速切换祝福语的函数
    function setZf() {
    //使用定时器,每0.01秒执行一次定时器中的代码
    t = setInterval(function() {
        
            if (ind >= arr.length - 1) {
                ind = 0;
            } else {
                ind++;
            }
            
            $('#blessing')[0].innerHTML = arr[ind];
        }, 10);
    }
    
    setZf();
    
    
     $('#btn')[0].onclick = function() {
        if (isok) {
            setZf();
            isok = false;
        } else {
        
            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%)',
        })
        
        box.animate({
            top: '100px',
            
        }, function() {
        
            box.addClass('fire');
            
            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

以上就是基于JavaScript实现除夕烟花秀与随机祝福语的详细内容,更多关于JavaScript烟花 随机祝福语的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯