HTML粉色烟花秀

news2024/9/21 11:11:44

图片

目录

系列文章

写在前面

完整代码

代码分析

写在最后


系列文章

序号目录
1HTML满屏跳动的爱心(可写字)
2HTML五彩缤纷的爱心
3HTML满屏漂浮爱心
4HTML情人节快乐
5HTML蓝色爱心射线
6HTML跳动的爱心(简易版)
7HTML粒子爱心
8HTML蓝色动态爱心
9HTML跳动的爱心(双心版)
10HTML橙色动态粒子爱心
11HTML旋转爱心
12HTML爱情树
13HTML3D相册
14HTML旋转相册
15HTML基础烟花秀
16HTML炫酷烟花秀
17HTML粉色烟花秀
18HTML新春烟花
19HTML龙年大吉
20HTML圣诞树
21HTML大雪纷飞
22HTML想见你
23HTML元素周期表
24HTML飞舞的花瓣
25HTML星空特效
26HTML黑客帝国字母雨
27HTML哆啦A梦
28HTML流星雨
29HTML沙漏爱心
30HTML爱心字母雨
31HTML爱心流星雨
32HTML生日蛋糕

写在前面

马上就要到2025年喽,博主用 html 给大家准备了粉色系的跨年烟花秀,一起来看看吧~

HTML(Hypertext Markup Language)是一种标记语言,用于创建网页的结构和内容。它使用一系列标签(tag)来标记文本,以指示浏览器如何展示内容。HTML是万维网的基础技术之一,它定义了网页的结构和链接方式。

HTML的发展可以追溯到1989年,由蒂姆·伯纳斯-李(Tim Berners-Lee)创始于欧洲核子研究组织(CERN)。最初,HTML只是用于将文档链接在一起,没有表现力很强。随着互联网的发展,HTML的功能逐渐增强,可以实现各种复杂的效果。

HTML由标签构成。标签通常用尖括号表示,例如<tag>。标签可以有属性(attribute),用于指定标签的属性值。属性通常包括名称和值,以键值对的形式表示。例如,<tag attribute="value">。

HTML文档通常由头部(head)和主体(body)组成。头部包含了文档的元信息,例如标题、样式表和脚本。主体包含了文档的实际内容,例如段落、标题、图像和链接。

HTML常用的标签和功能:

1. 标题标签(<h1>到<h6>)用于定义标题的级别和重要性。

2. 段落标签(<p>)用于定义段落。

3. 链接标签(<a>)用于创建链接到其他网页或文件的超链接。

4. 图像标签(<img>)用于在网页中插入图像。

5. 列表标签(<ul>和<ol>)用于创建无序列表和有序列表。

6. 表格标签(<table>、<tr>和<td>)用于创建表格。

7. 表单标签(<form>、<input>和<button>)用于创建交互式表单。

8. 样式标签(<style>)用于定义文档的样式。

9. 脚本标签(<script>)用于在网页中嵌入JavaScript脚本。

除了这些基本功能外,HTML还支持更多的标签和功能,例如音频和视频播放、动画效果、地理定位等。此外,HTML还可以与CSS(层叠样式表)和JavaScript等技术一起使用,以实现更复杂和交互式的网页效果。

总结起来,HTML是一种用于创建网页结构和内容的标记语言。它使用标签来标记文本,并告诉浏览器如何展示内容。HTML的功能丰富多样,可以实现各种各样的网页效果。掌握HTML是学习Web开发的第一步。

完整代码

<!DOCTYPE html>
<html lang="en">
<script>
  var _hmt = _hmt || [];
  (function () {
    var hm = document.createElement("script");
    hm.src = "https://hm.baidu.com/hm.js?c923daf3182a4b0ce01878475080aadc";
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(hm, s);
  })();
</script>

<head>
  <meta charset="UTF-8">
  <title>新年快乐!</title>
</head>
<style>
  body {
    margin: 0;
    overflow: hidden;
    background: black;
  }

  canvas {
    position: absolute;
  }
</style>

