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

[复制链接]
发表于 2025-9-18 22:10:26 | 显示全部楼层 |阅读模式
效果预览

话不多说,我们直接上效果:当页面加载完成,屏幕上会落下如瀑布般的绿色字母流,不停向下滑动,仿佛进入了黑客帝国的数字天下,营造出极具将来感和秘密感的视觉氛围:

代码实现

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.         <head>
  4.                 <meta charset="UTF-8">
  5.                 <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.                 <title>黑客帝国-字幕矩阵</title>
  7.                 <style>
  8.                         body {
  9.                                 overflow: hidden;
  10.                         }
  11.                         #canvas {
  12.                                 display: block;
  13.                         }
  14.                 </style>
  15.         </head>
  16.         <body>
  17.                 <canvas id="canvas"></canvas>
  18.                 <script>
  19.                         // 获取屏幕对象
  20.                         const screen = window.screen;
  21.                         // 获取canvas元素,并设置画布宽高
  22.                         const canvas = document.getElementById('canvas');
  23.                         canvas.width = screen.width;
  24.                         canvas.height = screen.height;
  25.                         // 获取上下文
  26.                         const ctx = canvas.getContext('2d');
  27.                         // 用于存储每个字母的垂直位置
  28.                         const letters = Array(256).fill(0);
  29.                         // 字母表:随机字符
  30.                         const alphabet = 'QWERTYUIOPASDFGHJKLZXCVBNM1234567890~!@#$%^&*';
  31.                         // 字体大小
  32.                         const fontSize = 28;
  33.                         // 字幕下落速度 下落速度不能太慢,否则会出现上下多个字母重叠,最好和fontSize一致
  34.                         const fallSpeed = 28;
  35.                         // 绘制函数
  36.                         function draw() {
  37.                                 ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
  38.                                 ctx.fillRect(0, 0, canvas.width, canvas.height);
  39.                                 // 绿色填充
  40.                                 ctx.fillStyle = '#0F0';
  41.                                 // 设置字体大小
  42.                                 ctx.font = `${fontSize}px Arial`;
  43.                                 // 遍历letters数组
  44.                                 letters.map((y_pos, index) => {
  45.                                         // 从字母表中随机选择一个字母
  46.                                         const randomLetter = alphabet[Math.floor(Math.random() * alphabet.length)];
  47.                                         // 每个字母间隔 : fontSize + 5,防止两侧字母重叠
  48.                                         const x_pos = index * (fontSize + 5);
  49.                                         // 在指定位置绘制随机字母
  50.                                         ctx.fillText(randomLetter, x_pos, y_pos);
  51.                                         // 判断字幕是超出屏幕高度
  52.                                         letters[index] = (y_pos > screen.height + Math.random() * 1001) ? 0 : y_pos + fallSpeed;
  53.                                 });
  54.                                 // 实现动画
  55.                                 requestAnimationFrame(draw);
  56.                         }
  57.                         // 启动动画
  58.                         draw();
  59.                 </script>
  60.         </body>
  61. </html>
复制代码
思绪剖析


  • 准备工作:获取 Canvas 元素及其 2D 绘图上下文,并设置画布的宽高与屏幕同等,确保字母雨可以或许覆盖整个页面。
  • 数据初始化:界说存储字母垂直位置的数组、字母表、着落速率、字体巨细和字母隔断等关键参数,为后续的绘制和动画效果奠基底子。
  • 绘制字母:在每次绘制时,先使用半透明玄色添补画布,模拟配景的深邃感,然后遍历字母位置数组,随机选择字母并绘制在相应位置。
  • 动画实现:通过requestAnimationFrame函数不停调用绘制函数,实现字母的一连着落动画,同时更新字母的位置,当字母超出屏幕底部时,将其重置到顶部,形成循环着落的效果。
遗留标题


  • fallSpeed标题:在代码中有一行表明 // 字幕着落速率 着落速率不能太慢,否则会出现上下多个字母重叠,最好和fontSize同等 ,究其原因是由于 requestAnimationFrame 渲染标题,如果着落速率太快,即字母渲染太快,上一个字母还没有完全下移,下一个字母就生成了,造成上下多个字母重叠。以是为了规避这一标题,我只能强行让 着落速率≥字体巨细 。固然,我们还可以改用 setInterval 的方式循环渲染动画,而不采取 requestAnimationFrame 。除此之外,还能有更友爱的方法规避这一标题吗?欢迎在批评区留言讨论!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表