代码雨类库的实现

2023-10-26

代码雨类库的实现

电影黑客帝国有个代码雨效果 – 挺酷的,我在网上看到了使用js写的代码雨的代码,我把由函数实现的代码,改为使用类实现代码雨特效。

一、设计一个简单美化的网页且包含该有的功能

功能:

    1.一块画布 -- 实现代码雨的展示
    2. 初始化按钮 -- 让代码回到初始状态
    3. 启动/继续按钮 -- 让代码开始或者继续下
    4. 停止按钮 -- 让代码雨停止
    5. 后续可升级......

二、先写html代码

<!doctype html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>流星雨</title>
		<meta name="keywords" content="关键词,关键字">
		<meta name="description" content="描述信息">
		<style>
			body {
				margin: 0;
				overflow: hidden;
			}
			canvas {
				background:#000000;
				display: block;
			}
			
		</style>
	</head>
	<body>
		<!-- 在外层套一个大框 -->
		<div class="main center" >
			<!-- <canvas>画布 画板 画画的本子 -->
			<canvas width=600 height=450 class="center" id="canvas"></canvas>
			<!-- 3个按钮平放在画布下面 -->
			<div class="center control">
				<button type="button" id="init">初始化</button>
				<button type="button" id="start">启动/继续</button>
				<button type="button" id="stop">停止</button>
			</div>
			
		</div>
	</body>
</html>

效果图:在这里插入图片描述

三、使用css来美化页面

		<style>
			body {
				margin: 0;
				overflow: hidden;
			}
			canvas {
				background:#000000;
				display: block;
			}
			.main {
				width: 740px;
				height: 540px;
				padding: 30px;
				border-style:solid;
				border-width:1px;
			}
			.center {margin: 20px auto;}
			.control { 
				width: 600px;
				height: 60px;
			 }
			 button {
			 	width: 100px;
				height: 40px;
				font-size: 18px;
				display: block;
				float:left;
				margin: 10px 50px;
			 }
			
		</style>

效果图:在这里插入图片描述

四、使用js实现代码雨功能

1.实现启动/继续按钮的功能代码

<script>
 // 名称:代码雨类
class CodeRain {
    //定义属性
    //设置文字大小 
    fontSize = 14;
    //计算一行有多少个文字 取整数 向下取整
    clos = Math.floor(canvas.width/this.fontSize);
    //思考每一个字的坐标
    //创建数组把clos 个 0 (y坐标存储起来)
    drops = new Array(this.clos).fill(0);
    str = "qwertyuiopasdfghjklzxcvbnm";
    clear = null;
    timer = false;
    init = false;

    constructor(canvas) {
    this.canvas = document.getElementById(canvas);
    this.ctx = this.canvas.getContext("2d");
  }

  //开启流星雨方法
  rain = () =>{
    if (this.timer === false) {
        //定义一个定时器,每隔50毫秒执行一次
        this.clear = setInterval(this.drawString,50);
        this.timer = true;
        this.init = true;
    }
  }

  //绘制文字
  drawString = () => {
    //给矩形设置填充色
    this.ctx.fillStyle="rgba(0,0,0,0.05)";
    //绘制一个矩形
    this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height);

    //添加文字样式
    this.ctx.font = "600 "+this.fontSize+"px 微软雅黑";
    //设置文字颜色
    this.ctx.fillStyle = "#00ff00";
    for(let i = 0;i<this.clos;i++) {
        //x坐标
        let x = i*this.fontSize;
        //y坐标
        let y = this.drops[i]*this.fontSize;
        //设置绘制文字
        this.ctx.fillText(this.str[Math.floor(Math.random()*this.str.length)],x,y);
        if(y>this.canvas.height&&Math.random()>0.99){
            this.drops[i] = 0;
        }
        // console.log(y);
        this.drops[i]++;
    }

  }

}
const coderain = new CodeRain("canvas");
document.getElementById("start").addEventListener("click", coderain.rain);
</script>

效果图:在这里插入图片描述

2.实现停止按钮的功能代码

//雨停了的方法
  rainStops = () => {
    if (this.timer === true){
        clearInterval(this.clear);
        this.timer = false;
        this.init = true;
    }
  }

效果图:在这里插入图片描述

3.实现初始化按钮的功能代码

