HTML+CSS+JavaScript实现烟花绽放的效果源码

news2024/9/9 4:05:02

源码

复制粘贴代码 在同级别下放一张图片fire.png接可以了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>烟花特效</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        body{
            position: relative;
            width: 100vw;
            height: 100vh;
            overflow: hidden;
            background-color: #000;
        }
        .aniAvtive{
            animation: bloom 2s ease-in-out infinite;
        }
        @keyframes bloom {
            0%{
                transform: scale(0);
                filter: hue-rotate(0deg);
            }
            80%,100%{
                transform: scale(1.5);
                filter: hue-rotate(180deg);
            }
        }
    </style>
</head>
<body>
    <button class="but">暂停自动绽放</button>
    <button class="start">开启自动绽放</button>

    <script>
        //返回随机值的函数
        function getBodyWidthRand(size){
            //获取body的宽高
            let bodyObj=document.querySelector("body")
            let w=bodyObj.clientWidth-size
            return Math.ceil(Math.random()*w)
        }
        function getBodyHeightRand(size){
            //获取body的宽高
            let bodyObj=document.querySelector("body")
            let h=bodyObj.clientHeight-size
            return Math.ceil(Math.random()*h)
        }

        function getImgSizeArea(max,min){

            return Math.ceil(Math.random()*(max-min)+min)
        }
        //生成绽放的烟花
        function makeFireFlower(){
            //性能优化 节点利用
            if (document.body.children.length>=10) {
                //获取第一个我node的img
                let list=Array.from(document.body.children)
                for (let i = 0; i < list.length; i++) {
                   if (list[i].style.display==="none") {
                        list[i].style.display="block"
                        //设置图片的位置
                        list[i].style.position="absolute"
                        //随机值
                        let size =getImgSizeArea(600,200)
                        list[i].style.top=getBodyHeightRand(size)+"px"
                        list[i].style.left=getBodyWidthRand(size)+"px"
                        list[i].style.width=size+"px"
                        list[i].style.height=size+"px"
                        setTimeout(()=>{
                            list[i].style.display='none'
                        },2000)
                        return
                   }
                }
            }else{
                // 通过js来实现烟花的绽放
                //创建一个IMG 元素 在添加到app中去
                let imgobj= document.createElement("img")
                //设置图片的地址
                imgobj.src="./fire.png"
                imgobj.onload=function(e){
                    //设置图片的位置
                    this.style.position="absolute"
                    //随机值
                    let size =getImgSizeArea(600,200)
                    this.style.top=getBodyHeightRand(size)+"px"
                    this.style.left=getBodyWidthRand(size)+"px"
                    this.style.width=size+"px"
                    this.style.height=size+"px"
                    //添加绽放的动画
                    this.classList.add("aniAvtive")
                    console.log(this.style.top,this.style.left);
                    setTimeout(()=>{
                        this.style.display='none'
                    },2000)
                    document.body.appendChild(this)
                }
            }
        }
        //自动生成绽放的烟花
        let timer = setInterval(()=>{
            makeFireFlower()
        },500)

        //获取
        let butobj=document.querySelector(".but")
        butobj.onclick=function(){
            clearInterval(timer)
        }
        let startobj=document.querySelector(".start")
        startobj.onclick=function(){
            timer = setInterval(()=>{
                makeFireFlower()
            },500)
        }


        //手动绽放
        document.body.onclick=function(e){
            makeFireFlower()
        }

        //优化性能 定时清楚无用的img
        //此方式 需要调用定时器 ,不停的创建和删除元素 有性能浪费
        //优化成了 节点利用
        // let timer1 = setInterval(()=>{
        //     if (document.body.children.length>=7) {
        //         document.body.removeChild(document.body.children[0])
        //     }
        // },500)



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

功能拆分

获取随机值 在视口可见区域

//返回随机值的函数
function getBodyWidthRand(size){
     //获取body的宽高
     let bodyObj=document.querySelector("body")
     let w=bodyObj.clientWidth-size
     return Math.ceil(Math.random()*w)
 }
 function getBodyHeightRand(size){
     //获取body的宽高
     let bodyObj=document.querySelector("body")
     let h=bodyObj.clientHeight-size
     return Math.ceil(Math.random()*h)
 }

返回随机的图片大小范围

function getImgSizeArea(max,min){

    return Math.ceil(Math.random()*(max-min)+min)
}

