HTML烟花特效,除夕快到了,把它收藏下来,过年和最重要的她一起看烟花。

2023-11-03


前言

最近随着电视剧《点燃我温暖你》的火热播出,剧中帅气学霸李洵的炫酷爱心代码也迅速火出了圈,爱心素材异常火爆,烟花也异常火爆,毕竟在这绿色生态发展下,烟花也越来越少~,快过年了,把它收藏下来,除夕和最重要的她一起看烟花。


一、效果图

在这里插入图片描述

二、操作步骤

第一步

复制文章底部源码

第二步

在桌面右键新建文本文档

在这里插入图片描述

第三步

打开新建文本,把复制的源码粘贴进去

在这里插入图片描述
在这里插入图片描述

第四步

关闭保存新建文本文档,右键重命名

在这里插入图片描述

后缀txt改为html

在这里插入图片描述

出现下列弹框点击是

在这里插入图片描述

第五步

打开文件
在这里插入图片描述

第六步

通过聊天软件把他发送给自己最重要的人,打开之后点击会有音乐。


源码

<!DOCTYPE html>
<html lang="en">

<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>烟花</title>
    <style>
        html,
        body {
            margin: 0px;
            width: 100%;
            height: 100%;
            overflow: hidden;
            background: #000;
        }
        
        span,
        ul {
            color: #fff;
        }
    </style>

</head>