//初始化
  init = () => {
    if (this.init === true){
        clearInterval(this.clear);
        this.timer = false;
        this.init = false;
        this.ctx.fillStyle="rgba(0,0,0)";
        //绘制一个矩形
        this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height);
        this.drops.fill(0);
    }
  }

效果图:在这里插入图片描述

五、完整代码

<!doctype html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>流星雨</title>
		<meta name="keywords" content="关键词,关键字">
		<meta name="description" content="描述信息">
		<style>
			body {
				margin: 0;
				overflow: hidden;
			}
			canvas {
				background:#000000;
				display: block;
			}
			.main {
				width: 740px;
				height: 540px;
				padding: 30px;
				border-style:solid;
				border-width:1px;
			}
			.center {margin: 20px auto;}
			.control { 
				width: 600px;
				height: 60px;
			 }
			 button {
			 	width: 100px;
				height: 40px;
				font-size: 18px;
				display: block;
				float:left;
				margin: 10px 50px;
			 }
			
		</style>
	</head>
	<body>
		<!-- 在外层套一个大框 -->
		<div class="main center" >
			<!-- <canvas>画布 画板 画画的本子 -->
			<canvas width=600 height=450 class="center" id="canvas"></canvas>
			<!-- 3个按钮平放在画布下面 -->
			<div class="center control">
				<button type="button" id="init">初始化</button>
				<button type="button" id="start">启动/继续</button>
				<button type="button" id="stop">停止</button>
			</div>

			<script>
			 // 名称:代码雨类
			class CodeRain {
				//定义属性
				//设置文字大小 
				fontSize = 14;
				//计算一行有多少个文字 取整数 向下取整
				clos = Math.floor(canvas.width/this.fontSize);
				//思考每一个字的坐标
				//创建数组把clos 个 0 (y坐标存储起来)
				drops = new Array(this.clos).fill(0);
				str = "qwertyuiopasdfghjklzxcvbnm";
				clear = null;
				timer = false;
				init = false;

				constructor(canvas) {
			    this.canvas = document.getElementById(canvas);
			    this.ctx = this.canvas.getContext("2d");
			  }

			  //开启流星雨方法
			  rain = () =>{
			  	if (this.timer === false) {
			  		//定义一个定时器,每隔50毫秒执行一次
					this.clear = setInterval(this.drawString,50);
					this.timer = true;
					this.init = true;
					console.log('rain');
			  	}
			  }

			  //雨停了的方法
			  rainStops = () => {
			  	if (this.timer === true){
			  		clearInterval(this.clear);
			  		this.timer = false;
			  		this.init = true;
			  		console.log('rainStops');
			  		console.log(this.clear);
			  	}
			  }

			  //初始化
			  init = () => {
			  	if (this.init === true){
			  		clearInterval(this.clear);
			  		this.timer = false;
			  		this.init = false;
			  		this.ctx.fillStyle="rgba(0,0,0)";
				    //绘制一个矩形
				    this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height);
				    this.drops.fill(0);
				    console.log('init');
			  	}

			  }

			  //绘制文字
			  drawString = () => {
			  	//给矩形设置填充色
			    this.ctx.fillStyle="rgba(0,0,0,0.05)";
			    //绘制一个矩形
			    this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height);

			    //添加文字样式
			    this.ctx.font = "600 "+this.fontSize+"px 微软雅黑";
			    //设置文字颜色
			    this.ctx.fillStyle = "#00ff00";
			    for(let i = 0;i<this.clos;i++) {
			    	//x坐标
			        let x = i*this.fontSize;
			        //y坐标
			        let y = this.drops[i]*this.fontSize;
			        //设置绘制文字
			        this.ctx.fillText(this.str[Math.floor(Math.random()*this.str.length)],x,y);
			        if(y>this.canvas.height&&Math.random()>0.99){
			            this.drops[i] = 0;
			        }
			        // console.log(y);
			        this.drops[i]++;
			    }
			    
			  }

			}
			const coderain = new CodeRain("canvas");
			document.getElementById("init").addEventListener("click", coderain.init);
			document.getElementById("start").addEventListener("click", coderain.rain);
			document.getElementById("stop").addEventListener("click", coderain.rainStops);
			</script>	
		</div>
	</body>
</html>

博文参考

简单JS打造酷炫代码雨(黑客高逼格)| 脚本之家

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

