数字雨动画背景

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>数字雨动画背景</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}body {background-color: #000;color: #0f0;font-family: 'Courier New', monospace;overflow: hidden;height: 100vh;display: flex;flex-direction: column;justify-content: center;align-items: center;position: relative;}canvas {position: absolute;top: 0;left: 0;z-index: -1;}.content {text-align: center;z-index: 1;padding: 20px;background: rgba(0, 20, 0, 0.7);border-radius: 10px;max-width: 80%;backdrop-filter: blur(5px);border: 1px solid rgba(0, 255, 0, 0.3);box-shadow: 0 0 20px rgba(0, 255, 0, 0.3);}h1 {font-size: 2.8rem;margin-bottom: 20px;text-shadow: 0 0 10px #0f0;letter-spacing: 3px;}p {font-size: 1.2rem;margin-bottom: 20px;line-height: 1.6;}.controls {display: flex;gap: 15px;justify-content: center;margin-top: 20px;flex-wrap: wrap;}button {background: rgba(0, 30, 0, 0.8);color: #0f0;border: 1px solid #0f0;padding: 10px 20px;font-size: 1rem;cursor: pointer;transition: all 0.3s;font-family: 'Courier New', monospace;border-radius: 5px;}button:hover {background: rgba(0, 100, 0, 0.8);box-shadow: 0 0 15px rgba(0, 255, 0, 0.7);transform: translateY(-2px);}.stats {position: absolute;bottom: 20px;right: 20px;background: rgba(0, 20, 0, 0.6);padding: 10px 15px;border-radius: 5px;border: 1px solid rgba(0, 255, 0, 0.3);}.footer {position: absolute;bottom: 20px;color: #0a0;font-size: 0.9rem;}@media (max-width: 768px) {h1 {font-size: 2rem;}p {font-size: 1rem;}.content {max-width: 95%;}}</style>
</head>
<body><canvas id="matrixCanvas"></canvas><div class="content"><h1>数字矩阵</h1><p>0和1组成的数字雨从上向下流动,形成科幻感十足的数字矩阵背景</p><p>点击屏幕任意位置可创建数字涟漪效果</p><div class="controls"><button id="speedUp">加速</button><button id="speedDown">减速</button><button id="densityUp">增加密度</button><button id="densityDown">减少密度</button><button id="toggleTheme">切换主题</button></div></div><div class="stats"><span id="fpsCounter">FPS: 60</span> | <span id="dropsCounter">数字雨滴: 150</span></div><div class="footer">Matrix Digital Rain Animation</div><script>const canvas = document.getElementById('matrixCanvas');const ctx = canvas.getContext('2d');// 设置canvas大小为窗口大小canvas.width = window.innerWidth;canvas.height = window.innerHeight;// 数字字符集const chars = '010101';// 字体大小const fontSize = 14;// 列数(根据字体大小计算)const columns = canvas.width / fontSize;// 雨滴数组 - 每列一个雨滴let drops = [];// 初始化雨滴位置for(let i = 0; i < columns; i++) {drops[i] = Math.floor(Math.random() * canvas.height / fontSize);}// 动画参数let speed = 5;let density = 2;let colorTheme = 'green';let lastTime = 0;let fps = 0;let frameCount = 0;let startTime = Date.now();let rippleEffect = null;// 绘制函数function draw() {// 半透明黑色背景 - 实现拖尾效果ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';ctx.fillRect(0, 0, canvas.width, canvas.height);// 设置字体ctx.font = `${fontSize}px monospace`;// 绘制雨滴for(let i = 0; i < columns; i++) {if(i % density !== 0) continue;// 随机字符const char = chars[Math.floor(Math.random() * chars.length)];// 设置颜色 - 根据位置渐变const gradient = ctx.createLinearGradient(0, 0, 0, canvas.height);if(colorTheme === 'green') {gradient.addColorStop(0, '#0f0');gradient.addColorStop(0.5, '#0a0');gradient.addColorStop(1, '#050');} else {gradient.addColorStop(0, '#0af');gradient.addColorStop(0.5, '#08a');gradient.addColorStop(1, '#035');}ctx.fillStyle = gradient;// 绘制字符const x = i * fontSize;const y = drops[i] * fontSize;ctx.fillText(char, x, y);// 重置超出屏幕的雨滴if(y > canvas.height && Math.random() > 0.975) {drops[i] = 0;}// 移动雨滴drops[i] += speed / 10;}// 绘制涟漪效果if(rippleEffect) {const {x, y, radius, maxRadius} = rippleEffect;const gradient = ctx.createRadialGradient(x, y, 0, x, y, radius);gradient.addColorStop(0, 'rgba(0, 255, 0, 0.8)');gradient.addColorStop(1, 'rgba(0, 255, 0, 0)');ctx.fillStyle = gradient;ctx.beginPath();ctx.arc(x, y, radius, 0, Math.PI * 2);ctx.fill();rippleEffect.radius += 2;if(rippleEffect.radius > maxRadius) {rippleEffect = null;}}// 更新帧率计数frameCount++;const now = Date.now();if(now - startTime >= 1000) {fps = frameCount;frameCount = 0;startTime = now;document.getElementById('fpsCounter').textContent = `FPS: ${fps}`;document.getElementById('dropsCounter').textContent = `数字雨滴: ${Math.floor(columns / density)}`;}}// 动画循环function animate() {draw();requestAnimationFrame(animate);}// 启动动画animate();// 窗口大小调整处理window.addEventListener('resize', () => {canvas.width = window.innerWidth;canvas.height = window.innerHeight;// 重新初始化雨滴drops = [];for(let i = 0; i < columns; i++) {drops[i] = Math.floor(Math.random() * canvas.height / fontSize);}});// 添加鼠标点击涟漪效果canvas.addEventListener('click', (e) => {rippleEffect = {x: e.clientX,y: e.clientY,radius: 5,maxRadius: 100};});// 控制按钮事件document.getElementById('speedUp').addEventListener('click', () => {speed = Math.min(speed + 1, 20);});document.getElementById('speedDown').addEventListener('click', () => {speed = Math.max(speed - 1, 1);});document.getElementById('densityUp').addEventListener('click', () => {density = Math.max(density - 0.5, 1);});document.getElementById('densityDown').addEventListener('click', () => {density = Math.min(density + 0.5, 10);});document.getElementById('toggleTheme').addEventListener('click', () => {colorTheme = colorTheme === 'green' ? 'blue' : 'green';});</script>
</body>
</html>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912678.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式锁的概念与应用场景

一、分布式锁的核心概念 分布式锁是一种在分布式系统环境下&#xff0c;用于保证多个进程/节点对共享资源实现互斥访问的机制。其本质是通过某种中间件&#xff08;如Redis、ZooKeeper等&#xff09;实现跨节点的锁控制&#xff0c;确保在分布式环境中&#xff0c;同一时刻只有…

js代码09

题目 好的&#xff0c;我们继续。 在上一个练习中&#xff0c;我们深入探讨了 this 的复杂性。你会发现&#xff0c;ES6 引入的 class 语法在很大程度上就是为了简化 this 的使用&#xff0c;并为 JavaScript 提供一个更清晰、更熟悉的面向对象编程&#xff08;OOP&#xff0…

基于Airtest的App数据爬取实战:突破传统爬虫的边界

引言:App数据爬取的技术困境 在当今移动优先的时代,App已成为企业核心数据载体,然而​​传统爬虫技术​​在App数据获取上面临三大难题: ​​协议层屏障​​:加密HTTPS、SSL Pinning等技术阻断中间人攻击​​渲染层障碍​​:React Native、Flutter等跨平台框架使DOM解析…

【LeetCode 热题 100】560. 和为 K 的子数组——(解法一)前缀和+暴力

Problem: 560. 和为 K 的子数组 题目&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。 【LeetCode 热题 100】560. 和为 K 的子数组——&#xff08;解法二&#xff09;前缀和…

android车载开发之HVAC

目前主要在做车载hvac的开发&#xff0c;主要的一些功能主要是hvac&#xff0c;座椅&#xff0c;香氛&#xff0c;设置等的一些模块&#xff0c;具体模块下&#xff0c;比如 1.空调 ac&#xff0c;智能模式&#xff08;极速降温&#xff0c;极速采暖&#xff0c;智能除味&…

深度学习 Diffusers 库(自留)

&#xff08;本文将围绕 安装Diffusers库及其依赖、理解Diffusers核心概念&#xff1a;Pipeline, Model, Scheduler 、使用预训练模型进行推理&#xff08;文生图、图生图等&#xff09; 、 自定义模型和调度器 、训练自己的扩散模型&#xff08;可选&#xff0c;需要大量资源&…

【VPC技术】基础理论篇

文章目录 概述相关基础核心知识软件定义网络SDNOverlay 技术 安全组概述 参考博客 &#x1f60a;点此到文末惊喜↩︎ 概述 相关基础 基本概念 虚拟私有云VPC&#xff1a;是一个隔离的网络环境&#xff0c;每个VPC拥有专属的IP地址范围&#xff08;CIDR&#xff09;、路由表、…

在 RK3588 Ubuntu 上编译 eglinfo:全流程实战 + 常见报错修复

dv1/eglinfo 是一个开源的 EGL 信息检测工具&#xff0c;广泛用于 OpenGL ES 图形栈调试、驱动验证和嵌入式平台图形支持排查。在 Rockchip RK3588 上编译该工具可以协助我们确认 EGL DRM 是否配置正确&#xff0c;尤其在无窗口系统&#xff08;如 eglfs、framebuffer&#xf…

开源推荐:基于前后端分离架构的WMS仓储管理系统

开源推荐&#xff1a;基于前后端分离架构的WMS仓储管理系统 &#x1f525; 在线演示地址&#xff1a;https://tob.toolxq.com/wms/wms.html 点击上方链接可直接体验系统功能和界面&#xff0c;无需安装部署 前言 在企业数字化转型的浪潮中&#xff0c;仓储管理系统&#xff08…

Redis中List类型常见的操作命令有哪些?

Redis中List类型是一个字符串列表&#xff0c;这里是一些常见的命令&#xff1a; 1&#xff09;lpush:将一个或多个值插入到列表头部。列表不存在&#xff0c;一个新的列表会被创建。 2&#xff09;rpush:将一个或多个值插入到列表尾部。 3&#xff09;lpop:移除并返回列表头…

mac重复文件清理,摄影师同款清理方案

摄影师小林盯着屏幕上的警告&#xff1a;“存储空间不足”&#xff0c;离截稿只剩3小时。她的MacBook如同塞满回忆的阁楼&#xff0c;128GB的“其他”空间神秘消失。翻看照片库时&#xff0c;她惊讶地发现——同一组西藏雪山照片竟有十几个副本&#xff01;这是mac重复文件问题…

lua脚本为什么能保证原子性

Redis 处理客户端请求是基于单线程模型的&#xff08; Redis 6.0 开始引入了多线程处理网络 IO&#xff0c;但命令执行仍然是单线程的&#xff09;。这意味着&#xff0c;在任意时刻 Redis 只会执行一个命令或脚本。这种单线程特性确保了当 Redis 在执行一个 Lua 脚本时&#x…

爬虫详解:Aipy打造自动抓取代理工具

一、爬虫的本质与核心功能 爬虫是一种通过编写程序自动抓取互联网公开数据的技术工具&#xff0c;其核心流程包括&#xff1a; 模拟浏览器行为&#xff1a;发送 HTTP 请求访问目标网页解析页面结构&#xff1a;提取 HTML/XML 中的关键信息&#xff08;如文本、链接、图片&…

Leetcode百题斩-栈

终于来到了栈专题&#xff0c;想想之前来阿里的时候就是面试了一道栈最终通过了终面&#xff0c;也是十分怀念了。 739. Daily Temperatures[Medium] 思路&#xff1a;这就是最典型的单调栈问题了。从后向前维护下一个更大值或者下一个更大值的位置。 可以看一下当年面阿里时…

PIXHAWK(ardupilot4.52)NMEA的解析bug

最近在测试过程中发现在椭球高为负的地方&#xff0c;地面站读取GPS_RAW_INT (24)消息中的alt高度竟然是正值。而消息中定义的alt并不是一个unsigned数据&#xff0c;理论上是带有正负符号的。 查看gga的原始信息&#xff1a; $GPGGA,063718.40,3714.8533856,N,11845.9411766,…

Linux容器讲解以及对应软件使用

一、容器基础知识讲解 1.1 微服务的部署策略 部署单体应用意味着运行大型应用的多个相同副本&#xff0c;通常提供若干台&#xff08;N&#xff09;服务器&#xff08;物理机或虚拟 机&#xff09;&#xff0c;在每台服务器上运行若干个&#xff08;M&#xff09;应用实例。部…

企业级应用技术-ELK日志分析系统

目录 #1.1ELK平台介绍 1.1.1ELK概述 1.1.2Elasticsearch 1.1.3Logstash 1.1.4Kibana #2.1部署ES群集 2.1.1基本配置 2.1.2安装Elasticsearch 2.1.3安装Logstash 2.1.4Filebeat 2.1.5安装Kibana 1.1ELK平台介绍 1.1.1ELK概述 ELK 是三个开源工具的缩写&#xff0c;分别是Elas…

Shiro漏洞复现

Shiro简介 Apache Shiro是一种功能强大且易于使用的Java安全框架&#xff0c;它执行身份验证、授权、 加密和会话管理&#xff0c;可用于保护任何应用程序的安全。 Shiro提供了应用程序安全性API来执行以下方面&#xff1a; 1.身份验证&#xff1a;证明用户身份&#xff0c;通…

VSCode 中使用 Google Test(GTest)框架测试

VSCode 中使用 Google Test&#xff08;GTest&#xff09;框架在 VSCode 中对 C 代码进行测试的示例&#xff1a; 一、Unbutu x86使用gtest 环境配置 安装 GTest &#xff1a;在 Ubuntu 系统中&#xff0c;可以通过命令sudo apt-get install libgtest-dev安装 GTest 库。对于…

【1.6 漫画数据库设计实战 - 从零开始设计高性能数据库】

1.6 漫画数据库设计实战 - 从零开始设计高性能数据库 &#x1f3af; 学习目标 掌握数据库表结构设计原则理解字段类型选择与优化学会雪花算法ID生成策略掌握索引设计与优化技巧了解分库分表设计方案 &#x1f4d6; 故事开始 小明: “老王&#xff0c;我总是不知道怎么设计数…