流动雨滴效果

<html><head><meta name="Generator" content="EditPlus" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>流动雨滴效果</title><style>body {overflow: hidden;background: black;}</style></head><body><canvas id="canvas-club"></canvas><script src="./js/2.流动雨滴效果.js"></script></body>
</html>
const c = document.getElementById("canvas-club");
// 2d绘图上下文对象
const ctx = c.getContext("2d", {// 配置提升渲染效率willReadFrequently: true,
});
// 设置canvas 的宽度  window.innerWidth 是窗口的内部宽度,表示当前浏览器窗口的宽度
let w = (c.width = window.innerWidth) * devicePixelRatio;
// 设置canvas 的高度  window.innerWidth 是窗口的内部高度,表示当前浏览器窗口的高度
let h = (c.height = window.innerHeight) * devicePixelRatio;
// 清除背景的颜色
const clearColor = "rgba(0, 0, 0, .1)";
// 最大的雨滴数量
const max = 30;// 雨滴
class Drop {constructor() {this.x = 0;this.y = 0;this.color = "hsl(180, 100%, 50%)";this.w = 2;this.h = 1;//   垂直方向上的速度this.vy = 0;//   宽度的速度变化this.vw = 3;//   高度的速度变化this.vh = 1;//   大小this.size = 2;//   碰撞次数this.hit = 0;//   透明度this.a = 1;//   透明度的变化率this.va = 0.96;}init() {this.x = random(0, w);this.y = 0;this.color = "hsl(180, 100%, 50%)";this.w = 2;this.h = 1;this.vy = random(4, 5);this.vw = 3;this.vh = 1;this.size = 2;this.hit = random(h * 0.8, h * 0.9);this.a = 1;this.va = 0.96;}draw() {if (this.y > this.hit) {ctx.beginPath();ctx.moveTo(this.x, this.y - this.h / 2);// 创建二次或三次贝塞尔曲线 接收6个参数,分别是控制点1的x坐标、y坐标,控制点2的x坐标、y坐标,结束点的x坐标、y坐标。ctx.bezierCurveTo(this.x + this.w / 2,this.y - this.h / 2,this.x + this.w / 2,this.y + this.h / 2,this.x,this.y + this.h / 2);ctx.bezierCurveTo(this.x - this.w / 2,this.y + this.h / 2,this.x - this.w / 2,this.y - this.h / 2,this.x,this.y - this.h / 2);ctx.strokeStyle = "hsla(180, 100%, 50%, " + this.a + ")";ctx.stroke();ctx.closePath();} else {ctx.fillStyle = this.color;ctx.fillRect(this.x, this.y, this.size, this.size * 5);}this.update();}update() {if (this.y < this.hit) {this.y += this.vy;} else {if (this.a > 0.03) {this.w += this.vw;this.h += this.vh;if (this.w > 100) {// *= 是一个复合赋值运算符this.a *= this.va;this.vw *= 0.98;this.vh *= 0.98;}} else {this.init();}}}
}// 生成指定范围内的随机数
function random(min, max) {return Math.random() * (max - min) + min;
}const drops = [];
// 全局方法 窗口大小改变时重新设置canvas的宽度和高度
function resize() {w = c.width = window.innerWidth;h = c.height = window.innerHeight;
}
// 全局方法 页面加载时初始化所有的雨滴对象并添加到drops数组中
function setup() {for (var i = 0; i < max; i++) {(function (j) {setTimeout(function () {var o = new Drop();o.init();drops.push(o);}, j * 200);})(i);}
}
// 全局方法 绘制动画效果
function anim() {ctx.fillStyle = clearColor;ctx.fillRect(0, 0, w, h);for (var i in drops) {drops[i].draw();}requestAnimationFrame(anim);
}window.addEventListener("resize", resize);
setup();
anim();

在这里插入图片描述

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

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

相关文章

Redis为什么速度快:数据结构、存储及IO网络原理总结

Redis&#xff0c;作为内存数据结构存储的佼佼者&#xff0c;其高性能表现一直备受赞誉。那么&#xff0c;Redis究竟是如何实现这一点的呢&#xff1f;接下来&#xff0c;我们将更深入地探讨其背后的关键技术&#xff0c;并提供进一步的优化策略。 一、内存存储与数据结构设计…

支持下一代网络IpV6的串口服务器,IpV6串口485接口转网口

和IPv4比较&#xff0c;IPv6有两个极具吸引力的特点&#xff1a;一个是IPv6采用的128位地址格式&#xff0c;而IPv4采用32位的地址格式&#xff0c;因此IPv6使地址空间增大了296&#xff1b;另一个是IPv6物联网数据业务具有更强的支持能力&#xff0c;成为未来物联网的重要协议…

HCIA学习作业三

要求&#xff1a; 拓扑图&#xff1a; <AR1>ping 5.5.5.1 <AR1>display ip interface brief <AR1>display ip routing-table <AR1>display ip routing-table protocol static <AR2>ping 5.5.5.1 <AR2>display ip interface brief <…

第九篇 华为云Iot SDK的简单应用

第九篇 华为云Iot SDK的简单应用 一、华为云Iot SDK API的简单使用 1.初始化SDK 2.绑定连接配置信息 3.连接服务器 4.上报属性 5.接收命令 二、实现智能家居灯光状态上报 &#x1f516;以下是上报数据到华为云Iot的代码片段&#xff0c;配合串口控制灯光&#xff0c;改变灯…

代码随想录算法训练营第十七天 |110.平衡二叉树,257.二叉树的所有路径,404.左叶子之和(待补充)

110.平衡二叉树 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二…

Linux进程间通信(IPC)机制之一:管道(Pipes)详解

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Nonsense—Sabrina Carpenter 0:50━━━━━━️&#x1f49f;──────── 2:43 &#x1f504; ◀️ ⏸ ▶️ …

【听力与言语医学中心系列科普16】听力检查之纯音听阈测定

当我们去医院向医生诉说我们耳朵有问题时&#xff0c;最常听到医生说的是“去做个测听”吧&#xff0c;那么什么是测听&#xff1f;做测听有什么作用呢&#xff1f; 一、什么是纯音测听纯音听力测试自1943年Bunch教授发表后&#xff0c;就被作为首选的测听方法。纯音测听是测试…

Acwing递归与递推(一)

递归问题可以尝试画一棵递归搜索树。 递归实现指数型枚举 原题链接&#xff1a;https://www.acwing.com/problem/content/94/ 思路 首先是写递归的结束条件。 每个选项都有选和不选两种状态&#xff0c;把每个选项都考虑一遍。递归参数传递当前考虑的第几个元素&#xff0c;…

ubuntu操作系统

ubuntu系统简介 操作系统 1. 操作系统的定义 操作系统直接运行在计算机上的系统软件&#xff0c; 它是控制硬件和支持软件运行的计算机程序。 2.操作系统作用 向下控制硬件向上支持软件的运行&#xff0c;具有承上启下的作用 3. 常见的操作系统 Windowsmac OSLinuxiOSAndro…

【笔试刷题】错题集1

文章目录 C语言格式化输出%5.3s用法逻辑短路编程题&#xff1a;删除公共字符串编程题&#xff1a;组队竞赛 C语言格式化输出%5.3s用法 [解析]%m.ns 输出占m列&#xff0c;但只取字符串中左端n个字符。这n个字符输出在m列的右侧&#xff0c;左补空格。 格式化输出 逻辑短路 [解…

centos 7 增加临时路由及永久路由

centos 7 增加临时路由及永久路由 如果增加临时路由&#xff0c;要先安装net-tools , sudo yum install net-tools route add -net 10.1.0.0 gw 10.1.1.1 netmask 255.255.0.0 意思是增加了一条动态路由&#xff0c;网关10.1.1.1 ,10.1.x.x 的所有ip都走这个网关 此种方式&am…

Elasticsearch介绍以及基本操作

目录 一、Elasticsearch介绍 二、关于Elasticsearch的基本操作 &#xff08;1&#xff09;索引操作 &#xff08;2&#xff09;文档操作 三、域的属性 &#xff08;1&#xff09;index &#xff08;2&#xff09;type &#xff08;3&#xff09;store 一、Elasticsearc…