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 相关文章推荐
js 禁用浏览器的后退功能的简单方法
Dec 10 Javascript
默认让页面的第一个控件选中的javascript代码
Dec 26 Javascript
jQuery中使用了document和window哪些属性和方法小结
Sep 13 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
Aug 06 Javascript
jQuery UI库中dialog对话框功能使用全解析
Apr 23 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
Jun 30 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
js实现日历的简单算法
Jan 24 Javascript
CentOS环境中MySQL修改root密码方法
Jan 07 Javascript
vue实现简单loading进度条
Jun 06 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
Aug 04 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读取PDF内容配合Xpdf的使用
2012/11/24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
搭建vue开发环境
2018/07/19 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
python用字典统计单词或汉字词个数示例
2014/04/22 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
python自动发送邮件脚本
2018/06/20 Python
Python中捕获键盘的方式详解
2019/03/28 Python
python如何实现代码检查
2019/06/28 Python
python 中如何获取列表的索引
2019/07/02 Python
详解Python高阶函数
2020/08/15 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
大学生职业生涯规划书模板
2014/01/18 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
幼儿教师工作感言
2014/02/14 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
活着观后感
2015/06/03 职场文书