黑客二进制雨(html实现)

146 阅读1分钟

效果图,F11全屏效果更佳

 上代码

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>MGT-404</title>
		<style>
			* {
				margin: 0;
				padding: 0;
			}

			body {
				background: black;
			}

			canvas {
				display: block;
			}
		</style>
	</head>
	<body>
		<canvas id="ad"></canvas>
		<script>
			//获取画布对象
			var ad = document.getElementById("ad");
			//设置画布展示为2d
			var ctx = ad.getContext("2d");
			//设置canvas的宽度和高度
			ad.height = window.innerHeight;
			ad.width = window.innerWidth;
			//展示的文字
			var chinese = randomChars(num1);
			//字符串转为数组
			chinese = chinese.split("");
			//设置字体大小
			var font_size = 10;
			//计算列
			var columns = ad.width / font_size;
			//记录每列文字的y轴坐标
			var drops = [];
			//给每一个文字初始化一个起始点的位置
			for (var x = 0; x < columns; x++) drops[x] = 1;

			//绘画的函数
			function draw() {
				//布满全屏的黑色遮罩层
				ctx.fillStyle = "rgba(0, 0, 0, 0.05)";
				ctx.fillRect(0, 0, ad.width, ad.height);
				ctx.fillStyle = "#0F0";
				//设置字体样式
				ctx.font = font_size + "px arial";
				//写入画布中
				for (var i = 0; i < drops.length; i++) {
					//随机生成文字
					var text = chinese[Math.floor(Math.random() * chinese.length)];
					ctx.fillText(text, i * font_size, drops[i] * font_size);
					//如果文字的Y轴坐标大于画布的高度,1/100*colunms概率将该文字的Y轴坐标重置为0
					if (drops[i] * font_size > ad.height && Math.random() > 0.975)
						drops[i] = 0;
					//文字Y轴坐标+1
					drops[i]++;
				}
			}
			//流动速度
			setInterval(draw, 50);
		</script>
	</body>
</html>

如想实现自定义文字可以修改    var chinese = "{{修改此处为需要的文字}}",

也可以写一个随机生成字符的函数

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>MGT-404</title>
		<style>
			* {
				margin: 0;
				padding: 0;
			}

			body {
				background: black;
			}

			canvas {
				display: block;
			}
		</style>
	</head>
	<body>
		<canvas id="ad"></canvas>
		<script>
			// 生成随机个数,这里3-15个
			var num1 = (function num() {
				return Math.floor(Math.random() * 12 + 3)
			})()
			//(function 函数名())()是自执行函数

			//随机生成字母数字函数
			function randomChars(num) {
				//  字符串库
				var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
				//保存取出的字符串
				var code = "";
				//使用循环取出满足个数的字符
				while (code.length < num) {
					//通过随机数公式得到字符的下标
					var index = Math.floor(Math.random() * chars.length);
					var c = chars[index]; //随机产生的字符串
					//判断code中是否包含该字符
					if (code.indexOf(c) == -1) {
						code += c;
					}
				}
				//将得到的字符返回出去
				return code
			}

			//获取画布对象
			var ad = document.getElementById("ad");
			//设置画布展示为2d
			var ctx = ad.getContext("2d");
			//设置canvas的宽度和高度
			ad.height = window.innerHeight;
			ad.width = window.innerWidth;
			//展示的文字
			var chinese = randomChars(num1);
			//字符串转为数组
			chinese = chinese.split("");
			//设置字体大小
			var font_size = 10;
			//计算列
			var columns = ad.width / font_size;
			//记录每列文字的y轴坐标
			var drops = [];
			//给每一个文字初始化一个起始点的位置
			for (var x = 0; x < columns; x++) drops[x] = 1;

			//绘画的函数
			function draw() {
				//布满全屏的黑色遮罩层
				ctx.fillStyle = "rgba(0, 0, 0, 0.05)";
				ctx.fillRect(0, 0, ad.width, ad.height);
				ctx.fillStyle = "#0F0";
				//设置字体样式
				ctx.font = font_size + "px arial";
				//写入画布中
				for (var i = 0; i < drops.length; i++) {
					//随机生成文字
					var text = chinese[Math.floor(Math.random() * chinese.length)];
					ctx.fillText(text, i * font_size, drops[i] * font_size);
					//如果文字的Y轴坐标大于画布的高度,1/100*colunms概率将该文字的Y轴坐标重置为0
					if (drops[i] * font_size > ad.height && Math.random() > 0.975)
						drops[i] = 0;
					//文字Y轴坐标+1
					drops[i]++;
				}
			}
			//流动速度
			setInterval(draw, 50);
		</script>
	</body>
</html>