生成img 插入body中

 function makeFireFlower(){
   //性能优化 节点利用
    if (document.body.children.length>=10) {
        //获取第一个我node的img
        let list=Array.from(document.body.children)
        for (let i = 0; i < list.length; i++) {
           if (list[i].style.display==="none") {
                list[i].style.display="block"
                //设置图片的位置
                list[i].style.position="absolute"
                //随机值
                let size =getImgSizeArea(600,200)
                list[i].style.top=getBodyHeightRand(size)+"px"
                list[i].style.left=getBodyWidthRand(size)+"px"
                list[i].style.width=size+"px"
                list[i].style.height=size+"px"
                setTimeout(()=>{
                    list[i].style.display='none'
                },2000)
                return
           }
        }
    }else{
        // 通过js来实现烟花的绽放
        //创建一个IMG 元素 在添加到app中去
        let imgobj= document.createElement("img")
        //设置图片的地址
        imgobj.src="./fire.png"
        imgobj.onload=function(e){
            //设置图片的位置
            this.style.position="absolute"
            //随机值
            let size =getImgSizeArea(600,200)
            this.style.top=getBodyHeightRand(size)+"px"
            this.style.left=getBodyWidthRand(size)+"px"
            this.style.width=size+"px"
            this.style.height=size+"px"
            //添加绽放的动画
            this.classList.add("aniAvtive")
            console.log(this.style.top,this.style.left);
            setTimeout(()=>{
                this.style.display='none'
            },2000)
            document.body.appendChild(this)
        }
    }
}

自动执行make烟花的函数

 //自动生成绽放的烟花
 let timer = setInterval(()=>{
      makeFireFlower()
  },500)

效果

在这里插入图片描述

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

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

相关文章

AI多模态模型架构之输出映射器:Output Projector

〔探索AI的无限可能&#xff0c;微信关注“AIGCmagic”公众号&#xff0c;让AIGC科技点亮生活〕 本文作者&#xff1a;AIGCmagic社区 刘一手 前言 AI多模态大模型发展至今&#xff0c;每年都有非常优秀的工作产出&#xff0c;按照当前模型设计思路&#xff0c;多模态大模型的…

QChart笔记6:显示点的值、显示点坐标值

在QChart笔记2: 添加鼠标悬停显示和格式处理_qchart 折线图 响应鼠标显示数据-CSDN博客上修改而来。 在笔记2中&#xff0c;通过鼠标悬停的方式显示了坐标轴Y的值&#xff0c;如果要一直显示应该怎么写呢&#xff1f;比如要达到下面的效果。 核心是这句&#xff1a; series1-…

Windows10安装——制作U盘启动盘(保姆级)

安装前准备&#xff1a; 一个不少于8G的U盘&#xff0c; 一个可以上网的windows电脑&#xff1b; 第一步&#xff1a;安装启动盘制作工具 首先我们下载启动盘制作工具&#xff0c; 官网网址&#xff1a;下载 Windows 10 (microsoft.com)&#xff1b; 百度网盘下载&#xf…

赛氪网受邀参加中国国际科技促进会第五届第五次常务理事扩大会议

2024年7月27日&#xff0c;环球赛乐&#xff08;北京&#xff09;科技有限公司&#xff08;以下简称“赛氪网”&#xff09;受邀参加了中国国际科技促进会第五届第五次常务理事扩大会议。此次会议汇聚了众多科技界的精英和专家&#xff0c;共同探讨科技发展的新方向&#xff0c…

【Mybatis】xml 配置文件

Mybatis的开发有两种方式&#xff1a; 注解XML 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。 如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置文件中。在Mybatis中使用XML映射文件方式开…

Cxx primer-chap10-Generic Algorithms

generic algorithms的解释&#xff1a;&#xff0c;具体而言iterator使得算法与容器类型无关&#xff1a;&#xff0c;但算法的实现成功与否有时依赖于&#xff08;element type&#xff09;元素类型&#xff1a;通用算法的实现依赖于iterator&#xff0c;具体而言algorithm –…

python windows环境部署

在官网安装www.python.org linux系统的只能编译安装 windows的可以直接安装 这里是windows安装 .3.9.6版本 一直下一步就可以&#xff0c;然后鼠标右键在按住shift用终端打开 输入py或者python验证一下是否安装成功 打开目录文件夹 在里面新建一下pip的文件夹&#xff0c;里…

OpenAI开发了一种新方法来教授AI模型与安全政策保持一致