<body>

  <canvas></canvas>
  <canvas></canvas>
  <canvas></canvas>

  <script>

    function GetRequest() {
      var url = decodeURI(location.search);
      var theRequest = new Object();
      if (url.indexOf("?") != -1) {
        var str = url.substr(1);
        strs = str.split("&");
        for (var i = 0; i < strs.length; i++) {
          theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
        }
      }
      return theRequest;
    }
    class Shard {
      constructor(x, y, hue) {
        this.x = x;
        this.y = y;
        this.hue = hue;
        this.lightness = 50;
        this.size = 15 + Math.random() * 10;
        const angle = Math.random() * 2 * Math.PI;
        const blastSpeed = 1 + Math.random() * 6;
        this.xSpeed = Math.cos(angle) * blastSpeed;
        this.ySpeed = Math.sin(angle) * blastSpeed;
        this.target = getTarget();
        this.ttl = 100;
        this.timer = 0;
      }
      draw() {
        ctx2.fillStyle = `hsl(${this.hue}, 100%, ${this.lightness}%)`;
        ctx2.beginPath();
        ctx2.arc(this.x, this.y, this.size, 0, 2 * Math.PI);
        ctx2.closePath();
        ctx2.fill();
      }
      update() {
        if (this.target) {
          const dx = this.target.x - this.x;
          const dy = this.target.y - this.y;
          const dist = Math.sqrt(dx * dx + dy * dy);
          const a = Math.atan2(dy, dx);
          const tx = Math.cos(a) * 5;
          const ty = Math.sin(a) * 5;
          this.size = lerp(this.size, 1.5, 0.05);

          if (dist < 5) {
            this.lightness = lerp(this.lightness, 100, 0.01);
            this.xSpeed = this.ySpeed = 0;
            this.x = lerp(this.x, this.target.x + fidelity / 2, 0.05);
            this.y = lerp(this.y, this.target.y + fidelity / 2, 0.05);
            this.timer += 1;
          } else
            if (dist < 10) {
              this.lightness = lerp(this.lightness, 100, 0.01);
              this.xSpeed = lerp(this.xSpeed, tx, 0.1);
              this.ySpeed = lerp(this.ySpeed, ty, 0.1);
              this.timer += 1;
            } else {
              this.xSpeed = lerp(this.xSpeed, tx, 0.02);
              this.ySpeed = lerp(this.ySpeed, ty, 0.02);
            }
        } else {
          this.ySpeed += 0.05;

          this.size = lerp(this.size, 1, 0.05);

          if (this.y > c2.height) {
            shards.forEach((shard, idx) => {
              if (shard === this) {
                shards.splice(idx, 1);
              }
            });
          }
        }
        this.x = this.x + this.xSpeed;
        this.y = this.y + this.ySpeed;
      }
    }

    class Rocket {
      constructor() {
        const quarterW = c2.width / 4;
        this.x = quarterW + Math.random() * (c2.width - quarterW);
        this.y = c2.height - 15;
        this.angle = Math.random() * Math.PI / 4 - Math.PI / 6;
        this.blastSpeed = 6 + Math.random() * 7;
        this.shardCount = 15 + Math.floor(Math.random() * 15);
        this.xSpeed = Math.sin(this.angle) * this.blastSpeed;
        this.ySpeed = -Math.cos(this.angle) * this.blastSpeed;
        this.hue = Math.floor(Math.random() * 360);
        this.trail = [];
      }
      draw() {
        ctx2.save();
        ctx2.translate(this.x, this.y);
        ctx2.rotate(Math.atan2(this.ySpeed, this.xSpeed) + Math.PI / 2);
        ctx2.fillStyle = `hsl(${this.hue}, 100%, 50%)`;
        ctx2.fillRect(0, 0, 5, 15);
        ctx2.restore();
      }
      update() {
        this.x = this.x + this.xSpeed;
        this.y = this.y + this.ySpeed;
        this.ySpeed += 0.1;
      }

      explode() {
        for (let i = 0; i < 70; i++) {
          shards.push(new Shard(this.x, this.y, this.hue));
        }
      }
    }

    console.log(GetRequest('val').val)

    const [c1, c2, c3] = document.querySelectorAll('canvas');
    const [ctx1, ctx2, ctx3] = [c1, c2, c3].map(c => c.getContext('2d'));
    let fontSize = 200;
    const rockets = [];
    const shards = [];
    const targets = [];
    const fidelity = 3;
    let counter = 0;
    c2.width = c3.width = window.innerWidth;
    c2.height = c3.height = window.innerHeight;
    ctx1.fillStyle = 'skyblue';
    const text = '新年快乐'
    let textWidth = 9999;

    while (textWidth > window.innerWidth) {
      ctx1.font = `900 ${fontSize--}px Arial`;
      textWidth = ctx1.measureText(text).width;
    }

    c1.width = textWidth;
    c1.height = fontSize * 1.5;
    ctx1.font = `900 ${fontSize}px Arial`;
    ctx1.fillText(text, 0, fontSize - 30);
    const imgData = ctx1.getImageData(0, 0, c1.width, c1.height);
    for (let i = 0, max = imgData.data.length; i < max; i += 4) {
      const alpha = imgData.data[i + 3];
      const x = Math.floor(i / 4) % imgData.width;
      const y = Math.floor(i / 4 / imgData.width);

      if (alpha && x % fidelity === 0 && y % fidelity === 0) {
        targets.push({ x, y });
      }
    }

    ctx3.fillStyle = 'pink';
    ctx3.shadowColor = 'pink';
    ctx3.shadowBlur = 25;


    (function loop() {
      ctx2.fillStyle = "deeppink";
      ctx2.fillRect(0, 0, c2.width, c2.height);
      counter += 1;

      if (counter % 15 === 0) {
        rockets.push(new Rocket());
      }
      rockets.forEach((r, i) => {
        r.draw();
        r.update();
        if (r.ySpeed > 0) {
          r.explode();
          rockets.splice(i, 1);
        }
      });

      shards.forEach((s, i) => {
        s.draw();
        s.update();

        if (s.timer >= s.ttl || s.lightness >= 99) {
          ctx3.fillRect(s.target.x, s.target.y, fidelity + 1, fidelity + 1);
          shards.splice(i, 1);
        }
      });

      requestAnimationFrame(loop);
    })();

    const lerp = (a, b, t) => Math.abs(b - a) > 0.1 ? a + t * (b - a) : b;

    function getTarget() {
      if (targets.length > 0) {
        const idx = Math.floor(Math.random() * targets.length);
        let { x, y } = targets[idx];
        targets.splice(idx, 1);

        x += c2.width / 2 - textWidth / 2;
        y += c2.height / 2 - fontSize / 2;

        return { x, y };
      }
    }
  </script>

