Canvas 绘制粒子动画背景


Posted in Javascript onFebruary 15, 2017

效果如下:

Canvas 绘制粒子动画背景

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<style>
 *{
  margin:0px;
  padding:0px;
 }
 body{
  background:#000;
 }
 canvas{
  position:absolute;
  width:100%;
  height:100%;
 }
</style>
<body>
<canvas id="canvas">您的浏览器不支持,请升级最新的版本!</canvas>
<script>window.requestAnimFrame = ( function() {
 return window.requestAnimationFrame ||
   window.webkitRequestAnimationFrame ||
   window.mozRequestAnimationFrame ||
   function( callback ) {
    window.setTimeout( callback, 1000 / 60 );
   };
})();
var can = document.getElementById("canvas");
var cxt = can.getContext("2d");
can.width = window.innerWidth;
can.height = window.innerHeight;
cxt.lineWidth = 0.3;
//初始链接线条显示位置
var mousePosition = {
 x : 30*can.width/100,
 y : 30*can.height/100
}
//圆形粒子对象参数
var dots = {
 n : 500,//圆形粒子个数
 distance : 50,//圆形粒子之间的距离
 d_radius : 80,//粒子距离鼠标点的距离
 array : []//保存n个圆形粒子对象
}
//创建随机颜色值
function colorValue(min){
 return Math.floor(Math.random()*255 + min);
}
function createColorStyle(r,g,b){
 return "rgba("+r+","+g+","+b+", 1)";
}
//混合两个圆形粒子的颜色
function mixConnect(c1,r1,c2,r2){//圆的颜色 半径
 return (c1*r1+c2*r2)/(r1+r2);
};
//生成线条的颜色
function lineColor(dot1,dot2){//获取具体的圆的颜色再计算
 var color1 = dot1.color,
   color2 = dot2.color;
 var r = mixConnect(color1.r,dot1.radius,color2.r,dot2.radius);
 var g = mixConnect(color1.g,dot1.radius,color2.g,dot2.radius);
 var b = mixConnect(color1.b,dot1.radius,color2.b,dot2.radius);
 return createColorStyle(Math.floor(r),Math.floor(g),Math.floor(b));
}
//生成圆形粒子的颜色对象
function Color(min){
 min = min || 0;
 this.r = colorValue(min);
 this.g = colorValue(min);
 this.b = colorValue(min);
 this.style = createColorStyle(this.r,this.g,this.b);
}
//创建圆形粒子对象
function Dot(){
 //圆形粒子随机圆心坐标点
 this.x = Math.random()*can.width;
 this.y = Math.random()*can.height;
 //x y 方向运动的速度值
 this.vx = -0.5 + Math.random();
 this.vy = -0.5 + Math.random();
 this.radius = Math.random()*5;
 //this.color = "#ff3333";
 this.color = new Color();
}
//绘制出圆形粒子
Dot.prototype.draw = function(){
 cxt.beginPath();
 cxt.fillStyle = this.color.style;
 cxt.arc(this.x,this.y,this.radius,0,Math.PI*2,false);
 cxt.fill();
}
//添加圆形粒子
function createCircle(){
 for (var i=0;i<dots.n ;i++ )
 {
  dots.array.push(new Dot());
 }
}
//绘制出圆形粒子
function drawDots(){
 for (var i=0;i<dots.n ;i++ )
 {
  var dot = dots.array[i];
  dot.draw();
 }
}
//drawDots();
//移动
function moveDots(){
 for (var i=0;i<dots.n ;i++ ){
  var dot = dots.array[i];
  //当圆形粒子对象碰壁的时候就反弹回来
  if (dot.y < 0 || dot.y > can.height)
  {
   dot.vx = dot.vx;
   dot.vy = -dot.vy;
  }else if (dot.x < 0 || dot.x > can.width)
  {
   dot.vx = -dot.vx;
   dot.vy = dot.vy;
  }
  //给圆形粒子圆心坐标加上速度值移动圆形粒子
  dot.x += dot.vx;
  dot.y += dot.vy;
 }
}
//链接粒子对象
function connectDots(){
 for (var i=0;i<dots.n ; i++)
 {
  for ( var j=0;j<dots.n ; j++)
  {
   iDot = dots.array[i];
   jDot = dots.array[j];
   if ((iDot.x - jDot.x) < dots.distance && (iDot.y - jDot.y) < dots.distance && (iDot.x - jDot.x) > -dots.distance && (iDot.y - jDot.y) > -dots.distance)
   {
    if ((iDot.x - mousePosition.x) < dots.d_radius && (iDot.y - mousePosition.y) < dots.d_radius && (iDot.x - mousePosition.x) > -dots.d_radius && (iDot.y - mousePosition.y) > -dots.d_radius)
    {
     cxt.beginPath();
     //cxt.strokeStyle = "yellow";
     cxt.strokeStyle = lineColor(iDot,jDot);
     cxt.moveTo(iDot.x,iDot.y);
     cxt.lineTo(jDot.x,jDot.y);
     cxt.closePath();
     cxt.stroke();
    }
   }
  }
 }
}
createCircle();
//让圆形粒子不断的移动
function animateDots(){
 cxt.clearRect(0,0,can.width,can.height);
 moveDots();
 connectDots()
 drawDots();
 requestAnimFrame(animateDots);
}
animateDots();
can.onmousemove = function(ev){
 var ev = ev || window.event;
 mousePosition.x = ev.pageX;
 mousePosition.y = ev.pageY;
}
can.onmouseout = function(){
 mousePosition.x = can.width/2;
 mousePosition.y = can.height/2;
}
</script>
</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
让焦点自动跳转
Jul 01 Javascript
jQuery 动画弹出窗体支持多种展现方式
Apr 29 Javascript
json2.js的初步学习与了解
Oct 06 Javascript
JS打开图片另存为对话框实现代码
Dec 26 Javascript
javascript cookie的简单应用
Feb 24 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
May 16 Javascript
JavaScript中的事件委托及好处
Jul 12 Javascript
JS完成画圆圈的小球
Mar 07 Javascript
ES6新特性之模块Module用法详解
Apr 01 Javascript
Angular2中select用法之设置默认值与事件详解
May 07 Javascript
JS实现评价的星星功能
Aug 20 Javascript
layui实现checkbox的目录树tree的例子
Sep 12 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
Feb 15 #Javascript
js控制按钮,防止频繁点击响应的实例
Feb 15 #Javascript
js代码延迟一定时间后执行一个函数的实例
Feb 15 #Javascript
图文详解Javascript中的上下文和作用域
Feb 15 #Javascript
js实现省份下拉菜单效果
Feb 15 #Javascript
JavaScript函数节流和函数防抖之间的区别
Feb 15 #Javascript
javascript滚轮事件基础实例讲解(37)
Feb 14 #Javascript
You might like
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
微信支付开发交易通知实例
2016/07/12 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
Javascript的this用法
2017/01/16 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
python实现telnet客户端的方法
2015/04/15 Python
调试Python程序代码的几种方法总结
2015/04/28 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Django后台admin的使用详解
2019/07/08 Python
python解释器spython使用及原理解析
2019/08/24 Python
学python最电脑配置有要求么
2020/07/05 Python
详解Python高阶函数
2020/08/15 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
新电JAVA笔试题目
2014/08/31 面试题
个人简历的自荐信
2013/10/23 职场文书
计算机系毕业生推荐信
2013/11/06 职场文书
财务主管自我鉴定
2014/01/17 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
会计系毕业生求职信
2014/05/28 职场文书
工地安全生产标语
2014/06/06 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
SQL Server内存机制浅探
2022/04/06 SQL Server