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

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

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

相关文章

目标检测YOLO实战应用案例100讲-基于卷积神经网络的多尺度特征融合目标检测

目录 前言 存在的挑战 2 相关技术基础 2.1 卷积神经网络 2.2 损失函数

【CTF】rip--堆栈的简单认识

前言 最近在学二进制&#xff0c;准备拿BUUCTF的pwn试试手&#xff0c;还在摸索的阶段&#xff0c;有什么思路出错的地方还请指出。 解题思路 下载文件到kali&#xff0c;查看文件为 64-bit的ELF&#xff08;ELF为Linux下的可执行文件&#xff0c;相当于Windows的exe&#xff0…

python-flask后端知识点

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

GD32F470_GY-68 BMP180 新款 BOSCH温度 代替BMP085 气压传感器模块

2.23 BMP180气压传感器 1BMP180是一款高精度、小体积、低能耗的压力传感器&#xff0c;可以轻松应用在移动设备中.在测量海拔高度时&#xff0c;传统的做法是通过测量某一高度的大气压力&#xff0c;再经过换算才能得到高度数据。BMP180不仅可以实时的测量大气压力&#xff0c…

基于velero和minio实现k8s数据的备份

1.30部署minio rootk8s-harbor:/etc/kubeasz/clusters/k8s-cluster1# docker run \ -d --restartalways -p 9000:9000 -p 9090:9090 –name minio -v /data/minio/data:/data -e “MINIO_ROOT_USERadmin” -e “MINIO_ROOT_PASSWORD12345678” quay.io/minio/minio server…

Netty框架介绍并编写WebSocket服务端与客户端

一、Netty 介绍 Netty 是一个基于 Java NIO&#xff08;Non-blocking I/O&#xff0c;非阻塞 I/O&#xff09;的网络通信框架&#xff0c;旨在帮助开发者轻松地编写高性能、高可靠性的网络应用程序。由于其出色的设计和强大的功能&#xff0c;Netty 在企业级应用和开源项目中得…

智慧安防系统EasyCVR视频汇聚平台接入大华设备无法语音对讲的原因排查与解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xff0c;视频画面1、4、9、16个可选&#xff0c;支持自定义视频轮播。EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标…

不同的子序列-java

题目描述(力扣题库115): 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例 1&#xff1a; 输入&#xff1a;s "rabbbit", t "rabbit"输出&#xff1a;3 解释&#xff1a; 如下所示…

小型企业网络安全指南

许多小型企业刚刚起步&#xff0c;没有大公司所拥有的相同资源来保护其数据。他们不仅可能没有资金来支持多样化的安全计划&#xff0c;而且也可能没有人力或时间。 网络犯罪分子知道小型企业缺乏这些资源&#xff0c;并利用这些资源来谋取利益。遭受网络攻击后&#xff0c;小…

hyperf websocket

composer require hyperf/websocket-server 配置 Server 修改 config/autoload/server.php&#xff0c;增加以下配置。 <?phpreturn [servers > [[name > ws,type > Server::SERVER_WEBSOCKET,host > 0.0.0.0,port > 9502,sock_type > SWOOLE_SOCK_TCP…

2024年河北省网络建设与运维-省赛-nginx 和tomcat 服务服务步骤

题目&#xff1a; 5.nginx 和tomcat 服务 任务描述&#xff1a;利用系统自带tomcat&#xff0c;搭建 Tomcat网站。 &#xff08;1&#xff09;配置 linux2 为 nginx 服务器&#xff0c;网站目录为/www/nginx&#xff0c;默认文档 index.html 的内容为“HelloNginx”&#xf…

Rust与Go的对比

在各个领域&#xff0c;Rust 都已经成为一流的语言。最近&#xff0c;我们通过将服务的实现从 Go 切换到 Rust&#xff0c;极大地提升了该服务的性能。这里我阐述了重新实现服务为何是有价值的、该过程是如何实现的以及由此带来的性能提升。 Read States 服务 我们从 Go 切换…

01 Php学习:导学篇

Php是什么&#xff1f; PHP 是服务器端脚本语言。 PHP&#xff08;Hypertext Preprocessor&#xff09;是一种通用开源脚本语言&#xff0c;主要用于服务器端开发。PHP脚本在服务器端执行&#xff0c;生成动态网页内容或执行服务器端任务。PHP可以嵌入到HTML中&#xff0c;也…

千视携 NDI 6 轻量化媒体方案亮相北京CCBN展会

展会简介 第30届中国国际广播电视网络技术展览会&#xff08;CCBN&#xff09;将于4月24至26日在北京首钢会展中心举行。此次展会将汇集全球各大数字媒体、广播电视单位以及IT、通信技术厂商。展会重点关注数字化转型、智能媒体、融媒体等主题&#xff0c;并展示最新的5G、4K/8…

MongoDB聚合运算符:$min

文章目录 语法使用空值和缺失值的处理数组操作数的处理 举例在$group阶段使用在$setWindowFields阶段使用在$project阶段使用 $min聚合运算符用于返回最小值。$min对于不同的类型的值使用BSON的比较顺序。 $min可以用于下面的这些阶段&#xff1a; $addFields$bucket$bucketA…

【运输层】TCP 的可靠传输是如何实现的?

目录 1、发送和接收窗口&#xff08;滑动窗口&#xff09; &#xff08;1&#xff09;滑动窗口的工作流程 &#xff08;2&#xff09;滑动窗口和缓存的关系 &#xff08;3&#xff09;滑动窗口的注意事项 2、如何选择超时重传时间 &#xff08;1&#xff09;加权平均往返…

5.网络编程-socker(golang版)

目录 一、什么是socket&#xff1f; 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包&#xff0c;拆包 1.什么是粘包&#xff0c;拆包&#xff1f; 2.为什么UDP没有粘包&#xff0c;拆包&#xff1f; 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …

解决 IDEA每次打开新的项目都要重新设置maven问题

目录 一、当前项目设置maven 如下图&#xff1a; 二、设置打开的新项目的maven 如下图&#xff1a;​ 一、当前项目设置maven 对于当前项目我们都知道设置maven的配置要在 File -- Settings -- Build -- Maven 中设置 如下图&#xff1a; 二、设置打开的新项目的maven F…

Java编程题 | 数组逆序输出

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 编写一个Java程序&#xff0c;用于接收一个整数数组作为输入&#xff0c;然后逆序输出这个数组中的所有元素。 程序需要接收一个整数数组作为输入&#xff0c;然后输…

整理的微信小程序日历(单选/多选/筛选)

一、日历横向多选&#xff0c;支持单日、双日、三日、工作日等选择 效果图 wxml文件 <view class"calendar"><view class"section"><view class"title flex-box"><button bindtap"past">上一页</button&…