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

 目录

前言

开始       

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上绘制出复杂的动态图案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python-flask后端知识点

anki 简单介绍&#xff1a; 在当今信息爆炸的时代&#xff0c;学习已经不再仅仅是获取知识&#xff0c;更是一项关于有效性和持续性的挑战。幸运的是&#xff0c;我们有幸生活在一个科技日新月异的时代&#xff0c;而ANKI&#xff08;Anki&#xff09;正是一款旗舰级的学习工具…

【深度学习】环境搭建ubuntu22.04

清华官网的conda源 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ 安装torch conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia 2.2.2 conda install 指引看这里&#xff1a; ref:https://docs.nvidia.com/cuda/cuda-installatio…

高创新 | Matlab实现OOA-CNN-GRU-Attention鱼鹰算法优化卷积门控循环单元注意力机制多变量回归预测

高创新 | Matlab实现OOA-CNN-GRU-Attention鱼鹰算法优化卷积门控循环单元注意力机制多变量回归预测 目录 高创新 | Matlab实现OOA-CNN-GRU-Attention鱼鹰算法优化卷积门控循环单元注意力机制多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现OOA…

css实现各级标题自动编号

本文在博客同步发布&#xff0c;您也可以在这里看到最新的文章 Markdown编辑器大多不会提供分级标题的自动编号功能&#xff0c;但我们可以通过简单的css样式设置实现。 本文介绍了使用css实现各级标题自动编号的方法&#xff0c;本方法同样适用于typora编辑器和wordpress主题…

Qt案例 通过调用Setupapi.h库实现对设备管理器中设备默认驱动的备份

参考腾讯电脑管家-软件市场中的驱动备份专家写的一个驱动备份软件案例&#xff0c;学习Setupapi.h库中的函数使用.通过Setupapi.h库读取设备管理器中安装的设备获取安装的驱动列表&#xff0c;通过bit7z库备份驱动目录下的所有文件. 目录导读 实现效果相关内容示例获取SP_DRVIN…

计算机网络-运输层

运输层 湖科大计算机网络 参考笔记&#xff0c;如有侵权联系删除 概述 运输层的任务&#xff1a;如何为运行在不同主机上的应用进程提供直接的通信服务 运输层协议又称端到端协议 运输层使应用进程看见的好像是在两个运输层实体之间有一条端到端的逻辑通信信道 运输层为应…

Github上传大文件(>25MB)教程

0.在github中创建新的项目&#xff08;已创建可忽略这一步&#xff09; 如上图所示&#xff0c;点击New repository 进入如下页面&#xff1a; 1.下载Git LFS 下载git 2.打开gitbash 3.上传文件&#xff0c;代码如下: cd upload #进入名为upload的文件夹&#xff0c;提前…

k8s集群node节点状态为Not Ready

目录 一、Node节点Not Ready状态的可能原因 二、排查node节点状态为Not Ready的原因 一、Node节点Not Ready状态的可能原因 node节点状态为Not Ready可能的原因有&#xff1a; 1.网络插件出问题 有过安装经验的小伙伴应该很熟悉未安装网络插件的情况下node节点在集群中的状…

【MacOs】proxychains配置使用

一、开始 1. 安装proxychains 使用brew进行安装 brew install proxychains-ng没有homebrew的&#xff0c;可以使用该命令安装 /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"2. 配置代理配置文件 cd /opt/homeb…

AUTOSAR配置工具开发教程 - 开篇

简介 本系列的教程&#xff0c;主要讲述如何自己开发一套简单的AUTOSAR ECU配置工具。适用于有C# WPF基础的人员。 简易介绍见&#xff1a;如何打造AUTOSAR工具_autosar_mod_ecuconfigurationparameters-CSDN博客 实现版本 AUTOSAR 4.0.3AUTOSAR 4.2.2AUTOSAR 4.4.0 效果 …

麻雀优化算法(Sparrow Search Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 麻雀算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种受自然界麻雀群体行为启发的优化算法。想象一下&#xff0c;一…

Linux学习-网络UDP

网络 数据传输,数据共享 网络协议模型 OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&#xff08;数据报、流式&#…

esp32上PWM呼吸灯

1、什么是pwm PWM&#xff08;Pulse Width Modulation&#xff09;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在测量、通信、工控等方面。 1.1频率 单位时间内PWM方波重复的次数 1.2占空比 一个周期内…

HarmonyOS 应用开发-根据icon自适应背景颜色

介绍 本示例将介绍如何根据图片设置自适应的背景色。 效果图预览 使用说明 转换图片为PixelMap&#xff0c;取出所有像素值遍历所有像素值&#xff0c;查找到出现次数最多的像素&#xff0c;即为图片的主要颜色适当修改图片的主要颜色&#xff0c;作为自适应的背景色 实现思…

云岚到家项目

一.项目介绍 云岚到家项目是一个家政服务o2o平台&#xff0c;互联网家政是继打车、外卖后的又一个风口&#xff0c;创业者众多&#xff0c;比如&#xff1a;58到家&#xff0c;天鹅到家等&#xff0c;o2o&#xff08;Online To Offline&#xff09;是将线下商务的机会与互联网…

负荷预测 | Matlab基于TCN-BiGRU-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于TCN-BiGRU-Attention单输入单输出时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行环境matlab…

高端大气自适应全屏酷炫渐变卡片html源码图片切换特效html5源码导航引导网站源码

源码特点&#xff1a; 1&#xff1a;手工书写DIVCSS、代码精简无冗余。 2&#xff1a;自适应结构&#xff0c;全球先进技术&#xff0c;高端视觉体验。 3&#xff1a;SEO框架布局&#xff0c;栏目及文章页均可独立设置标题/关键词/描述。 4&#xff1a;附带测试数据、安装教程、…

说说对WebSocket的理解?应用场景?

一、是什么 WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于OSI模型的应用层。可在单个TCP连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通迅 客户端和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c…

flutter组件_AlertDialog

官方说明&#xff1a;A Material Design alert dialog. 翻译&#xff1a;一个材料设计警告对话框。 作者释义&#xff1a;显示弹窗&#xff0c;类似于element ui中的Dialog组件。 AlertDialog的定义 const AlertDialog({super.key,this.icon,this.iconPadding,this.iconColor,t…

c++的学习之路:18、容器适配器与反向迭代器

摘要 本文有可能讲的不是特别清楚&#xff0c;我也是初学者有的理解可能有偏差欢迎指出&#xff0c;文章末附上导图。 目录 摘要 一、什么是适配器 二、STL标准库中stack和queue的底层结构 三、deque 1、deque的原理介绍 2、deque的缺陷 四、反向迭代器 五、思维导图…