</body>

</html>

修改文字

在代码的第185、186可以修改中间的文字颜色哦~

在代码的第191行可以修改背景颜色哦~

代码分析

这段代码通过HTML和JavaScript结合,创建了一个“新年快乐”主题的烟花动画,并在屏幕上显示文字“新年快乐”。其实现方式主要涉及画布(canvas)操作、火箭发射、烟花爆炸以及文字的动态生成与展示。以下是这段代码的详细分析。

一、代码结构概览

代码主要分为三部分:

  1. HTML结构:通过<canvas>标签创建三个画布,用于不同的绘图操作。
  2. CSS样式:设置画布和页面的样式,使背景为黑色,并使画布覆盖整个页面。
  3. JavaScript逻辑:核心部分,负责烟花的发射、爆炸效果以及文字的生成。

二、画布的初始化与配置

在代码中,使用了三个canvas元素,它们通过JavaScript分别绑定到三个上下文对象:ctx1ctx2ctx3,用于不同的绘制操作。

  • ctx1:负责绘制“新年快乐”文字。
  • ctx2:负责绘制火箭的飞行和烟花的爆炸效果。
  • ctx3:用于绘制烟花爆炸后的残留效果。

这三个画布通过设置宽度和高度,确保其覆盖整个窗口。c1的宽高根据文字的宽度和字体大小动态调整,以确保文字能够适应屏幕。

三、文字的生成

代码通过ctx1.fillText方法在画布上绘制“新年快乐”文字。首先,代码根据屏幕的宽度动态调整字体大小,确保文字不会超出屏幕宽度。然后,getImageData方法获取画布上的像素数据,以提取出文字的形状。

通过逐个检查像素的透明度值(alpha),代码识别出文字中每个可见部分的坐标。接着,这些坐标存储在targets数组中,作为烟花爆炸的目标点。烟花爆炸后,碎片会逐渐飞向这些目标点,最终在屏幕上组成文字“新年快乐”。

四、烟花动画

烟花动画的核心是Rocket(火箭)和Shard(烟花碎片)两个类。

  • Rocket类:代表烟花的发射过程。每个火箭有随机的初始位置和发射角度,沿着一条随机的轨迹上升。update方法用于更新火箭的位置,模拟火箭上升的运动;当火箭达到一定高度后,通过explode方法使其爆炸,生成多个Shard对象。
  • Shard类:代表烟花爆炸后的碎片。每个碎片有随机的速度和方向,在空中飞行并逐渐减速。碎片的目标是之前生成的文字的像素点,它们会逐渐朝着这些目标移动,直到到达目标点后停止。

在代码中,使用了requestAnimationFrame实现动画的平滑更新。loop函数是动画的主循环,在每一帧中都会更新火箭和碎片的位置,并重绘整个画布。

五、颜色和效果

在这段代码中,颜色的变化通过HSL色彩模型实现。每个火箭和烟花碎片都有一个随机的hue值,决定了它们的颜色。Shard类的draw方法使用ctx2.arc画圆的方法绘制每个碎片,并通过调整lightness值模拟烟花的逐渐消失效果。