<body>
    <canvas id="canvas" style="position:absolute;width:100%;height:100%;z-index:8888"></canvas>
    <canvas style="position:absolute;width:100%;height:100%;z-index:9999" class="canvas"></canvas>
    <script>
        function initVars() {

            pi = Math.PI;
            ctx = canvas.getContext("2d");
            canvas.width = canvas.clientWidth;
            canvas.height = canvas.clientHeight;
            cx = canvas.width / 2;
            cy = canvas.height / 2;
            playerZ = -25;
            playerX = playerY = playerVX = playerVY = playerVZ = pitch = yaw = pitchV = yawV = 0;
            scale = 600;
            seedTimer = 0;
            seedInterval = 5, seedLife = 100;
            gravity = .02;
            seeds = new Array();
            sparkPics = new Array();
            s = "https://cantelope.org/NYE/";
            for (i = 1; i <= 10; ++i) {
                sparkPic = new Image();
                sparkPic.src = s + "spark" + i + ".png";
                sparkPics.push(sparkPic);
            }
            sparks = new Array();
            pow1 = new Audio(s + "pow1.ogg");
            pow2 = new Audio(s + "pow2.ogg");
            pow3 = new Audio(s + "pow3.ogg");
            pow4 = new Audio(s + "pow4.ogg");
            frames = 0;
        }

        function rasterizePoint(x, y, z) {

            var p, d;
            x -= playerX;
            y -= playerY;
            z -= playerZ;
            p = Math.atan2(x, z);
            d = Math.sqrt(x * x + z * z);
            x = Math.sin(p - yaw) * d;
            z = Math.cos(p - yaw) * d;
            p = Math.atan2(y, z);
            d = Math.sqrt(y * y + z * z);
            y = Math.sin(p - pitch) * d;
            z = Math.cos(p - pitch) * d;
            var rx1 = -1000,
                ry1 = 1,
                rx2 = 1000,
                ry2 = 1,
                rx3 = 0,
                ry3 = 0,
                rx4 = x,
                ry4 = z,
                uc = (ry4 - ry3) * (rx2 - rx1) - (rx4 - rx3) * (ry2 - ry1);
            if (!uc) return {
                x: 0,
                y: 0,
                d: -1
            };
            var ua = ((rx4 - rx3) * (ry1 - ry3) - (ry4 - ry3) * (rx1 - rx3)) / uc;
            var ub = ((rx2 - rx1) * (ry1 - ry3) - (ry2 - ry1) * (rx1 - rx3)) / uc;
            if (!z) z = .000000001;
            if (ua > 0 && ua < 1 && ub > 0 && ub < 1) {
                return {
                    x: cx + (rx1 + ua * (rx2 - rx1)) * scale,
                    y: cy + y / z * scale,
                    d: Math.sqrt(x * x + y * y + z * z)
                };
            } else {
                return {
                    x: cx + (rx1 + ua * (rx2 - rx1)) * scale,
                    y: cy + y / z * scale,
                    d: -1
                };
            }
        }

        function spawnSeed() {

            seed = new Object();
            seed.x = -50 + Math.random() * 100;
            seed.y = 25;
            seed.z = -50 + Math.random() * 100;
            seed.vx = .1 - Math.random() * .2;
            seed.vy = -1.5;
            seed.vz = .1 - Math.random() * .2;
            seed.born = frames;
            seeds.push(seed);
        }

        function splode(x, y, z) {

            t = 5 + parseInt(Math.random() * 150);
            sparkV = 1 + Math.random() * 2.5;
            type = parseInt(Math.random() * 3);
            switch (type) {
                case 0:
                    pic1 = parseInt(Math.random() * 10);
                    break;
                case 1:
                    pic1 = parseInt(Math.random() * 10);
                    do {
                        pic2 = parseInt(Math.random() * 10);
                    } while (pic2 == pic1);
                    break;
                case 2:
                    pic1 = parseInt(Math.random() * 10);
                    do {
                        pic2 = parseInt(Math.random() * 10);
                    } while (pic2 == pic1);
                    do {
                        pic3 = parseInt(Math.random() * 10);
                    } while (pic3 == pic1 || pic3 == pic2);
                    break;
            }
            for (m = 1; m < t; ++m) {
                spark = new Object();
                spark.x = x;
                spark.y = y;
                spark.z = z;
                p1 = pi * 2 * Math.random();
                p2 = pi * Math.random();
                v = sparkV * (1 + Math.random() / 6)
                spark.vx = Math.sin(p1) * Math.sin(p2) * v;
                spark.vz = Math.cos(p1) * Math.sin(p2) * v;
                spark.vy = Math.cos(p2) * v;
                switch (type) {
                    case 0:
                        spark.img = sparkPics[pic1];
                        break;
                    case 1:
                        spark.img = sparkPics[parseInt(Math.random() * 2) ? pic1 : pic2];
                        break;
                    case 2:
                        switch (parseInt(Math.random() * 3)) {
                            case 0:
                                spark.img = sparkPics[pic1];
                                break;
                            case 1:
                                spark.img = sparkPics[pic2];
                                break;
                            case 2:
                                spark.img = sparkPics[pic3];
                                break;
                        }
                        break;
                }
                spark.radius = 25 + Math.random() * 50;
                spark.alpha = 1;
                spark.trail = new Array();
                sparks.push(spark);
            }
            switch (parseInt(Math.random() * 4)) {
                case 0:
                    pow = new Audio(s + "pow1.ogg");
                    break;
                case 1:
                    pow = new Audio(s + "pow2.ogg");
                    break;
                case 2:
                    pow = new Audio(s + "pow3.ogg");
                    break;
                case 3:
                    pow = new Audio(s + "pow4.ogg");
                    break;
            }
            d = Math.sqrt((x - playerX) * (x - playerX) + (y - playerY) * (y - playerY) + (z - playerZ) * (z - playerZ));
            pow.volume = 1.5 / (1 + d / 10);
            pow.play();
        }

        function doLogic() {

            if (seedTimer < frames) {
                seedTimer = frames + seedInterval * Math.random() * 10;
                spawnSeed();
            }
            for (i = 0; i < seeds.length; ++i) {
                seeds[i].vy += gravity;
                seeds[i].x += seeds[i].vx;
                seeds[i].y += seeds[i].vy;
                seeds[i].z += seeds[i].vz;
                if (frames - seeds[i].born > seedLife) {
                    splode(seeds[i].x, seeds[i].y, seeds[i].z);
                    seeds.splice(i, 1);
                }
            }
            for (i = 0; i < sparks.length; ++i) {
                if (sparks[i].alpha > 0 && sparks[i].radius > 5) {
                    sparks[i].alpha -= .01;
                    sparks[i].radius /= 1.02;
                    sparks[i].vy += gravity;
                    point = new Object();
                    point.x = sparks[i].x;
                    point.y = sparks[i].y;
                    point.z = sparks[i].z;
                    if (sparks[i].trail.length) {
                        x = sparks[i].trail[sparks[i].trail.length - 1].x;
                        y = sparks[i].trail[sparks[i].trail.length - 1].y;
                        z = sparks[i].trail[sparks[i].trail.length - 1].z;
                        d = ((point.x - x) * (point.x - x) + (point.y - y) * (point.y - y) + (point.z - z) * (point.z - z));
                        if (d > 9) {
                            sparks[i].trail.push(point);
                        }
                    } else {
                        sparks[i].trail.push(point);
                    }
                    if (sparks[i].trail.length > 5) sparks[i].trail.splice(0, 1);
                    sparks[i].x += sparks[i].vx;
                    sparks[i].y += sparks[i].vy;
                    sparks[i].z += sparks[i].vz;
                    sparks[i].vx /= 1.075;
                    sparks[i].vy /= 1.075;
                    sparks[i].vz /= 1.075;
                } else {
                    sparks.splice(i, 1);
                }
            }
            p = Math.atan2(playerX, playerZ);
            d = Math.sqrt(playerX * playerX + playerZ * playerZ);
            d += Math.sin(frames / 80) / 1.25;
            t = Math.sin(frames / 200) / 40;
            playerX = Math.sin(p + t) * d;
            playerZ = Math.cos(p + t) * d;
            yaw = pi + p + t;
        }

        function rgb(col) {

            var r = parseInt((.5 + Math.sin(col) * .5) * 16);
            var g = parseInt((.5 + Math.cos(col) * .5) * 16);
            var b = parseInt((.5 - Math.sin(col) * .5) * 16);
            return "#" + r.toString(16) + g.toString(16) + b.toString(16);
        }

        function draw() {

            ctx.clearRect(0, 0, cx * 2, cy * 2);

            ctx.fillStyle = "#ff8";
            for (i = -100; i < 100; i += 3) {
                for (j = -100; j < 100; j += 4) {
                    x = i;
                    z = j;
                    y = 25;
                    point = rasterizePoint(x, y, z);
                    if (point.d != -1) {
                        size = 250 / (1 + point.d);
                        d = Math.sqrt(x * x + z * z);
                        a = 0.75 - Math.pow(d / 100, 6) * 0.75;
                        if (a > 0) {
                            ctx.globalAlpha = a;
                            ctx.fillRect(point.x - size / 2, point.y - size / 2, size, size);
                        }
                    }
                }
            }
            ctx.globalAlpha = 1;
            for (i = 0; i < seeds.length; ++i) {
                point = rasterizePoint(seeds[i].x, seeds[i].y, seeds[i].z);
                if (point.d != -1) {
                    size = 200 / (1 + point.d);
                    ctx.fillRect(point.x - size / 2, point.y - size / 2, size, size);
                }
            }
            point1 = new Object();
            for (i = 0; i < sparks.length; ++i) {
                point = rasterizePoint(sparks[i].x, sparks[i].y, sparks[i].z);
                if (point.d != -1) {
                    size = sparks[i].radius * 200 / (1 + point.d);
                    if (sparks[i].alpha < 0) sparks[i].alpha = 0;
                    if (sparks[i].trail.length) {
                        point1.x = point.x;
                        point1.y = point.y;
                        switch (sparks[i].img) {
                            case sparkPics[0]:
                                ctx.strokeStyle = "#f84";
                                break;
                            case sparkPics[1]:
                                ctx.strokeStyle = "#84f";
                                break;
                            case sparkPics[2]:
                                ctx.strokeStyle = "#8ff";
                                break;
                            case sparkPics[3]:
                                ctx.strokeStyle = "#fff";
                                break;
                            case sparkPics[4]:
                                ctx.strokeStyle = "#4f8";
                                break;
                            case sparkPics[5]:
                                ctx.strokeStyle = "#f44";
                                break;
                            case sparkPics[6]:
                                ctx.strokeStyle = "#f84";
                                break;
                            case sparkPics[7]:
                                ctx.strokeStyle = "#84f";
                                break;
                            case sparkPics[8]:
                                ctx.strokeStyle = "#fff";
                                break;
                            case sparkPics[9]:
                                ctx.strokeStyle = "#44f";
                                break;
                        }
                        for (j = sparks[i].trail.length - 1; j >= 0; --j) {
                            point2 = rasterizePoint(sparks[i].trail[j].x, sparks[i].trail[j].y, sparks[i].trail[j].z);
                            if (point2.d != -1) {
                                ctx.globalAlpha = j / sparks[i].trail.length * sparks[i].alpha / 2;
                                ctx.beginPath();
                                ctx.moveTo(point1.x, point1.y);
                                ctx.lineWidth = 1 + sparks[i].radius * 10 / (sparks[i].trail.length - j) / (1 + point2.d);
                                ctx.lineTo(point2.x, point2.y);
                                ctx.stroke();
                                point1.x = point2.x;
                                point1.y = point2.y;
                            }
                        }
                    }
                    ctx.globalAlpha = sparks[i].alpha;
                    ctx.drawImage(sparks[i].img, point.x - size / 2, point.y - size / 2, size, size);
                }
            }
        }

        function frame() {

            if (frames > 100000) {
                seedTimer = 0;
                frames = 0;
            }
            frames++;
            draw();
            doLogic();
            requestAnimationFrame(frame);
        }

        window.addEventListener("resize", () => {
            canvas.width = canvas.clientWidth;
            canvas.height = canvas.clientHeight;
            cx = canvas.width / 2;
            cy = canvas.height / 2;
        });

        initVars();
        frame();
    </script>


