原素材地址:http://www.htmlsucai.com/demo-9782.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<style type="text/css">
#rain {
position: fixed;
z-index: -1;
top: 0;
left: 0;
opacity: 0.4;
width: 100vw;
height: 100vh;
}
</style>
</head>
<body>
<canvas id="rain"></canvas>
<script type="text/javascript">
window.onload = main; function getRgb(r, g, b) {
return "rgb(" + r + "," + g + "," + b + ")";
} function main() {
//drop
var dropList = [];
var gravity = 0.4;
//
var linelist = [];
var canvasEl = document.getElementById('rain');
var ctx = canvasEl.getContext('2d');
var mousePos = [0, 0];
var backgroundColor = '#000';
canvasEl.width = canvasEl.clientWidth;
canvasEl.height = canvasEl.clientHeight;
var speedx = 0;
var maxspeedx = 0;
window.onresize = function() {
canvasEl.width = canvasEl.clientWidth;
canvasEl.height = canvasEl.clientHeight;
}
window.onmousemove = function(e) {
mousePos[0] = e.clientX;
mousePos[1] = e.clientY;
maxspeedx = (e.clientX - canvasEl.clientWidth / 2) / (canvasEl.clientWidth / 2);
}
// window.onmousedown=function(e)
function createLine(e) {
var temp = 0.25 * (50 + Math.random() * 100);
var myline = {
speed: 4.5 * (Math.random() * 6 + 3),
die: false,
posx: e,
posy: -200,
h: temp,
color: getRgb(Math.floor(temp * 255 / 75), Math.floor(temp * 255 / 75), Math.floor(temp * 255 / 75))
};
linelist.push(myline);
}
window.requestAnimationFrame(update); function createDrop(x, y) {
var mydrop = {
die: false,
posx: x,
posy: y,
vx: (Math.random() - 0.5) * 8,
vy: Math.random() * (-6) - 3,
radius: Math.random() * 1.5 + 1
};
return mydrop;
} function madedrops(x, y) {
var maxi = Math.floor(Math.random() * 5 + 5);
for (var i = 0; i < maxi; i++) {
dropList.push(createDrop(x, y));
}
} function update() {
if (dropList.length > 0) {
dropList.forEach(function(e) {
e.vx = e.vx + (speedx) / 2;
e.posx = e.posx + e.vx;
e.vy = e.vy + gravity;
e.posy = e.posy + e.vy;
if (e.posy > canvasEl.clientHeight) {
e.die = true;
}
});
}
for (var i = dropList.length - 1; i >= 0; i--) {
//delite die
if (dropList[i].die) {
dropList.splice(i, 1);
}
} speedx = speedx + (maxspeedx - speedx) / 50; if (Math.random() > 0) {
createLine(Math.random() * 2 * canvasEl.width - (0.5 * canvasEl.width));
createLine(Math.random() * 2 * canvasEl.width - (0.5 * canvasEl.width));
createLine(Math.random() * 2 * canvasEl.width - (0.5 * canvasEl.width));
}
var mydeadline = canvasEl.clientHeight - Math.random() * canvasEl.clientHeight / 5;
linelist.forEach(function(e) {
var dis = Math.sqrt(((e.posx + speedx * e.h) - mousePos[0]) * ((e.posx + speedx * e.h) - mousePos[0]) + (e.posy +
e.h - mousePos[1]) * (e.posy + e.h - mousePos[1]));
if (dis < 35) {
madedrops(e.posx + speedx * e.h, e.posy + e.h);
e.die = true;
} if ((e.posy + e.h) > mydeadline) {
if (Math.random() > 0.85) {
madedrops(e.posx + speedx * e.h, e.posy + e.h);
e.die = true;
}
}
if (e.posy >= canvasEl.clientHeight) {
e.die = true;
} else {
e.posy = e.posy + e.speed;
e.posx = e.posx + (e.speed * speedx);
}
});
for (var i = linelist.length - 1; i >= 0; i--) {
if (linelist[i].die) {
linelist.splice(i, 1);
}
}
render();
window.requestAnimationFrame(update);
} function render() {
ctx.fillStyle = backgroundColor;
ctx.fillRect(0, 0, canvasEl.width, canvasEl.height); linelist.forEach(
function(line) { ctx.strokeStyle = line.color;
ctx.lineWidth = 4.5;
ctx.beginPath();
ctx.moveTo(line.posx, line.posy);
ctx.lineTo(line.posx + speedx * line.h, line.posy + line.h);
ctx.stroke();
});
ctx.lineWidth = 1;
ctx.strokeStyle = "#fff";
dropList.forEach(function(e) {
ctx.beginPath();
ctx.arc(e.posx, e.posy, e.radius, Math.random() * Math.PI * 2, 1 * Math.PI);
ctx.stroke();
});
} }
</script>
</body>
</html>

  

  

