zoukankan      html  css  js  c++  java
  • html+canvas实现很真实的下雨雨落

    原素材地址: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;
    				 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>
    

      

      

    有问题联系QQ1291481728或在下方评论,会在第一时刻处理。
  • 相关阅读:
    MySQL集群在断网后再启动报"Unable to start missing node group"问题处理
    由于OCR文件损坏造成Oracle RAC不能启动的现象和处理方法
    使用dbms_scheduler包创建定时任务
    Oracle_12c_RAC_service_died问题分析处理
    MySQL使用正则表达式比较字段中的数字
    crontab不能正确执行的问题
    Oracle 12c SYSAUX表空间不足处理-清理audsys.cli_swp$a9b5f52c$1$1表
    HyperV上的Linux虚拟机启动报panic_early_exception错误
    Nagios NSclient Failed to get CPU value: 238(_total)6: Failed to get mutex :(
    两数相加II--链表
  • 原文地址:https://www.cnblogs.com/1748sb/p/12965401.html
Copyright © 2011-2022 走看看