不懂编程?不会写代码?也能制作《黑客帝国》风格的网页数字雨
myzbx 2025-01-11 15:34 19 浏览
如果你曾看过电影《黑客帝国》,你一定对其中的“数字雨”效果印象深刻:大量绿色的字符在屏幕上从上而下地快速下落,仿佛进入了一个数字化的世界。
今天,我们将学习如何在网页中使用 JavaScript 和 HTML5 <canvas> 元素实现类似的数字雨效果。即便你是编程一无所知的小白,也能通过这篇教程轻松掌握。
准备工作
鼠标右键新建文本文档
重命名新建的文档为 "数字雨.html "
鼠标右键选择在记事本中编辑
数字雨代码
复制以下代码在"数字雨.html"文件中保存,重新打开就能看到数字雨的效果了
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>数字雨效果</title>
<style>
body, html {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
background: black;
}
canvas {
display: block;
}
</style>
</head>
<body>
<canvas id="myCanvas"></canvas>
<script>
const width = document.getElementById("myCanvas").width = screen.availWidth;
const height = document.getElementById("myCanvas").height = screen.availHeight;
const ctx = document.getElementById("myCanvas").getContext("2d");
const arr = Array(Math.ceil(width / 10)).fill(0);
const str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split("");
function rain() {
ctx.fillStyle = "rgba(0,0,0,0.05)";
ctx.fillRect(0, 0, width, height);
ctx.fillStyle = "#0f0";
arr.forEach(function (value, index) {
ctx.fillText(str[Math.floor(Math.random() * str.length)], index * 10, value + 10);
arr[index] = value >= height || value > 8888 * Math.random() ? 0 : value + 10;
});
}
setInterval(rain, 30);
</script>
</body>
</html>
下面是具体代码解析~ 不感兴趣的朋友到此可以结束了 !
创建HTML和Canvas元素
首先,我们需要在HTML中创建一个<canvas>元素。这个<canvas>将是我们绘制数字雨效果的地方。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>数字雨效果</title>
<style>
body, html {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
background: black;
}
canvas {
display: block;
}
</style>
</head>
<body>
<canvas id="myCanvas"></canvas>
<script src="script.js"></script>
</body>
</html>
在这个HTML文件中,我们创建了一个 <canvas> 元素,指定了 id="myCanvas",同时为页面设置了背景为黑色,隐藏溢出内容,确保画布能够覆盖整个页面。
JavaScript实现数字雨效果
接下来,我们需要用 JavaScript 来编写动画效果。将以下代码放入 script.js 文件中:
const width = document.getElementById("myCanvas").width = screen.availWidth;
const height = document.getElementById("myCanvas").height = screen.availHeight;
const ctx = document.getElementById("myCanvas").getContext("2d");
const arr = Array(Math.ceil(width / 10)).fill(0);
const str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split("");
// 绘制数字雨效果
function rain() {
ctx.fillStyle = "rgba(0,0,0,0.05)"; // 设置背景色为黑色,透明度为0.05
ctx.fillRect(0, 0, width, height); // 填充整个画布,使字符逐渐消失
ctx.fillStyle = "#0f0"; // 设置字体颜色为绿色(类似《黑客帝国》中的绿色)
arr.forEach(function (value, index) {
ctx.fillText(str[Math.floor(Math.random() * str.length)], index * 10, value + 10);
// 更新每列的字符位置,若字符超出屏幕,重新从顶部开始
arr[index] = value >= height || value > 8888 * Math.random() ? 0 : value + 10;
});
}
// 每隔30毫秒调用一次rain函数,创建动画效果
setInterval(rain, 30);
代码详解
让我们一步步解析上面的 JavaScript 代码,帮助你理解数字雨是如何实现的。
1. 获取画布和设置尺寸
const width = document.getElementById("myCanvas").width = screen.availWidth;
const height = document.getElementById("myCanvas").height = screen.availHeight;
const ctx = document.getElementById("myCanvas").getContext("2d");
- 首先,我们通过 getElementById("myCanvas") 获取到 <canvas> 元素,并设置其宽度和高度为屏幕的可用宽度和高度(screen.availWidth 和 screen.availHeight)。这样,画布会覆盖整个屏幕。
- getContext("2d") 用于获取 2d 绘图上下文对象,它提供了绘制各种图形和文本的能力。
2. 创建字符数组
const arr = Array(Math.ceil(width / 10)).fill(0);
const str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split("");
- arr 数组用于存储每一列字符的当前Y坐标,初始时每列都从 0 开始。数组的长度是屏幕宽度除以10,表示每列的初始位置。
- str 是一个字符集,包括大写字母和数字。我们将从这个字符集中随机选择字符来显示。
3. 绘制数字雨
function rain() {
ctx.fillStyle = "rgba(0,0,0,0.05)";
ctx.fillRect(0, 0, width, height);
ctx.fillStyle = "#0f0"; // 设置字符颜色为绿色
arr.forEach(function (value, index) {
ctx.fillText(str[Math.floor(Math.random() * str.length)], index * 10, value + 10);
arr[index] = value >= height || value > 8888 * Math.random() ? 0 : value + 10;
});
}
- ctx.fillStyle = "rgba(0,0,0,0.05)" 设置了背景色的透明度,让上一帧的内容逐渐淡出,产生了流畅的数字雨效果。
- ctx.fillText() 用于绘制文本。每一列字符会根据随机选择的字符从 str 中显示出来。index * 10 确定了每列字符的位置,value + 10 控制了字符在Y轴上的下落位置。
- arr[index] = value >= height || value > 8888 * Math.random() ? 0 : value + 10; 这一行代码判断每列字符是否已经超出画布的底部。如果是,则将该列字符重置为顶部(Y坐标为0),否则字符继续下落。
4. 定时调用
setInterval(rain, 30);
- setInterval(rain, 30) 每隔 30 毫秒调用一次 rain() 函数,创建出连续不断的下落效果。
效果预览
运行这段代码后,你会看到浏览器中呈现出类似《黑客帝国》中的数字雨效果,绿色的字符在屏幕上不断下落,产生出一种动态的、视觉冲击力十足的效果。
修改与优化
- 改变字符样式:你可以修改 fillStyle 来更改字符的颜色,例如 ctx.fillStyle = "#00ff00"。
- 控制字符速度:通过调整 value + 10 和 setInterval(rain, 30) 的值,你可以控制字符下落的速度。
- 增加字符集:你可以修改 str 数组,添加更多的字符或者其他符号,使得数字雨效果更加丰富。
虽然这只是一个简单的动画效果,但它向你展示了如何利用 canvas 的绘图功能和 JavaScript 的定时器实现流畅的动态效果。
欢迎在评论区留言!
相关推荐
- 为什么钟表的指针是从左向右顺时针转?
-
所有的钟表指针都是从左向右转的,所以我们就用它来表示旋转方向了。那么,为什么钟表都是从左向右转呢?正着转也好,反着转也好,一圈不都是12小时吗?这就要从钟表的前身说起了。在钟表出现之前,人们使用过一种...
- 牛人将电子钟改造高精度时钟,日误差0.26秒!解决走时不准通病
-
家里有好多个电子钟,精度各种参差不齐,然后走时就是各种混乱,是可忍孰不可忍……自打发现8025这个好玩意儿之后,就决定不忍了。第一个上场的聪明钟,为啥叫聪明钟然后还走的不准。三节电池供电,其中3V给主...
- 篮球裁判手势图解之计时钟、得分替换和暂停手势
-
▋篮球裁判手势图解之计时钟手势停止计时钟手势,伸开手掌,垂直举过头部。犯规停止计时钟手势,一拳握紧,垂直举过头部。计时开始手势,用手做劈柴动作,将垂直举过头部的手放下。▋篮球裁判手势图解之得分手势1...
- 罗马数字的起源与用途
-
一、罗马数字的诞生与进化罗马数字起源于古罗马帝国,拥有一个漫长而复杂的历史,始于公元前8世纪至9世纪,与古罗马帝国在帕兰丁山(PalantineHill)周围建立的时间大致相同。不过,罗马数...
- 基于 Arduino Nano R3 的红外遥控数字时钟
-
由于在ArduinoNano上没有足够的引脚来编写代码,该项目只有有限的功能(即使没有设置时间的设施)。通过添加红外线遥控器,我可以灵活地整合所有需要的功能(如果需要,可能会更多),不需要额外的...
- 大班必备33首数字歌,轻松学数学
-
适合大班宝贝的33首数学歌,让孩子们在玩中学,通过好玩、好记的的儿歌来了解数学的知识点,轻松学数学!以上所有有关数学概念的知识点,其中包含了钟表、点数、分解组成、加减、单双数、倒数正数、凑十、方位...
- 11的寓意和象征
-
在数字的王国里,每个数字都有其独特的内涵和象征意义。今天,我们将一起探索数字11的奥秘和象征意义。这个奇特的数字,不仅在我们的日常生活中扮演着重要的角色,而且在神秘主义和宗教中也占有的一席之地。首先,...
- 基于TM1637的数字时钟
-
方案介绍这个项目是一个原型,我将在我正在进行的其他数字时钟项目中使用。这是我计划在我的下一个数字时钟项目中使用的时间和闹钟设置机制的原型。我希望能给你提供到帮助。如果你想到任何改进,请告诉我。我会更乐...
- 【金龟子讲睡前故事】数字不见啦
-
“快做数学题!”妈妈大声吼邦邦。“啊,好烦呀!”邦邦回到屋里,对着数学练习册大声嚷嚷。考拉熊博士在邦邦的屋外听到邦邦的声音,自言自语说:“好像又在发脾气,我得去看看他。”考拉熊博士推门进去,只见邦邦大...
- SE 最终幻想 35 周年,《FF7 重制版》破坏剑数字时钟 9 月发售
-
IT之家3月9日消息,SE今日正式开设了《最终幻想》35周年纪念网站,天野喜孝绘制官方LOGO公布!值得一提的是,索尼PlayStation游戏发布会即将于北京时间3月10...
- 谁说数字钟就是黑白状?他们让你改变看法
-
如果我们没有了钟表,你会用什么衡量时间?是利用太阳的变化还是凭猜测?之前设计癖也介绍一些有趣的钟表,像是Edelkrone设计的无表针的Oqloq钟表,也有淡化了表针概念的轨道钟表,今天再给大...
- 杭州元宵游玩大赏|“人体时钟”亮相文三数字生活街区,还有元宵巡游活动等你嗨
-
钱江晚报·小时新闻记者方力通讯员冯晨晨刘静滴答滴答,在这个时钟里面有一位虚拟的“小姐姐”。她的工作内容就是不断地把分针擦掉,然后再画上新的分针,她每画一次分针擦干净后,再画上一条新的分针,就刚...
- 来用PPT做一只数字时钟动画
-
“什么是可见性?“可见性”即指PPT动画元素中的一种。在我们之前的图文教程《动画基础扫盲课,必修!》中提到过一些常用的PPT动画元素。分别为可见性,X,Y坐标,旋转,高度和宽度。而其中所谓的“可见性”...
- 苹果手机桌面时钟怎么显示 苹果手机桌面时钟显示操作
-
苹果手机系统流畅,系统使用起来很舒适,是很多人的首选。苹果时钟可以在桌面上显示数字时钟,如果在编辑主屏幕时,不小心把时钟删掉了,要怎么恢复呢?或者想要设置时钟显示,操作是什么样的呢?苹果手机桌面时钟怎...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 中级教程 (30)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)