非常不错的canvas效果,线随心动

非常不错的canvas效果,下面是html代码。

  1 <!DOCTYPE html>
  2 <html>
  3  <head>
  4   <meta charset="utf-8" />
  5   <meta name="author" content="" />
  6   <meta name="keywords" content="" />
  7   <meta name="description" content="" />
  8   <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no" />
  9   <title>  似圆非圆,似线非线 </title>
 10   <style>
 11     .stage{position:absolute;left:0;top:0;width:100%;height:100%;background:#000;}
 12   </style>
 13  </head>
 14  <body>
 15   <canvas class="stage"></canvas>
 16   <script>
 17     (function(win,el){
 18         var cvs=document.querySelector(el),
 19             ctx=cvs.getContext("2d"),
 20             width,
 21             height,
 22             mouse={},
 23             scale=1,
 24             min_scale=1,
 25             max_scale=2.5,
 26             isMouseDown=false,
 27             radius=50,
 28             circlesNum=10,
 29             circles=[];
 30
 31             Function.prototype.method=function(k,v){
 32                return this.prototype[k]=v,this;
 33             };
 34
 35             function Circle(x,y,center,radius){
 36                this.x=x;
 37                this.y=y;
 38                this.curX=x;
 39                this.curY=y;
 40                this.center=center;
 41                this.speed=0.01+Math.random()*0.04;
 42                this.angle=0;
 43                this.color="hsl("+Math.random()*360+",100%,50%)";
 44                this.lineWidth=1;
 45                this.targetWidth=5;
 46                this.radius=radius;
 47             }
 48
 49             Circle.method("draw",function(ctx,zoom){
 50                 var x=this.x,y=this.y;
 51                 this.angle+=this.speed;
 52
 53                 this.curX+=(this.center.x-this.curX)*this.speed;
 54                 this.curY+=(this.center.y-this.curY)*this.speed;
 55
 56
 57                 this.x=this.curX+Math.cos(this.angle)*this.radius*zoom;
 58                 this.y=this.curY+Math.sin(this.angle)*this.radius*zoom;
 59                 this.lineWidth+=(this.targetWidth-this.lineWidth)*0.05;
 60
 61                 if(Math.abs(this.targetWidth-this.lineWidth)<0.5)
 62                 {
 63                    this.targetWidth=1+Math.random()*6;
 64                 }
 65
 66                 ctx.strokeStyle=this.color;
 67                 ctx.lineWidth=this.lineWidth;
 68
 69
 70                 ctx.beginPath();
 71                 ctx.moveTo(x,y)
 72                 ctx.lineTo(this.x,this.y);
 73
 74                 ctx.stroke();
 75
 76             });
 77
 78             function init(){
 79                 var bound=cvs.getBoundingClientRect(),i=circlesNum,segment=i*10;
 80                 cvs.width=width=bound.width;
 81                 cvs.height=height=bound.height;
 82
 83                 ctx.fillStyle="rgba(0,0,0,.05)";
 84                 ctx.lineCap="round";
 85
 86                 mouse.x=width/2;
 87                 mouse.y=height/2;
 88
 89                 while(i--)
 90                   circles[i]=new Circle(0,0,mouse,radius+Math.random()*segment);
 91
 92                 cvs.addEventListener("mousemove",function(e){
 93                     mouse.x=e.clientX;
 94                     mouse.y=e.clientY;
 95                 },false);
 96
 97                 cvs.addEventListener("mousedown",function(){
 98                     isMouseDown=true;
 99                 },false);
100
101                 cvs.addEventListener("mouseup",function(){
102                     isMouseDown=false;
103                 },false);
104                 cvs.addEventListener("mouseout",function(){
105                     isMouseDown=false;
106                 },false);
107
108                 render();
109             }
110
111             function render(){
112               var i=circlesNum;
113               scale+=isMouseDown?(max_scale-scale)*0.05:(min_scale-scale)*0.05;
114               ctx.fillRect(0,0,width,height);
115
116               while(i--)
117                  circles[i].draw(ctx,scale);
118
119               requestAnimationFrame(render);
120
121             }
122
123             init();
124
125     })(this,".stage");
126   </script>
127  </body>
128 </html>
时间: 2024-10-05 13:35:22

非常不错的canvas效果,线随心动的相关文章

不错的动画效果-AndroidViewHover

不错的动画效果-AndroidViewHover 不错的动画效果,调用起来API也十分方便,在十行之内,使用Android Studio可以方便的导入所需的依赖库,如果是Eclipse的话,需要手动去导入依赖jar,详情请看:https://github.com/daimajia/AndroidViewHover,这个源码不仅可以学到炫酷的动画效果,还可以学习下类似IOS上毛玻璃效果的实现,是不是很高大上呀! 下载地址:http://www.devstore.cn/code/info/368.h

一个不错的loading效果

一个不错的loading加载效果,弹性收缩,效果不错,学习android动画的朋友可以下载来研究研究本例子其实由SeekBar实现,由MetaballView,MetaballDebugView实现动画效果.当滑动到有一个位置的时候设置选中和未选中状态.metaballView.setPaintMode();           debugMetaballView.setPaintMode();设置SeekBar 的进度debugMetaballView.setMaxDistance(progr

canvas 连线动画

html代码 <canvas id="canvas">您的浏览器不支持canvas</canvas> css代码 #canvas {     background-color: cadetblue;     display: block;     overflow: hidden; } javascript代码 var canvas = document.getElementById("canvas"); var ctx = canvas.g

【canvas系列】canvas实现“ 简单的Amaziograph效果”--画对称图【强迫症福利】

标题很难引人入胜,先放个效果图好了 如果图片吸引不了你,那我觉得也就没啥看的了. demo链接: https://win7killer.github.io/can_demo/demo/draw_roll_2.html ************************************************* 上次"雷达图效果"文章很荣幸,被"某天头条"抓数据抓去了,不开心的是demo链接等所有链接都干掉了~~~  blabla,连个名字都木有. 想看的再看下

HTML5 3D动画效果

对以前来讲,3D动画拿到网页上展示是一件非常奢侈的事情,第一是浏览器不够先进,第二是大部分只能用flash实现伪3D.HTML5的出现,让实现网页3D动画变得非常简单,当然前提是你不要再使用像IE678之类的浏览器了.下面精选的几款HTML5 3D动画,希望你会喜欢. 1.HTML5 SVG 3D空间模型 可拖拽缩放 这是一个基于HTML5和SVG的3D空间模型,这个3D模型提供了x.y.z三个坐标轴以及一个平面网格.我们可以对这个HTML5 3D模型进行缩放.拖拽.翻转等操作,这些操作可以通过

html5 canvas元素使用(一)

html5新增了一个canvas元素,用于在网页上生成一块矩形区域,用于绘制图像,功能非常强大,下面我来简单介绍一下 在页面中添加canvas 1 <canvas id="canvasDemo">您的浏览器暂不支持canvas</canvas> 如上图所示,如果不给canvas设置宽高,默认宽是300px,高是150px.同时,canvas默认是透明的 我们可以给它设置宽高,边框,甚至背景颜色. 注意,这边设置的宽高是画布的属性,和style的是不一样的 1 &

canvas 的基本使用

一.canvas的介绍 canvas是html5出现的新标签,像所有的DOM对象一样它有自己本身 的属性.方法和事件,其中就有绘图的方法,js能够调用它来进行绘图.canvas只有两个属性,而且是可选的,width.height,这两个属性也可以通过 js 来定义. canvas如果没有定义大小,则默认大小为宽 300px,高 150px.当然使用 css 也是可以设置 canvas 的大小,但如果css设置的宽高比例与 js 或在 标签的属性 width.height上设置的比例不一致,则会变

利用canvas绘画二级树形结构图

上周需要做一个把页面左侧列表内容拖拽到右侧区域,并且绘制成关系树的功能.看了设计图,第一反应是用canvas绘制关系线.吭哧吭哧搞定这个功能后,发现用canvas绘图,有一个很严重的缺陷.那就是如果左侧关系特别多,需要绘制成百上千条时,而canvas画布的宽高在写dom的时候就已声明.关系很多的情况下,无法使用canvas.不过还是记录一下研究成果.下面是设计图: 做出效果如下: html.css代码就不贴了. js主要用到了拖拽.canvas绘制. function startDrag(ev)

Android中canvas.save()和canvas.restore()的使用

自己定义控件时经常遇到重写View的Ondraw()方法,Ondraw()方法经常设计到save()和restore()这两个方法.这两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的. 详细作用例如以下: 1.save():用来保存Canvas的状态,save()方法之后的代码,能够调用Canvas的平移.放缩.旋转.裁剪等操作! 2.restore():用来恢复Canvas之前保存的状态,防止save()方法代码之后对Canvas运行的操作.继续对兴许的绘制会产生影响.通过该方法