html+canvas实现很真实的下雨雨落的更多相关文章

  1. canvas用数组方式做出下雨效果

    效果图 1.做出canvas画布和声明一个用来存储雨滴的数组 var c=document.getElementById('myCanvas'); var ctx= c.getContext('2d' ...

  2. Canvas 最佳实践(性能篇)

    Canvas 想必前端同学们都不陌生,它是 HTML5 新增的「画布」元素,允许我们使用 JavaScript 来绘制图形.目前,所有的主流浏览器都支持 Canvas. Canvas 最常见的用途是渲 ...

  3. 雨后清风U盘启动盘的五大用处及制作方法

    如果有一个U盘可以帮助你安装系统,或者在你的电脑系统崩溃时帮助你修复系统,是不是很方便呢?雨后清风U盘启动盘就能帮你实现这样的效果.除此之外,雨后清风U盘启动盘还有另外一些用处.下面就来和大家分享一下 ...

  4. 【Canvas】(1)---概述+简单示例

    Canvas---概述+简单示例 如果通俗的去理解Canvas,我们可以去理解成它类似于我们电脑自带的画图工具一样,canvas首先是选择一块画布,然后在这个画布上描绘我们想画的东西,画好后展示给用户 ...

  5. canvas学习之API整理笔记(一)

    其实canvas本身很简单,就是去学习它的API,多看实例,多自己动手练习,多总结.但是canvas的API实在是有点多,对于初学者来说,可能学到一半就止步不前了.我也有这种感觉,在学习的过程中,编写 ...

  6. 使用canvas元素-art方法绘制圆弧

    最近在学习HTML5,发现canvas真的很棒,canvas元素是一种可供绘图的平面,我们用JavaScript对它进行配置和操作.我这里说一下arc方法绘制圆弧,顺便提一下涉及到的基础知识. 首先看 ...

  7. HTML5 canvas beginPath() 方法

    beginPath() 方法开始一条路径,或重置当前的路径.w3school上的解释! 路径是canvas里很重要的一个概念,刚开始学canvas的人对路径理解不是很深,他们在用canvas的时候会乱 ...

  8. Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形

    来源:http://www.ido321.com/968.html 一.Canvas的基础知识 Canvas是HTML 5中新增的元素,专门用于绘制图形.canvas元素就相当于一块“画布”,一块无色 ...

  9. html5 Canvas处理图像 实例讲解

    最近在学习canvas,canvas有很强大的图像处理功能,下面写一个我的学习总结: canvas常用功能: 1. 绘制矩形.圆形.曲线.组合图形 2. 绘制文本 3.绘制渐变.变形的图形 4. 图片 ...

随机推荐

  1. module(JS模块系统)

    JS - module(模块系统) 重新学习ES6 倒数第一章 module 什么是module? 百度的解释 之前接触过AngularJS,现在看Dojo,都有对模块的使用.在dojo官网看到这段文 ...

  2. osgEarth使用笔记4——加载矢量数据

    目录 1. 概述 2. 详论 2.1. 基本绘制 2.2. 矢量符号化 2.2.1. 可见性 2.2.2. 高度设置 2.2.3. 符号化 2.2.4. 显示标注 2.3. 其他 3. 结果 4. 问 ...

  3. juc包:使用 juc 包下的显式 Lock 实现线程间通信

    一.前置知识 线程间通信三要素: 多线程+判断+操作+通知+资源类. 上面的五个要素,其他三个要素就是普通的多线程程序问题,那么通信就需要线程间的互相通知,往往伴随着何时通信的判断逻辑. 在 java ...

  4. VMware安装的Linux系统忘记密码 怎么修改root密码

    因为昨天新安装过虚拟机设置了新的密码,再加上我好长时间没有用自己旧的虚拟机,导致忘记了密码,原来虽然知道在单用模式下,找回密码,但是确实是自己从来都没有做过,还好我们组大手飞翔哥告诉了我,怎么找回ro ...

  5. jquery的实时触发事件(textarea实时获取中文个数)

    jquery的实时触发事件(textarea实时获取中文个数) (2014-09-16 11:49:50) 转载▼ 标签: 实时触发事件 中文个数 onpropertychange oninput o ...

  6. 【循环矩阵乘优化DP】BZOJ 2510 弱题

    题目大意 有 \(M\) 个球,一开始每个球均有一个初始标号,标号范围为 \(1\) - \(N\) 且为整数,标号为 \(i\) 的球有 \(a_i\) 个,并保证 \(\sum a_i = M\) ...

  7. go mod模式,引入自己的包,goland飘红

  8. linux(centos8):用tr替换或删除字符

    一,tr命令的用途 tr命令可以替换或删除文件中的字符 它从标准输入设备读取数据, 处理完成将结果输出到标准输出设备 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnbl ...

  9. xpath取末尾

    from lxml import etree html = ''' <!DOCTYPE html> <html lang="en"> <head> ...

  10. 【应用服务 App Service】Azure App Service 中如何安装mcrypt - PHP

    问题描述 Azure App Service (应用服务)如何安装PHP的扩展 mcrypt(mcrypt 是php里面重要的加密支持扩展库) 准备条件 创建App Service, Runtime ...