代码雨类库的实现 的相关文章

  • 使用 javascript 在 IFrame 中打印 PDF 文件仅获取一页

    这是我打印 pdf 文件的代码 在这里 在打印时我只得到一页 我需要一个解决方案 function printPdf var ifr document getElementById frame1 PDF is completely load
  • 在全局范围内查找 JavaScript 函数

    有没有办法在当前活动的对象模型中搜索 JavaScript 属性 例如命名函数 Firebug 在 DOM 选项卡上显示的内容 我在 Chrome 开发人员工具中找不到直接等效项 加载页面 使用主要浏览器的通用开发人员工具 一个例子是 我搜
  • HTML5 画布在缩放和旋转后平移

    我正在尝试用画布做一些事情 首先 我让用户上传图像 如果图像比我想要的大 我需要将其缩小 那部分工作得很好 最近我们遇到了 iPhone 用户上传图像的问题 这些都存在方向问题 我已经弄清楚如何提取方向 我的问题是当我操纵画布中的图像时会发
  • 在 MongoDB 中对 Null 值进行最后排序

    我使用以下查询根据名为 sortIndex 的字段按升序填充 MongoDB 中的项目 有时 数据库中的项目没有 sortIndex 字段 通过以下查询 具有 null sortIndex 的项目显示在顶部 我想知道如何让它们显示在底部 我
  • 由于运行 Javascript,Firefox 选择下拉列表不断刷新/恢复为默认选项 - AngularJS

    我正在 AngularJS 中构建一个应用程序 但在使用 Firefox 时无法选择下拉菜单 当我单击选择菜单并将鼠标悬停在选项上时 它会将所选选项从光标悬停的选项重置为默认 第一个选项 当选项数量很大时 选择正确的选项变得非常困难 该应用
  • 错误 [ERR_UNSUPPORTED_DIR_IMPORT]:尝试在本地启动 Nodejs 应用程序时导入目录

    我在尝试将我的应用程序部署到 Heroku 时陷入了一个循环 我的进口声明 例如import cors from cors 由于 无法在 Common JS 中加载 ES6 模块 错误 似乎阻止了应用程序在生产环境中启动 在本地运行得很好
  • CSS 列不会水平对齐

    我正在使用列计数来允许我的文本流入两个不同的列 但第一列的顶部 最左边 低于另一列 col moz column count 2 webkit column count 2 column count 2 div h3 Options h3
  • 量角器检查元素是否不存在

    我在基于角度的网站中有一个设置可以打开和关闭下拉菜单 如果关闭 则不会显示在主页上 对于量角器 我需要检查开关关闭时该元素是否不存在 但是 我不应该陷入 未找到元素 错误 因为它是一组许多测试中的一个 我该怎么做 我曾尝试这样做 expec
  • 容器中的等间距 div

    这是我的例子 http jsfiddle net rtCP3 62 http jsfiddle net rtCP3 62 我有 3 个 或更多 div 我想在一个容器中均匀分布 当将 Angular 与 ng repeat 一起使用时 样式
  • css 变换,chrome 中的锯齿状边缘

    我一直在使用 CSS3 转换来旋转网站中带有边框的图像和文本框 问题是 Chrome 中的边框看起来呈锯齿状 就像没有抗锯齿的 低分辨率 游戏一样 在 IE Opera 和 FF 中看起来好多了 因为使用了 AA 仍然清晰可见 但也没有那么
  • 设置 D3 力定向图

    致尊敬的读者 我对 javascript 相当陌生 我也遇到过这个问题 我正在尝试实现这个力导向图的修改版本 http mbostock github com d3 ex force html http mbostock github co
  • Javascript TypeError:无法读取未定义的属性“indexOf”

    在此代码中 我想从cart products array var cart products 17 1 19 1 18 1 var product 17 each cart products function key item if ite
  • 如何从客户端 JavaScript 调用特定的 Node.js 方法

    在我的应用程序中 我在 node js 文件中创建了许多方法 我如何从客户端 JavaScript 调用特定方法 下面是我的node js 文件 exports method1 function exports method2 functi
  • 如何使用nodejs获取目录中第一个扩展名为.txt的文件?

    我所有文件所在的目录是 usr home jordan 该目录下有很多文件 在目录本身中 但有一个文件以 txt 扩展名命名 使用nodejs和fs 我想将带有txt扩展名的第一个文件 或任何文件 放入 mytxtfilepath 中 我在
  • 不透明度如何影响元素顺序?

    我发现 CSS 有一个非常奇怪的行为opacity与浮动元素相结合 考虑以下 HTML div div Right button div div div Overlay div 最后div将覆盖前两个浮动的 删除不透明度会将最新的 div
  • 页脚没有停留在底部

    这似乎是有史以来最令人困惑的问题 至少对我来说是这样 知道这个页面 除了标题之外 都已损坏 我复制了 HTML 并尝试小心地删除 WordPress 相关的爵士乐 以便您获得该页面的 html JsBin直播页面 http jsbin co
  • JavaScript - 替换 html 字符串中的特定单词索引

    我在 JS 字符串操作方面面临着一项具有挑战性的任务 有一个 HTML 字符串 我需要在其中替换特定单词索引处的单词 单词索引是忽略 HTML 标签时单词的编号 例如 下面是 HTML 字符串 span style font family
  • 根据唯一测试提取站点地图 URL 和 cy.request() 每个 URL (Cypress) [重复]

    这个问题在这里已经有答案了 将 Cypress 与 TypeScript 结合使用 我的代码目标是提取 sitemap xml 中的所有 URL 和 cy request 每个 URL 的状态 200 这个版本的工作原理 describe
  • 手动渲染 Twig 字符串时禁用 HTML 转义

    我有以下代码将字符串呈现为 HTML 输出 如何阻止它转义 HTML 文本 template who bar params array who gt Foo s twig new Twig Environment new Twig Load
  • AngularJS 中的全局模拟对象用于 jasmine/karma 测试

    我有一个正在模拟进行单元测试的对象 基本上在我的测试文件中 我将其模拟如下 var mockObject mockMethod1 function return true mockMethod2 function return true b