</body>

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

HTML烟花特效,除夕快到了,把它收藏下来,过年和最重要的她一起看烟花。 的相关文章

随机推荐

  • stm32实现json格式传输/ cjson使用

    cjson是一个开源的C文件 可以实现用C语言生成json格式数据 目录 步骤1 准备工作 步骤2 cjson函数简单讲解 步骤3 一个例子 生成json格式数据 步骤1 准备工作 在keil里添加cjson c和cjson h cjson
  • linux下生成高强度密码的四大神器

    导读 安全是一个大的话题 给服务器设置一个高强度的密码是非常重要的 你可能会疑惑一个高强度的密码究竟是什么样的呢 怎么才能生成一个那样的密码呢 不用担心下面我们将介绍 4 种简单方法让你在 Linux 中生成一个高强度密码 1 在 Linu
  • CentOS 6和CentOS 7的磁盘空间清理

    收集整理了一些在CentOS 6或者CentOS 7服务器中 快速清理磁盘空间的方法 首先 必须先安装yum utils工具组件 yum y install yum utils 1 删除日志文件 find var name log size
  • Struts2+Spring3+Mybatis3开发环境搭建

    本文主要介绍Struts2 Spring3 Mybatis3开发环境搭建 Struts和Spring不过多介绍 MyBatis 是支持普通 SQL 查询 存储过程和高级映射的优秀持久层框架 MyBatis 消除了几乎所有的 JDBC 代码和
  • [开源之美] nanomsg -- 进程间通讯

    认识 nanomsg 这个项目 源于项目内部分享 实际分析和使用一段时间之后 确实觉得项目beautiful 先附上Git地址 nanomsg Git下载地址 nanomsg 的编译 编译很简单 没有其他第三方依赖 根据Git上编译文档可以
  • linux 格式化含义,RMAN备份FORMAT格式中%a的含义

    Oracle文档对 a的描述是 a Specifies the activation IDofthedatabase rman备份并保存 查询 a RMAN gt backup tablespace users format home or
  • Unity使用NavmeshObstacle解决多人寻路终点堵塞问题以及解决NavmeshObstacle打开抖动(瞬移)问题

    不知道为什么 就这个东西 国内各大论坛和网站就是搜不到 最终还是得谷歌 太过基础的就不讲了 问题一 在unity使用navmeshAgent进行多人寻路设置同一个终点后 所有角色都会向对应位置寻路 当前面单位到达后后面单位会一直无法到达导致
  • kiki's game

    http acm hdu edu cn showproblem php pid 2147 Problem Description Recently kiki has nothing to do While she is bored an i
  • Python 全栈系列217 Nginx负载均衡MongoAgent

    说明 虽然不想在完成量化系统的构建前再去分叉搞别的东西 但是在批量计算指标时需要频繁的使用MongoAgent 而这个服务只能做成单线程异步的 所以计算60万次指标需要2 3天时间 考虑到之后可能会有重刷的情况 所以我想还是给MongoAg
  • 被监督写博客-Day7

    今天在ctftime上找了比赛 但是吧 不太行 只能等着明天结束后的wp了 回归刷题日常 题目一 极客大挑战 2019 HardSQL 说真的 真的不喜欢SQL注入的题 打开题目后又是熟悉的界面 看了wp说是报错注入 学习一下两个函数 up
  • jmeter windows 安装指导

    软件安装 Windows安装 软件下载 进入官网 http jmeter apache org 直接下载zip包 下载后直接解压 eg我的解压路径如下 D Program Files apache jmeter 5 5 bin jdk安装
  • 用C++进行设计模式解析和实现

    http c chinaitlab com special sjms Index html 用C 进行设计模式解析和实现
  • 【精】HDFS的HA系列(一)--- 背景、架构

    本文作为HDFS HA系列的第一篇文章 主要简单描述一下HDFS HA的产生背景和整体架构 同时也会对后续系列文章要讲解的内容列出一个大致提纲 一 Hadoop HA背景 单点故障 英语 single point of failure 缩写
  • RabbitMQ快速实战与集群架构详解

    RabbitMQ 1 MQ介绍 1 1 什么是MQ 为什么要用MQ 1 2 MQ的优缺点 1 3 几大MQ产品特点比较 2 Rabbitmq安装 2 1 实验环境 2 2 版本选择 2 3 安装Erlang语言包 2 4 安装RabbitM
  • FFT算法实现

    关于FFT算法的原理这里就不多说了 具体参考有关书籍 DFT与FFT运算量的比较 N点DFT的运算量 复数乘法 复数加法 一个X k N N 1 N个X k N点DFT N N N N 1 N点FFT的运算量 复数乘法 复数加法 N个X k
  • 单片机毕业设计 NodeMCU使用mpu6050惯性传感器

    文章目录 1 简介 MPU6050传感器 引脚连接 相关代码 6 最后 1 简介 Hi 大家好 学长今天向大家介绍 NodeMCU如何使用mpu6050惯性传感器 MPU6050传感器 MPU6050传感器是一个集成了6轴运动跟踪装置的模块
  • LLVM汇编语言指导手册之标识符简介

    标识符 Identifier LLVM的标识符以两种基本的类型存在 全局的和局部的 全局标识符 函数 全局变量 以 字符开始 局部标识符 寄存器名字 类型 以 字符开始 另外 还有三种不同的标识符格式 各有自己的用途 1 指定的 即自己定义
  • Banner————闭组会议总结

    闭组会议总结 一 开场 二 各负责人讲话 三 这学期的感受 四 总结 一 开场 因小组被选为发现杯考场 所以我们在1311小教室举行了这次闭组会议 第一次参加闭组会议 嘿嘿 既激动又有些些伤感 我也不知道激动啥 伤感嘛 就是感觉像要分别一样
  • 一首特别适合冥想的音乐

    这大概是我听过最适合冥想的音乐了 Sudha E Hia Ai 闭上你的双眼 静静地感受当下 感受自己的呼吸 吸气 呼气 如果分心了 回来就好
  • HTML烟花特效,除夕快到了,把它收藏下来,过年和最重要的她一起看烟花。

    文章目录 前言 一 效果图 二 操作步骤 第一步 第二步 第三步 第四步 第五步 第六步 源码 前言 最近随着电视剧 点燃我温暖你 的火热播出 剧中帅气学霸李洵的炫酷爱心代码也迅速火出了圈 爱心素材异常火爆 烟花也异常火爆 毕竟在这绿色生态