<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" charset="utf-8" />
<title>漫天飞雪</title>
<style type="text/css">
* {margin: 0; padding: 0;}
body {background: #26568E;}
canvas {display: block;}
</style>
</head>
<body>
<div style=" background:#26568E; width:100%; height:2000px;" ></div>
<canvas id="canvas" style="position:fixed; top:0px;left:0px;z-index:80;pointer-events:none;"></canvas>
<script>
window.onload = function(){
//canvas init
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

//canvas dimensions
var W = window.innerWidth;
var H = window.innerHeight;
canvas.width = W;
canvas.height = H;

//snowflake particles
var mp = 3000; //max particles
var particles = [];
for(var i = 0; i < mp; i++){
particles.push({
x: Math.random()*W, //x-coordinate
y: Math.random()*H, //y-coordinate
r: Math.random()*3+1, //radius
d: Math.random()*mp //density
})
}

//Lets draw the flakes
function draw(){
ctx.clearRect(0, 0, W, H);
ctx.fillStyle = "rgba(255, 255, 255, 0.8)";
ctx.beginPath();
for(var i = 0; i < mp; i++){
var p = particles[i];
ctx.moveTo(p.x, p.y);
ctx.arc(p.x, p.y, p.r, 0, Math.PI*2, true);
}
ctx.fill();
update();
}

//Function to move the snowflakes
//angle will be an ongoing incremental flag. Sin and Cos functions will be applied to it to create vertical and horizontal movements of the flakes
var angle = 0;
function update(){
angle += 0.01;
for(var i = 0; i < mp; i++){
var p = particles[i];
//Updating X and Y coordinates
//We will add 1 to the cos function to prevent negative values which will lead flakes to move upwards
//Every particle has its own density which can be used to make the downward movement different for each flake
//Lets make it more random by adding in the radius
//
p.y += Math.cos(angle+p.d) + 1 + p.r/2;
p.x += Math.sin(angle) * 2;

//Sending flakes back from the top when it exits
//Lets make it a bit more organic and let flakes enter from the left and right also.
if(p.x > W || p.x < 0 || p.y > H){
if(i%3 > 0){ //66.67% of the flakes
particles[i] = {x: Math.random()*W, y: -10, r: p.r, d: p.d};
}
else{
//If the flake is exitting from the right
if(Math.sin(angle) > 0){
//Enter fromth
particles[i] = {x: -5, y: Math.random()*H, r: p.r, d: p.d};
}
else{
//Enter from the right
particles[i] = {x: W+5, y: Math.random()*H, r: p.r, d: p.d};
}
}
}
}
}

//animation loop
setInterval(draw, 15);
}
</script>
</body>
</html>

最新文章

  1. Django后台post请求中的csrf token
  2. lua学习记录
  3. The Monty Hall Problem
  4. Java集合 Json集合之间的转换
  5. scrollView自动加载数据demo
  6. AS3之正则表达式讲解
  7. svn执行clean up命令时报错或被锁定的解决方法
  8. PowerShell 管道和对象成员
  9. 超赞的.NET办公软件库
  10. win10下安装Django
  11. Spring Boot 基础教程系列学习文档
  12. Mac环境下实现alias重命名命令(永久生效)
  13. Android中的Context(一)
  14. 配置zsh
  15. Artech的MVC4框架学习——第五章Model的绑定
  16. Spring Boot 应用系列 3 -- Spring Boot 2 整合MyBatis和Druid,多数据源
  17. &#128312;RU大神手册上要再“做”的题&#128312;
  18. java中形参的可变参数的定义(如String... args) .
  19. 20155321 2016-2017-2 《Java程序设计》第一周学习总结
  20. 【BZOJ3585/3339】mex 莫队算法+分块

热门文章

  1. spring boot 使用拦截器 实现 用户登录拦截
  2. Unix下网络编程概述
  3. docker-maven-plugin
  4. vue+mousemove实现拖动,鼠标移动过快拖动就失效
  5. xcode ERROR ITMS
  6. Lumen开发:lumen源码解读之初始化(4)——服务提供(ServiceProviders)与路由(Routes)
  7. Linux 服务器配置JDK
  8. 深入解读DevOps 开发-运维
  9. 1.设计模式-------Iterator
  10. window.scrollTo(0,document.body.scrollHeight)