【HTML】简单制作一个动态变色光束花

news2024/11/26 13:55:57

 目录

前言

开始       

HTML部分

效果图

​编辑​编辑​编辑​编辑总结


前言

        无需多言,本文将详细介绍一段代码,具体内容如下:

开始       

        首先新建文件夹,创建一个文本文档,其中HTML的文件名改为[index.html],创建好后右键用文本文档打开,再把下面相对应代码填入后保存即可。

HTML部分

       这段HTML代码定义了一个网页,其中包含一个用于绘图的<canvas>元素和一个使用JavaScript编写的动态视觉效果程序。

  1. HTML结构:

    • <!doctype html>: 声明文档类型为HTML5。
    • <html>: 根元素,包含整个HTML文档。
    • <head>: 包含文档的元数据,如字符集定义(<meta charset="utf-8">)和页面标题(<title>)。
    • <style>: 内联CSS样式,定义了页面的背景颜色、隐藏滚动条以及canvas元素的样式。
    • <body>: 包含页面的可见内容,这里只有一个<canvas>元素。
  2. CSS样式:

    • body设置了黑色背景,并隐藏了滚动条。
    • canvas设置了全屏宽度和高度,绝对定位,并使其宽度和高度根据设备像素比进行缩放。
  3. JavaScript程序:

    • 使用严格模式('use strict';)来提高代码质量。
    • 定义了一个名为Scene的构造函数,用于创建和管理canvas上的视觉场景。
    • Scene构造函数初始化了一些数学常量,如圆周率(PI)和黄金比例(GOLDEN),并设置了canvas的上下文和设备像素比(dpr)。
    • Scenereset方法用于在窗口大小变化时重新设置canvas的尺寸和位置。
    • Sceneloop方法是一个动画循环,它使用requestAnimationFrame来持续更新canvas内容,创建动态视觉效果。
    • 动画中使用了各种数学计算来确定绘制元素的位置、大小和颜色。
    • 通过ctx.save()ctx.restore()来保存和恢复绘图状态,以便在绘制不同元素时保持上下文的独立性。
    • 程序最后创建了一个Scene实例,从而启动了动画效果。
<!doctype html> <!-- 声明文档类型为 HTML5 -->
<html>
<head>
<meta charset="utf-8"> <!-- 设置字符编码为 utf-8,确保页面正确显示多语言内容 -->
<title>made in lky</title> <!-- 页面标题 -->

<style>
body {
  background: #000; /* 页面背景颜色设置为黑色 */
  overflow: hidden; /* 隐藏页面滚动条 */
}

canvas {
  height: 100%; /* 画布高度占满整个浏览器窗口高度 */
  left: 0;
  position: absolute; /* 绝对定位,相对于最近的已定位的祖先元素 */
  top: 0;
  width: 100%; /* 画布宽度占满整个浏览器窗口宽度 */
}
</style>
</head>
<body>
<canvas></canvas> <!-- 创建一个空的 canvas 元素,用于后续的绘图操作 -->

<script>
'use strict'; // 启用严格模式,有助于避免代码中的错误

// 定义一个名为 Scene 的构造函数,用于创建和管理 canvas 上的场景
function _classCallCheck(instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function"); // 如果实例不是构造函数的实例,则抛出错误
  }
}