此外,代码还通过shadowColorshadowBlur为爆炸后的烟花添加了阴影效果,使得爆炸显得更加闪亮逼真。

六、目标点与插值

碎片飞向文字目标点的过程使用了线性插值(lerp)算法,lerp函数用于在当前碎片位置与目标位置之间进行平滑过渡。通过不断缩小位置差距,碎片能够逐渐接近并最终停留在目标点。

七、火箭与碎片的生命周期

每个火箭和碎片都有各自的生命周期。当火箭上升到一定高度时,会自动触发爆炸,生成碎片。而每个碎片则在到达目标点或超过一定的存活时间后从数组中移除。这样可以避免画布上元素的无限增长,保证动画的性能和流畅度。

八、总结

这段代码通过使用HTML5的canvas元素,结合JavaScript中的对象和动画操作,实现了一个复杂而又美观的烟花动画。代码的核心思想是将烟花的爆炸与文字的显示相结合,通过计算每个像素点的位置,使烟花碎片能够精确地拼成文字。同时,代码还采用了多种动画技巧,如随机生成、插值算法和帧动画,确保动画的自然流畅。

写在最后

我是一只有趣的兔子,感谢你的喜欢! 

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

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

相关文章

Observability:构建下一代托管接入服务

作者&#xff1a;来自 Elastic Vishal Raj, Marc Lopez Rubio 随着无服务器&#xff08;serverless&#xff09;的引入&#xff0c;向 Elastic Cloud 发送可观察性数据变得越来越容易。你可以在 Elastic Cloud Serverless 中创建一个可观察性无服务器项目&#xff0c;并将可观察…

Netty对处理粘包和半包的支持

Netty基本介绍&#xff0c;参考 Netty与网络编程 1.1 什么是粘包拆包 例如&#xff1a;发送 ABC&#xff0c; DEF两个报文 收到ABCDEF一个报文&#xff0c;发生了粘包 收到AB&#xff0c;C&#xff0c;DEF三个报文&#xff0c;ABC发生了拆包 收到AB&#xff0c;CD&#xff…

SQL server学习01-SQL server环境配置

目录 一&#xff0c;手动下载及安装 microsoft .net framework 3.5 1&#xff0c;下载 2&#xff0c;安装 二&#xff0c;安装SQL server2014 1&#xff0c;下载 2&#xff0c;安装 3&#xff0c;启动SQL server服务 三&#xff0c;下载及安装Microsoft SQL Server…

2024华为杯研赛E题保姆级教程思路分析

E题题目&#xff1a;高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理&#xff0c;实际上&#xff0c;E题的难度相对来说较低&#xff0c;大家不用畏惧视频的处理&#xff0c;被这个吓到。实际上&#xff0c;这个不难&#xff0c;解决了视频的处理问题&#xff0c;…

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地

低代码引擎使能开发者定制低代码平台。它是低代码平台的底座&#xff0c;提供可视化搭建页面等基础能力&#xff0c;既可以通过线上搭配组合&#xff0c;也可以通过cli创建个人工程进行二次开发&#xff0c;实时定制出自己的低代码平台。适用于多场景的低代码平台开发&#xff…

周末愉快!——周复盘

加班的晚上有一个美梦&#xff01; 周末愉快简单复盘结尾 精华&#xff1a; 在这个信息爆炸的时代&#xff0c;我们的大脑每天都被无数的数据和刺激充斥&#xff0c;以至于我们常常感到应接不暇。然而&#xff0c;正如古人所言&#xff1a;“不飞则已&#xff0c;一飞冲天”&am…

物联网关组态应用案例

产品简介 拓扑未来物联网关是高集成度的物联网采集及通信装置&#xff0c;支持通过RS485串口以太网口进行数据采集&#xff0c;支持数据缓存、协议解析、边缘计算&#xff0c;Ethernet/4G/WIFI数据传输和接入云端平台。支持采集PLC、传感器、仪器仪表和各种控制器&#xff0c;…

MySQL的索引——提高查找算法的数据结构 B+树

我们MYSQL服务器是在内存中的&#xff0c;所以所有的操作也是内存级的&#xff0c;索引也是如此 我们要提高算法的效率&#xff1a;首先要用一个好的数据存储结构储存数据&#xff0c;然后结构决定算法 所以——索引的本质就是一种提高算法效率组织的数据结构 缩印的主要价值体…

【华为杯】2024数学建模研赛题目