随机推荐

  • I18N多文件数据参数动态获取

    在我们的项目中 控制层获取信息 没有用到ResourceBundle getBundle 而是labelcode 的方式 java I18N 如果有多个配置文件 是怎么读取这些信息的 在控制层怎么读取出相对应的信息出来 参数properti
  • 从零开始学web开发之html5-h5概述

    前言 为了掌握多一门技术 于是开始了学习前端技术的脚步 虽然安卓还是没有深入地学习一些比较高端的知识 比如view绘制原理 事件分发机制 属性动画的绘制 没有深入地研究一些流行框架 最遗憾的是没有将rxjava应用到自己的工作中 更加没有学
  • 元宇宙通证-序一:“元宇宙”和“后人类社会”

    序一 元宇宙 和 后人类社会 一 1992年 尼尔 斯蒂芬森的科幻小说 雪崩 促办 好评如潮 雪崩 描述的是脱胎于现实世界的一代互联网人对两个平行世界的感知和认识 但是 不论是做作 还是书评者 都没预见到在30年之后 此书提出的 元宇宙 M
  • 【微服务部署】四、Jenkins一键打包部署NodeJS(Vue)前端项目步骤详解

    本文介绍使用Jenkins一键将NodeJS Vue 前端项目打包并上传到生产环境服务器 这里使用的是直接打包静态页面 发送到远程服务器Nginx配置目录的方式 首先确保服务器环境配置好 安装Nginx 运行目录 日志存放目录等 一 服务器
  • Flutter GetX 状态管理,路由管理,智能依赖注入

    直接上网址 GetX 关于GetX GetX 是 Flutter 上的一个轻量且强大的解决方案 高性能的状态管理 智能的依赖注入和便捷的路由管理 GetX 有3个基本原则 性能 GetX 专注于性能和最小资源消耗 GetX 打包后的apk占
  • java 工具篇(MySQL数据库工具) 数据库实体创建

    第一步 生成工具源代码 package com mysql util import java io File import java io FileWriter import java io IOException import java
  • Linux内核开发三:多进程编程

    1 什么是进程 我们可以通俗地把进程看作是正在运行着的二进制程序 占用内存空间消耗系统资源 例如使用 vim 命令编辑文件内容就会生成一个进程 进程是 OS 资源分配的基本单位 每个进程在操作系统中都执行着特定的任务 如网络服务 etc i
  • shell拷贝mongodb数据库

    拷贝mongodb数据库 mongodump h 服务器IP port 端口 u 用户名 p 密码 d 数据库 o 导出路径 h MongoDB 所在服务器地址 例如 127 0 0 1 当然也可以指定端口号 127 0 0 1 27017
  • VS2019 无法登录 许可证已过期 无法下载许可证

    许可证已过期 点击检查更新的许可证 报出错误 我们无法下载许可证 请检查你的网络连接或代理设置 解决方法 其实问题就在于嵌入式web浏览器的问题 选择账户选项 账户 登录选项 将嵌入式web浏览器改为系统web浏览器 随后就能登录了
  • Android底层驱动开发记录:01_JNI

    最近项目中需要用到了Android底层的开发 正好疫情居家所以又把韦老师的老教程第四期Android教程翻出来学习学习 手边也没有合适的板子 找了一块AIO 3288C的板子接了一块HDMI的屏来用 本来之前一直做单片机的 因此学起来还比较
  • 宝塔漏洞复现

    声明 好好学习 天天向上 漏洞描述 宝塔面板是一款服务器管理软件 支持windows和linux系统 可以通过Web端轻松管理服务器 提升运维效率 例如 创建管理网站 FTP 数据库 拥有可视化文件管理器 可视化软件管理器 可视化CPU 内
  • QT中的信号和槽函数

    一 信号和槽机制 1 概念 信号和槽是Qt中自行定义的一种通信机制 实现对象之间的交互 当某个对象发生改变时将会发送信号 该信号可以被其它对象接收 接收以后将执行一个指定的成员函数 槽函数 图解 2 定义 1 包含信号或槽的类必须是QObj
  • GET请求与POST请求的区别

    1 安全性 GET请求通过拼接url传递参数 会在url地址栏显示 相对不安全 POST请求通过body体传递参数 不会在url地址栏中显示 相对安全 2 传输数据大小 GET请求对传输的数据大小有限制 最多2K POST请求对传输的数据大
  • 练手小项目:51单片机控制的智能台灯设计(自动感应调光) 电路图,测试图,源代码全技术资料

    功能及概述 本系统组成如图一所示 主要由三部分组成 传感器及信号处理部分 检测人体辐射红外信号及光强信号经过处理后变成可处理的数字信号 以80C51组成的中央处理单元 处理信号并发出控制命令 提醒电路及灯光控制电路 给出提醒信号并根据80C
  • vue3基础 ---- 上

    目录 一 vue3介绍 1 官网初识 2 环境搭建 2 1 线上尝试 2 2 CDN使用 2 3 Vue CLI 2 4 Vite 二 vue3基础 1 模板语法 1 1 我的第一个vue应用 1 2 应用背后的真相 1 3 模板语法 新的
  • API 治理的目标是什么?

    建立有效的API治理需要正确理解其目标 但它究竟是什么呢 是定义标准或规则并应用它们吗 都不是 虽然这些是治理的一个重要手段 但这并非其最终目的 为了揭示API治理的真正目标 让我们探讨一下在适当地制定标准后能得到什么 1 从 API 混乱
  • Jetty服务器好处

    Jetty可以同时处理大量连接而且可以长时间保持连接 适合于web聊天应用等等 Jetty的架构简单 因此作为服务器 Jetty可以按需加载组件 减少不需要的组件 减少了服务器内存开销 从而提高服务器性能 Jetty默认采用NIO结束在处理
  • python中sys是什么意思_python里的sys是什么意思

    sys模块功能多 我们这里介绍一些比较实用的功能 相信你会喜欢的 和我一起走进python的模块吧 sys模块的常见函数列表 sys argv 实现从程序外部向程序传递参数 sys exit arg 程序中间的退出 arg 0为正常退出 s
  • ubuntu配置mysql网络连接_在Ubuntu14.04中配置mysql远程连接教程

    上一篇文章 小编带大家学会了在Ubuntu14 04中安装MySQL 没有来得及上课的小伙伴们可以戳这篇文章 如何在Ubuntu14 04中安装mysql 今天给大家分享一下 如何简单的配置MySQL 可以实现远程连接 具体的教程如下 1
  • 代码雨类库的实现

    代码雨类库的实现 电影黑客帝国有个代码雨效果 挺酷的 我在网上看到了使用js写的代码雨的代码 我把由函数实现的代码 改为使用类实现代码雨特效 一 设计一个简单美化的网页且包含该有的功能 功能 1 一块画布 实现代码雨的展示 2 初始化按钮