用html写一个有趣的动态背景

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>一个有趣的动态背景</title><link rel="stylesheet" href="./style.css">
</head>
<body>
<canvas id="canvas"></canvas><!-- partial --><script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/3.6.0/gsap.min.js'></script><script src="./script.js"></script>
</body>
</html>
console.clear();
console.log('');const config = {src: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/175711/open-peeps-sheet.png',rows: 15,cols: 7 };// 公用const randomRange = (min, max) => min + Math.random() * (max - min);const randomIndex = array => randomRange(0, array.length) | 0;const removeFromArray = (array, i) => array.splice(i, 1)[0];const removeItemFromArray = (array, item) => removeFromArray(array, array.indexOf(item));const removeRandomFromArray = array => removeFromArray(array, randomIndex(array));const getRandomFromArray = (array) =>
array[randomIndex(array) | 0];const resetPeep = ({ stage, peep }) => {const direction = Math.random() > 0.5 ? 1 : -1;// 使用 ease 函数将随机值倾斜到较低的值const offsetY = 100 - 250 * gsap.parseEase('power2.in')(Math.random());const startY = stage.height - peep.height + offsetY;let startX;let endX;if (direction === 1) {startX = -peep.width;endX = stage.width;peep.scaleX = 1;} else {startX = stage.width + peep.width;endX = 0;peep.scaleX = -1;}peep.x = startX;peep.y = startY;peep.anchorY = startY;return {startX,startY,endX };};const normalWalk = ({ peep, props }) => {const {startX,startY,endX } =props;const xDuration = 10;const yDuration = 0.25;const tl = gsap.timeline();tl.timeScale(randomRange(0.5, 1.5));tl.to(peep, {duration: xDuration,x: endX,ease: 'none' },0);tl.to(peep, {duration: yDuration,repeat: xDuration / yDuration,yoyo: true,y: startY - 10 },0);return tl;
};const walks = [
normalWalk];class Peep {constructor({image,rect }){this.image = image;this.setRect(rect);this.x = 0;this.y = 0;this.anchorY = 0;this.scaleX = 1;this.walk = null;}setRect(rect) {this.rect = rect;this.width = rect[2];this.height = rect[3];this.drawArgs = [this.image,...rect,0, 0, this.width, this.height];}render(ctx) {ctx.save();ctx.translate(this.x, this.y);ctx.scale(this.scaleX, 1);ctx.drawImage(...this.drawArgs);ctx.restore();}}const img = document.createElement('img');
img.onload = init;
img.src = config.src;const canvas = document.querySelector('#canvas');
const ctx = canvas.getContext('2d');const stage = {width: 0,height: 0 };const allPeeps = [];
const availablePeeps = [];
const crowd = [];function init() {createPeeps();// 调整大小-填充阶段resize();gsap.ticker.add(render);window.addEventListener('resize', resize);
}function createPeeps() {const {rows,cols } =config;const {naturalWidth: width,naturalHeight: height } =img;const total = rows * cols;const rectWidth = width / rows;const rectHeight = height / cols;for (let i = 0; i < total; i++) {allPeeps.push(new Peep({image: img,rect: [i % rows * rectWidth,(i / rows | 0) * rectHeight,rectWidth,rectHeight] }));}
}function resize() {stage.width = canvas.clientWidth;stage.height = canvas.clientHeight;canvas.width = stage.width * devicePixelRatio;canvas.height = stage.height * devicePixelRatio;crowd.forEach(peep => {peep.walk.kill();});crowd.length = 0;availablePeeps.length = 0;availablePeeps.push(...allPeeps);initCrowd();
}function initCrowd() {while (availablePeeps.length) {// 设置随机的两个进程addPeepToCrowd().walk.progress(Math.random());}
}function addPeepToCrowd() {const peep = removeRandomFromArray(availablePeeps);const walk = getRandomFromArray(walks)({peep,props: resetPeep({peep,stage }) }).eventCallback('onComplete', () => {removePeepFromCrowd(peep);addPeepToCrowd();});peep.walk = walk;crowd.push(peep);crowd.sort((a, b) => a.anchorY - b.anchorY);return peep;
}function removePeepFromCrowd(peep) {removeItemFromArray(crowd, peep);availablePeeps.push(peep);
}function render() {canvas.width = canvas.width;ctx.save();ctx.scale(devicePixelRatio, devicePixelRatio);crowd.forEach(peep => {peep.render(ctx);});ctx.restore();
}
html, body {height: 100%;}body {margin: 0;}#canvas {width: 100%;height: 100%;}

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

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

相关文章

STM32 F103 C8T6开发笔记14:与HLK-LD303-24G测距雷达通信

今日尝试配通STM32 F103 ZET6与HLK-LD303-24G测距雷达的串口通信解码 文章提供测试代码...... 目录 HLK-LD303-24G测距雷达外观&#xff1a; 线路连接准备&#xff1a; 定时器与串口配置准备&#xff1a; 定时器2的初始化&#xff1a; 串口1、2初始化&#xff1a; 串口1、2自定…

【Java开发指南 | 第十五篇】Java Character 类、String 类

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 Java Character 类转义序列 Java String 类连接字符串 Java Character 类 Character 类是 Java 中用来表示字符的包装类&#xff0c;它提供了一系列静态方法用于对字符进行操作&#xff0c;其主要分为静态方法…

AAAI-24 | EarnHFT:针对高频交易的分层强化学习(RL)框架

AAAI-24 | EarnHFT:针对高频交易的分层强化学习&#xff08;RL&#xff09;框架 原创 QuantML QuantML 2024-04-15 09:25 上海 EarnHFT 摘要(Abstract):高频交易&#xff08;HFT&#xff09;使用计算机算法在短时间内&#xff08;例如秒级&#xff09;做出交易决策&#xff…

C++实战——日期类的实现

日期类的实现 前言一、日期类概念实现运用场景 二、日期类的具体实现代码构造函数拷贝构造函数获取日期&#xff08;内联函数&#xff09;赋值加等减等加减小于小于等于大于大于等于相等不相等前置后置前置- -后置- -关于类里重载的比较运算符为什么要加外部const示例 Date.hDa…

【人工智能】机器学习算法综述及常见算法详解

目录 推荐 1、机器学习算法简介 1.1 机器学习算法包含的两个步骤 1.2 机器学习算法的分类 2、线性回归算法 2.1 线性回归的假设是什么&#xff1f; 2.2 如何确定线性回归模型的拟合优度&#xff1f; 2.3 如何处理线性回归中的异常值&#xff1f; 3、逻辑回归算法 3.1 …

现代数据中心中智能网卡/DPU的演进

数据中心是一个大型的连接服务器和存储系统池&#xff0c;通常由组织用于远程存储、处理或分发大量数据。组织可以拥有和管理其数据中心&#xff0c;也可以租用由第三方&#xff08;亚马逊或谷歌云等云服务提供商&#xff09;管理的基础设施&#xff0c;并通过互联网访问资源。…

IS62LV256AL-45ULI功能参数介绍及如何优化电源稳定性以适应

IS62LV256AL-45ULI功能参数介绍-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 制造商:ISSI 产品品种:静态随机存取存储器 RoHS:是 存储容量:256 kbit 组织:32 k x 8 拜访时刻:45 ns 接口类型:Parallel 电源电压-最大:3.63 V 电源电压-最小:2.97 V 电源电流—最大值:5…

前端学习<四>JavaScript基础——38-offset相关属性和匀速动画(含轮播图的实现)

前言 JS动画的主要内容如下&#xff1a; 1、三大家族和一个事件对象&#xff1a; 三大家族&#xff1a;offset/scroll/client。也叫三大系列。 事件对象/event&#xff08;事件被触动时&#xff0c;鼠标和键盘的状态&#xff09;&#xff08;通过属性控制&#xff09;。 2…

java算法day59 | 单调栈part02 ● 503.下一个更大元素II ● 42. 接雨水

503.下一个更大元素II 思路&#xff1a; 相比于单纯寻找下一个最大元素&#xff0c;要遍历两边数组&#xff0c;注意i%nums.length。 class Solution {public int[] nextGreaterElements(int[] nums) {int[] resnew int[nums.length];for(int i0;i<res.length;i){res[i]-1;…

【大数据】bigtable,分布式数据库的鼻祖

目录 1.概述 2.数据模型 3.API 4.架构 5.一个完整的读写过程 6.如何查找到要的tablet 7.LSM树 1.概述 本文是作者阅读完bigtable论文后对bigtable进行的一个梳理&#xff0c;只涉及核心概念不涉及具体实操&#xff0c;具体实操会在后续的文章中推出。 GFS的出现虽然解…

指针专题(2)

前言 上一节我们学习了指针的相关内容&#xff0c;本节我们继续学习指针专题&#xff0c;更加深入的了解指针&#xff0c;那么废话不多说&#xff0c;我们正式进入今天的学习 1.对数组名的深入理解 在上一节的内容中&#xff0c;我们提到了用指针来访问数组的操作&#xff0c…

Linux 基于 TCP 协议的简单服务器-客户端应用

目录 一、相关函数 1、listen() 2、accept() 3、connect() 4、两种IP地址转换方式 5、TCP和UDP数据发送和接收函数对比 5、log.hpp自定义记录日志 二、udp_server.hpp单进程版本 三、tcp_server.cc 四、Telnet客户端&#xff08;代替tcp_client.cc&#xff09; 五…

ColBERT和ColBERTv2:兼具Bi-encoder和cross-encoder优势的多向量排序模型

文章目录 简介ColBERTColBert 原理ColBERT如何训练ColBERT 如何使用离线索引用ColBERT 实现top-k Re-ranking用ColBERT 实现top-k 端到端的检索 ColBERTv2ColBERTv2原理SupervisionRepresentation IndexingRetrieval 总结参考资料 简介 ColBERT是一种多向量排序模型&#xff0…

数据分析案例-中国黄金股票市场的EDA与价格预测

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Redis的Stream 和 实现队列的方式【List、SortedSet、发布订阅、Stream、Java】

Redis队列与Stream、Redis 6多线程详解 Redis队列与StreamStream总述常用操作命令生产端消费端单消费者消费组消息消费 Redis队列几种实现的总结基于List的 LPUSHBRPOP 的实现基于Sorted-Set的实现PUB/SUB&#xff0c;订阅/发布模式基于Stream类型的实现与Java的集成 消息队列问…

算法打卡day39

今日任务&#xff1a; 1&#xff09;卡码网57. 爬楼梯&#xff08;70. 爬楼梯进阶版&#xff09; 2&#xff09;322.零钱兑换 3&#xff09;279.完全平方数 4&#xff09;复习day14 卡码网57. 爬楼梯&#xff08;70. 爬楼梯进阶版&#xff09; 题目链接&#xff1a;57. 爬楼梯…

ipv4Bypass:一款基于IPv6实现的IPv4安全绕过与渗透测试工具

关于ipv4Bypass ipv4Bypass是一款基于IPv6实现的安全绕过与渗透测试工具&#xff0c;该工具专为红队研究人员设计&#xff0c;可以帮助广大研究人员通过IPv6绕过目标安全策略&#xff0c;以此来检测安全检测机制的健壮性。 20世纪90年代是互联网爆炸性发展时期&#xff0c;随着…

Llama 3王者归来,可与GPT-4分庭抗礼,开源模型即将追上闭源模型了?

“有史以来最强大的开源大模型”Llama 3引爆AI圈&#xff0c;马斯克点赞&#xff0c;英伟达高级科学家Jim Fan直言&#xff0c;Llama 3将成为AI大模型发展历程的“分水岭”&#xff0c;AI顶尖专家吴恩达称Llama3是他收到的最好的礼物。 4月18日&#xff0c;AI圈再迎重磅消息&a…

写一个uniapp的登录注册页面

目录 一、效果图 二、代码 1、登录 &#xff08;1&#xff09;页面布局代码 &#xff08;2&#xff09;逻辑实现代码 &#xff08;3&#xff09;css样式 2、注册 &#xff08;1&#xff09;页面布局代码 &#xff08;2&#xff09;逻辑实现代码 &#xff08;3&#x…

一个完全用rust写的开源操作系统-Starry

1. Starry Starry是2023年全国大学生计算机系统能力大赛操作系统设计赛-内核实现赛的二等奖作品。Starry是在组件化OS的arceos的基础上&#xff0c;进行二次开发的操作系统内核&#xff0c;使用宏内核架构&#xff0c;能够运行Linux应用的内核。 原始的操作系统大赛的仓库为 …