2024数学建模研赛题目已经发布 各个赛题题目如下&#xff1a; A题 B题 C题 D题 E题 F题 赛题完整版在文末&#xff0c;点击下方名片。

【操作系统】01.冯·诺伊曼体系结构

上面这张图就是我们经常能在各种教材中看到的冯诺伊曼体系结构。我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 一、认识设备 输入设备&#xff1a; 键盘、鼠标、网卡、磁盘、摄像头…… 输出设备&a…

Java8 中一个极其强悍的新接口,很多人没用过

在开发过程中经常会使用​​if...else...​​​进行判断抛出异常、分支处理等操作。这些​​if...else...​​​充斥在代码中严重影响了代码代码的美观&#xff0c;这时我们可以利用Java 8的Function接口来消灭​​if...else...​​。 if (...){throw new RuntimeException(&qu…

深入Android UI开发:从自定义View到高级布局技巧的全面学习资料

在Android开发的世界中&#xff0c;UI设计和实现是吸引用户的关键。本文将为您介绍一套全面的Android UI开发学习资料&#xff0c;包括详细的学习大纲、PDF文档、源代码以及配套视频教程&#xff0c;旨在帮助您从自定义View到高级布局技巧&#xff0c;全面提升您的UI开发技能。…

深度学习-从零基础快速入门到项目实践,这本书上市了!!!

此书地址&#xff1a; 《【2024新书】深度学习 从零基础快速入门到项目实践 文青山 跟我一起学人工智能 机器学习算法原理代码实现教程 深度学习项目分析 深度学习 从零基础快速入门到项目实践》【摘要 书评 试读】- 京东图书 除深度学习外我还写了一本软件测试书。我大概是国…

Godot游戏如何提升触感体验

在游戏世界中&#xff0c;触感体验至关重要&#xff0c;既能极大提升玩家沉浸感&#xff0c;让其深度融入游戏&#xff0c;在操作角色或与环境互动时&#xff0c;通过触感反馈获得身临其境的真实感&#xff08;比如动作游戏中角色攻击或受击时的振动反馈&#xff0c;能使玩家更…

【OSS安全最佳实践】降低因账号密码泄露带来的未授权访问风险

如果因个人或者企业账号密码泄露引发了未经授权的访问&#xff0c;可能会出现非法用户对OSS资源进行违法操作&#xff0c;或者合法用户以未授权的方式对OSS资源进行各类操作&#xff0c;这将给数据安全带来极大的威胁。为此&#xff0c;OSS提供了在实施数据安全保护时需要考虑的…

6. Python 输出长方形,直角三角形,等腰三角形

使用Python输出长方形&#xff0c;直角三角形&#xff0c;等腰三角形 这里主要使用python语言里的循环知识&#xff0c;具体说是Python语言里的循环嵌套&#xff0c; 注意&#xff0c;在实际使用中&#xff0c;循环嵌套一般最多到达3层&#xff0c;嵌套太多会影响到程序执行。…

JavaWeb - 5 - 前端工程化

一.前后端分离开发 前后端混合开发 缺点&#xff1a;沟通成本高&#xff0c;分工不明确&#xff0c;不便管理&#xff0c;不便维护拓展 前后端分离开发 当前最为主流的开发模式&#xff1a;前后端分离 前后端分离开发中很重要的是API接口文档&#xff08;如&#xff1a;YApi&…

蓝队技能-应急响应篇Web内存马查杀JVM分析Class提取诊断反编译日志定性

知识点&#xff1a; 1、应急响应-Web内存马-定性&排查 2、应急响应-Web内存马-分析&日志 注&#xff1a;传统WEB类型的内存马只要网站重启后就清除了。 演示案例-蓝队技能-JAVA Web内存马-JVM分析&日志URL&内存查杀 0、环境搭建 参考地址&#xff1a;http…

C++函数重载完成日期类相关计算

本文内容如下&#xff1a; 1.创建类以及函数的声明2.日期加减天数1.月份天数2.函数实现 3.日期比较大小4.日期减日期1.日期的前置和后置加加2.日期减日期的实现 5.内置类型的cout和cin本文代码如下&#xff1a; 要完成日期类的相关计算要创建自定义的类型&#xff0c;然后用函数…

Java制作拼图小游戏——基础编程实战(详细代码注释与流程讲解)

目录 前言 涉及知识点 准备工具 Java开发环境 图片资源 最终效果 ——需求分析 登录界面 功能描述 需求分析 功能需求 游戏主界面 功能描述 需求分析 功能需求 游戏菜单 游戏胜利界面 框架搭建 总结 编码 编码顺序 搭建App实现程序的入口 完成User用户类和…