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 相关文章推荐
safari,opera嵌入iframe页面cookie读取问题解决方法
Jun 23 Javascript
JavaScript动态修改弹出窗口大小的方法
Apr 06 Javascript
浅谈AngularJs指令之scope属性详解
Oct 24 Javascript
Bootstrap的class样式小结
Dec 01 Javascript
详解在Vue中如何使用axios跨域访问数据
Jul 07 Javascript
JS实现图片手风琴效果
Apr 17 Javascript
通过一次报错详细谈谈Point事件
May 17 Javascript
react实现换肤功能的示例代码
Aug 14 Javascript
移动端吸顶fixbar的解决方案详解
Jul 17 Javascript
Angular value与ngValue区别详解
Nov 27 Javascript
vue使用节流函数的踩坑实例指南
May 20 Vue.js
node.js使用express-fileupload中间件实现文件上传
Jul 16 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
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
php实现留言板功能
2017/03/05 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
在Python的循环体中使用else语句的方法
2015/03/30 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
python序列类型种类详解
2020/02/26 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
六月份红领巾广播稿
2014/02/03 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
重阳节活动总结
2014/08/27 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
Python实现信息管理系统
2022/06/05 Python