Canvas特效实例:黑客帝国-字母矩阵(字母雨)

黑客帝国-字幕矩阵(字母雨)

效果预览

话不多说,我们直接上效果:当页面加载完成,屏幕上会落下如瀑布般的绿色字母流,不断向下滑动,仿佛进入了黑客帝国的数字世界,营造出极具未来感和神秘感的视觉氛围(由于图片大小限制,无法上传动图):

代码实现

html 复制代码
<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>黑客帝国-字母矩阵</title>
		<style>
			body {
				overflow: hidden;
			}
			#canvas {
				display: block;
			}
		</style>
	</head>
	<body>
		<canvas id="canvas"></canvas>
		<script>
			// 获取屏幕对象
			const screen = window.screen;
			// 获取canvas元素,并设置画布宽高
			const canvas = document.getElementById('canvas');
			canvas.width = screen.width;
			canvas.height = screen.height;
			// 获取上下文
			const ctx = canvas.getContext('2d');

			// 用于存储每个字母的垂直位置
			const letters = Array(256).fill(0);
			// 字母表:记录所有大写英文字母
			const alphabet = 'QWERTYUIOPASDFGHJKLZXCVBNM';
			// 字体大小
			const fontSize = 28;
			// 字幕下落速度 下落速度不能太慢,否则会出现上下多个字母重叠,最好和fontSize一致
			const fallSpeed = 28;

			// 绘制函数
			function draw() {
				ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
				ctx.fillRect(0, 0, canvas.width, canvas.height);
				// 绿色填充
				ctx.fillStyle = '#0F0';
				// 设置字体大小
				ctx.font = `${fontSize}px Arial`;
				// 遍历letters数组
				letters.map((y_pos, index) => {
					// 从字母表中随机选择一个字母
					const randomLetter = alphabet[Math.floor(Math.random() * alphabet.length)];
					// 每个字母间隔 : fontSize + 5,防止两侧字母重叠
					const x_pos = index * (fontSize + 5);
					// 在指定位置绘制随机字母
					ctx.fillText(randomLetter, x_pos, y_pos);
					// 判断字幕是超出屏幕高度
					letters[index] = (y_pos > screen.height + Math.random() * 1001) ? 0 : y_pos + fallSpeed;
				});
				// 实现动画
				requestAnimationFrame(draw);
			}
			// 启动动画
			draw();
		</script>
	</body>
</html>

思路解析

  1. 准备工作:获取 Canvas 元素及其 2D 绘图上下文,并设置画布的宽高与屏幕一致,确保字母雨能够覆盖整个页面。
  2. 数据初始化:定义存储字母垂直位置的数组、字母表、下落速度、字体大小和字母间隔等关键参数,为后续的绘制和动画效果奠定基础。
  3. 绘制字母:在每次绘制时,先使用半透明黑色填充画布,模拟背景的深邃感,然后遍历字母位置数组,随机选择字母并绘制在相应位置。
  4. 动画实现:通过requestAnimationFrame函数不断调用绘制函数,实现字母的连续下落动画,同时更新字母的位置,当字母超出屏幕底部时,将其重置到顶部,形成循环下落的效果。

遗留问题

  1. fallSpeed问题:在代码中有一行注释 // 字幕下落速度 下落速度不能太慢,否则会出现上下多个字母重叠,最好和fontSize一致 ,究其原因是因为 requestAnimationFrame 渲染问题,如果下落速度太快,即字母渲染太快,上一个字母还没有完全下移,下一个字母就生成了,造成上下多个字母重叠。所以为了规避这一问题,我只能强行让 下落速度≥字体大小 。当然,我们还可以改用 setInterval 的方式循环渲染动画,而不采用 requestAnimationFrame 。除此之外,还能有更友好的方法规避这一问题吗?欢迎在评论区留言讨论!
相关推荐
xkxnq4 分钟前
第五阶段:Vue3核心深度深挖(第74天)(Vue3计算属性进阶)
前端·javascript·vue.js
三小河10 分钟前
Agent Skill与Rules的区别——以Cursor为例
前端·javascript·后端
Hilaku17 分钟前
不要在简历上写精通 Vue3?来自面试官的真实劝退
前端·javascript·vue.js
三小河24 分钟前
前端视角详解 Agent Skill
前端·javascript·后端
Physicist in Geophy.30 分钟前
从矩阵到函数(算子理论)
矩阵·math
Aniugel37 分钟前
单点登录(SSO)系统
前端
颜酱37 分钟前
二叉树遍历思维实战
javascript·后端·算法
鹏多多40 分钟前
移动端H5项目,还需要react-fastclick解决300ms点击延迟吗?
前端·javascript·react.js
serioyaoyao42 分钟前
上万级文件一起可视化,怎么办?答案是基于 ParaView 的远程可视化
前端
万少1 小时前
端云一体 一天开发的元服务-奇趣故事匣经验分享
前端·ai编程·harmonyos