var Scene = function () {
  function Scene() {
    var _this = this; // 将当前实例赋值给 _this 变量,用于在事件监听器中引用当前实例

    // 定义一些数学常量
    this.PI = Math.PI;
    this.TAU = this.PI * 2;
    this.GOLDEN = (Math.sqrt(5) + 1) / 2;

    // 获取 canvas 元素并获取其上下文
    this.canvas = document.querySelector('canvas');
    this.ctx = this.canvas.getContext('2d');

    // 获取设备像素比,用于高清屏幕优化
    this.dpr = window.devicePixelRatio;

    // 调用 reset 方法初始化场景
    this.reset();
    // 监听窗口大小变化事件,并在变化时重新初始化场景
    window.addEventListener('resize', function () {
      return _this.reset();
    });

    // 调用 loop 方法开始动画循环
    this.loop();
  }

  // 定义 reset 方法,用于初始化场景的一些属性
  Scene.prototype.reset = function reset() {
    // 获取并设置画布的宽度和高度
    this.width = window.innerWidth;
    this.height = window.innerHeight;
    // 计算画布的中心点
    this.hwidth = this.width * 0.5;
    this.hheight = this.height * 0.5;

    // 设置 canvas 的实际尺寸,考虑设备像素比
    this.canvas.width = this.width * this.dpr;
    this.canvas.height = this.height * this.dpr;

    // 缩放 canvas 上下文,考虑设备像素比
    this.ctx.scale(this.dpr, this.dpr);

    // 将 canvas 上下文的原点移动到画布中心
    this.ctx.translate(~~this.hwidth, ~~this.hheight);

    // 设置绘制模式为 'lighter',使得新绘制的内容会与已绘制内容进行叠加
    this.ctx.globalCompositeOperation = 'lighter';

    // 设置一个 tick 变量,用于控制动画的进度
    this.tick = 320;
  };

  // 定义 loop 方法,用于执行动画循环
  Scene.prototype.loop = function loop() {
    var _this2 = this;

    // 使用 requestAnimationFrame 方法来循环执行动画
    requestAnimationFrame(function () {
      return _this2.loop();
    });

    // 递增 tick 变量
    this.tick++;

    // 清除画布,为新的绘制做准备
    this.ctx.clearRect(-this.hwidth, -this.hheight, this.width, this.height);

    // 定义一些动画参数
    var count = 150;
    var angle = this.tick * -0.001;
    var amp = 0;

    // 循环绘制动画的每个元素
    for (var i = 0; i < count; i++) {
      // 计算元素的位置和大小
      angle += this.GOLDEN * this.TAU + Math.sin(this.tick * 0.03) * 0.001;
      amp += (i - count / 2) * 0.01 + Math.cos(this.tick * 0.015) * 1;

      var x = Math.cos(angle) * amp + Math.cos(this.tick * 0.0075) * (count - i) * 0.3;
      var y = Math.sin(angle) * amp + Math.sin(this.tick * 0.0075) * (count - i) * 0.3;

      // 计算绘制的圆的半径和缩放比例
      var radius = 0.1 + i * 0.02;
      var scale = 0.1 + amp * 0.1;

      // 计算 HSLA 颜色值
      var hue = this.tick + angle / this.TAU * 0.4 + 60;
      var saturation = 90;
      var lightness = 60;
      var alpha = 0.7 + Math.cos(this.tick * 0.03 + i) * 0.3;

      // 保存当前的绘图状态
      this.ctx.save();

      // 移动画布原点到计算出的坐标
      this.ctx.translate(x, y);

      // 旋转画布
      this.ctx.rotate(angle);

      // 缩放画布
      this.ctx.scale(scale, 1);

      // 旋转画布一个额外的角度
      this.ctx.rotate(this.PI * 0.25);

      // 设置填充颜色
      this.ctx.fillStyle = 'hsla(' + hue + ', ' + saturation + '%, ' + lightness + '%, ' + alpha + ')';

      // 绘制一个填充的矩形
      this.ctx.fillRect(-radius, -radius, radius * 2, radius * 2);

      // 恢复之前的绘图状态
      this.ctx.restore();

      // 绘制一个圆的边框
      this.ctx.beginPath();
      this.ctx.arc(x, y, radius * 12, 0, this.TAU);
      this.ctx.fillStyle = 'hsla(' + hue + ', ' + saturation + '%, ' + lightness + '%, ' + alpha * 0.05 + ')';
      this.ctx.fill();
    }
  }

  return Scene;
}();

// 创建 Scene 实例并开始动画
var scene = new Scene();
</script>

</body>
</html>

效果图

总结

        这段HTML代码创建了一个全屏黑色背景的网页,并在其中嵌入了一个<canvas>元素,用于展示一个动态的视觉效果。通过内联的CSS样式,canvas被设置为占据整个视口,且没有滚动条。JavaScript部分定义了一个名为Scene的类,它通过计算数学常量和使用requestAnimationFrame来创建一个循环动画,其中包含了形状、颜色和透明度的变化,从而在canvas上绘制出复杂的动态图案。

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

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