OpenAI 宣布了一种新的方法来教授人工智能模型与安全政策保持一致&#xff0c;这种方法被称为"基于规则的奖励"&#xff08;Rules Based Rewards&#xff09;。据 OpenAI 安全系统负责人 Lilian Weng 介绍&#xff0c;基于规则的奖励&#xff08;RBR&#xff09;可以…

【研发日记】Matlab/Simulink技能解锁(十一)——Stateflow中的en、du、ex应用对比

文章目录 前言 项目背景 en类型 du类型 ex类型 组合类型 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(六)——六种Simulink模型架构》 见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》 见《【研发日记】Matlab/Simul…

盘点适合新手使用的4个剪辑工具。

很多宝子们都觉得剪辑很难&#xff0c;想学习又觉得自己没有专业的剪辑知识指导&#xff0c;不好上手。那是因为不知道有这些工具&#xff0c;这4款专业的剪辑软件对新手来说简直就是福音。 1、福昕剪辑 直达链接&#xff1a;www.pdf365.cn/foxit-clip/ 这个软件的界面设置的…

cGDB 调试方法

用法总结 Ubuntu系统&#xff0c;安装cGDB sudo apt updatesudo apt install cgdb 编译代码 g -g -o example example.cpp -lpthread要确保有 -g &#xff0c;代码是调试信息编译的 启动测试&#xff1a;cgdb ./可执行文件 此处可以使用esc进入命令模式&#xff0c;vim命令上下…

生活方式酒店升势迅起,喆啡酒店缘何成为投资热点?

伴随国内消费结构转型升级&#xff0c;旅游需求持续增加。文旅部发布的《国内旅游提升计划&#xff08;2023—2025年&#xff09;》提出&#xff0c;需丰富优质旅游供给&#xff0c;并进一步提高消费者体验及满意度&#xff0c;这将为酒店行业带来更广阔的客源和更高的质量要求…

SpringBoot上传超大文件导致OOM,完美解决办法

问题描述 上传大文件报错: Caused by: java.lang.OutOfMemoryError at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123) ~[?:1.8.0_381] at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117) ~[?:1.8.0_381] …

探索Axure在数据可视化原型设计中的无限可能

在当今数字化浪潮中&#xff0c;产品设计不仅关乎美观与功能的平衡&#xff0c;更在于如何高效、直观地传达复杂的数据信息。Axure RP&#xff0c;作为原型设计领域的佼佼者&#xff0c;其在数据可视化原型设计中的应用&#xff0c;正逐步揭开产品设计的新篇章。本文将从多个维…

同声翻译怎么做?其实有这几种方法

同声翻译怎么做&#xff1f;同声翻译&#xff08;Simultaneous Interpretation&#xff09;是指在说话人讲话的同时&#xff0c;翻译人员即时将内容转换成另一种语言的过程。随着全球化的发展和技术的进步&#xff0c;同声翻译已成为跨文化交流的重要工具。那么&#xff0c;今天…

stl-priority_queue 优先队列

目录 ​编辑优先队列 头文件&#xff1a;#include《queue》&#xff1b;即可 访问&#xff1a;只能访问队首.top() 添加。push&#xff08;元素&#xff09;&#xff0c;按优先级排列 删除。pop&#xff08;&#xff09;&#xff0c;删除队首元素&#xff08;堆顶&#xff…

嵌入式初学-C语言-八

#接嵌入式初学-C语言-七# 分支结构 分支结构&#xff1a;又被称之为选择结构 选择结构的形式 多分支 语法&#xff1a; if(条件1) { 语句1; } else if(条件2) { 语句2; } ... else { 语句n1; }案例&#xff1a; #include <stdio.h> int main() { // 需求&#xff…

采购订单打开单据时表格行设置颜色

文章目录 采购订单打开单据时表格行根据条件显示背景色Python实现插件实现创建项目创建类&#xff0c;实现接口重写方法编译后挂载插件到表单插件启动开发环境进行测试单元格设置背景色行背景色 采购订单打开单据时表格行根据条件显示背景色 Python实现 import clr clr.AddR…

VitualBox虚拟机重启后配置无法保存,已安装软件变为没有安装

VitualBox虚拟机重启后虚拟机还原为上次开机的状态&#xff0c;安装的安装包配置啥的全部丢失。 按网上的配置了半天也没解决。最终用下面讨巧的办法&#xff0c;即不重启虚拟机。 我们不在重启虚拟机&#xff0c;那我们想关闭虚拟机的时候怎么办呢&#xff1f; 1、按下图所…