HTML

<canvas id=canvas></canvas>

CSS

* {
margin: 0;
padding: 0;
}
html {
overflow: hidden;
}
canvas {
cursor: none;
}

JS

window.onload = function() {

    var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d"); var pi = Math.PI; var centerX, centerY;
var part_num = 2000; var mousedown = false;
var X, Y;
/*===========================================================================*/ /*===========================================================================*/
var P = [];
var part = function(x, y, vx, vy, r, red, green, blue, alpha, col) {
this.x = x;
this.y = y;
this.vx = vx;
this.vy = vy;
this.r = r;
this.red = red;
this.green = green;
this.blue = blue;
this.alpha = alpha;
this.col = col;
}; function rand(min, max) {
return Math.random() * (max - min) + min;
} function dist(dx, dy) {
return Math.sqrt(dx * dx + dy * dy);
} function size() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight; centerX = canvas.width / 2;
centerY = canvas.height / 2;
}
size();
X = centerX;
Y = centerY; function init() {
var x, y, vx, vy, r, red, green, blue, alpha, col;
for (var i = 0; i < part_num; i++) {
x = rand(0, canvas.width);
y = rand(0, canvas.height);
vx = rand(-1, 1);
vy = rand(-1, 1);
r = rand(1, 3);
red = Math.round(rand(150, 200));
green = Math.round(rand(100, 255));
blue = Math.round(rand(180, 255));
alpha = 1;
col = "rgba(" + red + "," + green + "," + blue + "," + alpha + ")"; P.push(new part(x, y, vx, vy, r, red, green, blue, alpha, col));
}
} function bg() {
ctx.fillStyle = "rgba(25,25,30,1)";
ctx.fillRect(0, 0, canvas.width, canvas.height);
//ctx.clearRect(0, 0, canvas.width, canvas.height);
} function bounce(b) { if (b.x < b.r) {
b.x = b.r;
b.vx *= -1;
}
if (b.x > canvas.width - b.r) {
b.x = canvas.width - b.r;
b.vx *= -1;
} if (b.y - b.r < 0) {
b.y = b.r;
b.vy *= -1;
}
if (b.y > canvas.height - b.r) {
b.y = canvas.height - b.r;
b.vy *= -1;
}
} function attract(p) { var dx = (p.x - X),
dy = (p.y - Y),
dist = Math.sqrt(dx * dx + dy * dy),
angle = Math.atan2(dy, dx); if (dist > 10 && dist < 300) {
if (!mousedown) {
p.vx -= (20 / (p.r * dist)) * Math.cos(angle);
p.vy -= (20 / (p.r * dist)) * Math.sin(angle);
} else if (mousedown) {
p.vx += (250 / (p.r * dist)) * Math.cos(angle);
p.vy += (250 / (p.r * dist)) * Math.sin(angle);
}
} } function draw() {
var p;
for (var i = 0; i < P.length; i++) {
p = P[i]; if (mouseover) attract(p);
bounce(p); p.x += p.vx;
p.y += p.vy; p.vx *= .975;
p.vy *= .975; ctx.fillStyle = p.col;
ctx.fillRect(p.x, p.y, p.r, p.r);
//ctx.beginPath();
//ctx.fillStyle = p.col;
//ctx.arc(p.x, p.y, p.r, 0, 2 * pi);
//ctx.fill(); }
ctx.strokeStyle = (!mousedown) ? "rgba(255,255,255,1)" : "rgba(255,0,0,1)"; ctx.beginPath();
ctx.moveTo(X, Y - 10);
ctx.lineTo(X, Y + 10);
ctx.moveTo(X - 10, Y);
ctx.lineTo(X + 10, Y);
ctx.stroke(); } function loop() {
bg();
draw(); window.requestAnimationFrame(loop);
} window.onresize = size; window.onmousemove = function(e) {
X = e.clientX;
Y = e.clientY;
} window.onmousedown = function() {
mousedown = true;
} window.onmouseup = function() {
mousedown = false;
} var mouseover = false; window.onmouseover = function() {
mouseover = true;
} window.onmouseout = function() {
mouseover = false;
} init();
loop();
}

最新文章

  1. java web学习总结(二十八) -------------------JSP中的JavaBean
  2. C#对于文件的读写
  3. 【JAVA】基于MVC架构Java技术荟萃案例演练
  4. NGUI屏幕自适应
  5. SQL简介
  6. oracle 10g 学习之单行函数(5)
  7. android 插件化开发 开源项目列表
  8. Eclipse中的Web项目自动部署到Tomcat(转)
  9. 天气API整理,返回的数据格式为json对象
  10. Spring-boot:快速搭建微服务框架
  11. 如何让oracle DB、监听和oem开机启动(dbstart)
  12. c++ 入门 之 hello world 和基本语法
  13. Spark中集群相关概念
  14. .NET [MVC] 利用特性捕捉异常
  15. SDL播放YUV——循环
  16. imp 导入以及换用户报错
  17. C# Note10: AutoComplete TextBox in WPF
  18. LVS 之搭建
  19. C# 基于DocumentFormat.OpenXml的数据导出到Excel
  20. bzoj千题计划236:bzoj2300: [HAOI2011]防线修建

热门文章

  1. springboot+druid连接池及监控配置
  2. 【POJ - 1573】Robot Motion
  3. python 2.7 - 3.5 升级之路 (一) : 准备阶段开发环境 -- pip3, vitualEnv, pycharm
  4. Git储藏和引用日志
  5. C#2.0新增功能05 迭代器
  6. 用tcp协议实现一个并发的socketserver 进行密文登录
  7. HTML--网页练习--(360导航首页的一部分)
  8. junit的Test不能使用,报错信息:Test is not an annotation type
  9. spark 源码分析之十九 -- Stage的提交
  10. Apache和Spring提供的StopWatch执行时间监视器