相关文章

德兰梅尔:耐高温热销的膜元件亮相2024上海国际生物发酵展

德兰梅尔&#xff1a;耐高温热销的膜元件盛装亮相2024上海国际生物发酵展&#xff0c;8月7-9号上海新国际博览中心与您不见不散&#xff01; 据了解&#xff0c;从成立至今&#xff0c;德兰梅尔一直专注膜技术、膜产品的开发生产。在中国市场上&#xff0c;德兰梅尔刚步入中国…

SpringBoot项目 jar包方式打包部署

SpringBoot项目 jar包方式打包部署 传统的Web应用进行打包部署&#xff0c;通常会打成war包形式&#xff0c;然后将War包部署到Tomcat等服务器中。 在Spring Boot项目在开发完成后&#xff0c;确实既支持打包成JAR文件也支持打包成WAR文件。然而&#xff0c;官方通常推荐将Sp…

【SpringCloud】Nacos 配置管理

目 录 一.统一配置管理1. 在 nacos 中添加配置文件2. 从微服务拉取配置 二.配置热更新1. 方式一2. 方式二 三.配置共享1. 添加一个环境共享配置2. 在 user-service 中读取共享配置3. 运行两个 UserApplication&#xff0c;使用不同的 profile4. 配置共享的优先级5. 多服务共享配…

esp32连接wifi

1、简介 Wi-Fi设备有两种模式&#xff1a; 1.Access Point(AP) 模式&#xff0c;此为无线接入点&#xff0c;家里的光猫就是结合WiFi和internet路由功能的AP。 2.Station(STA)模式&#xff0c;此为 无线终端&#xff0c;连接到AP的装置&#xff0c;手机&#xff0c;电脑等需…

如何用matplotlib画图像的时候使用中文标签名

Matplotlib 中文显示不是特别友好&#xff0c;要在 Matplotlib 中显示中文&#xff0c;我们可以通过两个方法&#xff1a; 下载使用支持中文的字体库。设置 Matplotlib 的字体参数。 下载使用支持中文的字体库: Matplotlib 默认情况不支持中文&#xff0c;我们可以使用以下简…

大语言模型 vs 大模型

前言 有时候我们经常说行业大模型&#xff0c;医疗大模型&#xff0c;开源大模型&#xff0c;甚至用「产品大模型」的固定结构去称呼一个模型&#xff0c;例如百度的文心一言大模型&#xff0c;但是文心一言其实是大语言模型&#xff0c;大模型和大语言模型&#xff0c;差别就…

每天掌握一个软测高级技巧:接口自动化神器apin进阶操作

之前写了一篇关于接口自动化框架 apin 入门使用是文章&#xff0c;主要介绍了 apin 的安装以及用例编写的方法。 今天这篇文章来给大家聊聊&#xff0c;apin 中的一些高级使用技巧。比如依赖接口的变量提取和引用&#xff0c;用例断言&#xff0c;以及函数工具的使用。 变量提…

蓝桥杯刷题-12-公因数匹配-数论(分解质因数)不是很理解❓❓

蓝桥杯2023年第十四届省赛真题-公因数匹配 给定 n 个正整数 Ai&#xff0c;请找出两个数 i, j 使得 i < j 且 Ai 和 Aj 存在大于 1 的公因数。 如果存在多组 i, j&#xff0c;请输出 i 最小的那组。如果仍然存在多组 i, j&#xff0c;请输出 i 最小的所有方案中 j 最小的那…

12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?归并排序和快速排序

 下载APP  12 | 排序&#xff08;下&#xff09;&#xff1a;如何用快排思想在O(n)内查找第K大元素&#xff1f; 2018-10-17 王争数据结构与算法之美进入课程 讲述&#xff1a;修阳 时长21:58大小8.81M  上一节我讲了冒泡排序、插入排序、选择排序这三种排序算法&…

基于 Lambda 实现 Claude3 的流式响应

在如今的大语言模型推理输出场景中&#xff0c;流式响应基本已成为必备的功能之一。一方面符合大语言模型生成方式的本质&#xff0c;另一方面当模型推理效率不是很高时&#xff0c;流式响应比起全部 generate 后再输出、能大幅缩短从开始请求到输出第一个 Token 的时间&#x…

2024年最新可用免费云服务器整理汇总

随着云计算技术的不断发展&#xff0c;越来越多的个人和企业开始使用云服务器来满足其数据存储、网站搭建、应用开发等需求。其中&#xff0c;免费云服务器更是受到广大用户的青睐。本文将为大家整理汇总最新的可用免费云服务器资源&#xff0c;助力大家轻松享受云上之旅&#…

transform 模型常见问题

目录 transform 模型常见问题 transform 模型常见问题 1.Transformer为何使用多头注意力机制?(为什么不使用一个头) 答:多头可以使参数矩阵形成多个子空间,矩阵整体的size不变,只是改变了每个head对应的维度大小,这样做使矩阵对多方面信息进行学习,但是计算量和单个h…

Vue 引入config.js后别的js访问不到window对象下的属性

Vue项目里,我们项目配置的请求服务器地址都是在public里config.js里,如下例: 然后在index.html里引入config.js,如下图: 这里要注意的是,script的src要写上<%= BASE_URL %>,代码如下: <!DOCTYPE html> <html><head><meta charset="…

Linux虚拟网络设备深度解析:使用场景、分类与开发者指南

Linux虚拟网络设备支撑着各种复杂的网络需求和配置&#xff0c;从基础的网络桥接到高级的网络隔离和加密&#x1f510;。以下是对主要Linux虚拟网络设备的介绍、它们的作用以及适用场景的概览&#xff0c;同时提出了一种合理的分类&#xff0c;并指出应用开发人员应该着重掌握的…

qt调试日志文件生成

系列文章目录 第一章 qt日志文件生成功能 文章目录 系列文章目录前言一、qt日志文件生成功能二、使用步骤1.代码示例2.运行截图 前言 qt有固定的调试日志接口&#xff0c;可以通过终端去打印&#xff0c;但是仅适用在本地去调试&#xff0c;例如想长期放到测试台去检测&#…

Unity性能优化篇(十三) 物理优化

1.尽量使用简单的碰撞器进行碰撞检测&#xff0c;如球体碰撞器、盒子碰撞器、胶囊体碰撞器&#xff0c;少用网格碰撞器等复杂的碰撞器(如下图)。即使用多个简单的碰撞器组合在一起&#xff0c;也往往比使用网格碰撞器的性能要好。 2.如果要把多个碰撞器组合成一个碰撞器&…

网络通信三要素:IP、端口和协议

IP&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 IP&#xff1a;全程”互联网协议地址“&#xff0c;是分配给上网设备的唯一标志 IP地址有两种形式&#xff1a; IPv4&#xff1a;32位 IPv6&#xff1a;共128位。分成8段表示&#xff0c;每取四位编码成一个16进制…

matlab学习001-简单的矩阵输入及绘制信号曲线

目录 1&#xff0c;熟悉简单的矩阵输入 1.1&#xff0c;创建矩阵 1.2&#xff0c;在命令行调用文件中的变量 1.3&#xff0c;ones函数 1.4&#xff0c;who和whos的使用 2&#xff0c;绘制信号曲线 2.1&#xff0c;实指数信号 2.2&#xff0c;频率为50Hz的周期方波信号…

win11系统和ubuntu双系统首次连接网线上网流程

硬件准备 首先需要将网线连接到电脑&#xff0c;另一头可以连接交换机或者路由器 上网前需要拨号上网&#xff0c;如果是连的路由器&#xff0c;那么一台路由器上拨号一次就行了。 如果是连的交换机需要拨号上网 这里踩的第一个坑是刚开始电脑连的是交换机1又连的交换机2&…

Cali Linux上的PoshC2安装和使用

一、安装PoshC2 curl -sSL https://raw.githubusercontent.com/nettitude/PoshC2/master/Install-for-Docker.sh | sudo bash二、创建工程 posh-project -n test三、修改配置文件 posh-config将图中的baidu.com改为自己要攻击的域名或者IP地址 四、执行 posh-server 显示没…