canvas礼花小程序

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4     <title></title>
  5 </head>
  6 <body style="  background-color: #000;">
  7 <canvas id="canvas"></canvas>
  8
  9 <script>
 10 window.requestAnimFrame = ( function() {
 11     return window.requestAnimationFrame ||
 12                 window.webkitRequestAnimationFrame ||
 13                 window.mozRequestAnimationFrame ||
 14                 function( callback ) {
 15                     window.setTimeout( callback, 1000 / 60 );
 16                 };
 17 })();
 18 var canvas = document.getElementById( ‘canvas‘ ),
 19         ctx = canvas.getContext( ‘2d‘ ),
 20         cw = window.innerWidth,
 21         ch = window.innerHeight,
 22         fireworks = [],
 23         particles = [],
 24         hue = 120,
 25         limiterTotal = 5,
 26         limiterTick = 0,
 27         timerTotal = 80,
 28         timerTick = 0,
 29         mousedown = false,
 30         mx,
 31         my;
 32
 33 canvas.width = cw;
 34 canvas.height = ch;
 35
 36 function random( min, max ) {
 37     return Math.random() * ( max - min ) + min;
 38 }
 39
 40 function calculateDistance( p1x, p1y, p2x, p2y ) {
 41     var xDistance = p1x - p2x,
 42             yDistance = p1y - p2y;
 43     return Math.sqrt( Math.pow( xDistance, 2 ) + Math.pow( yDistance, 2 ) );
 44 }
 45
 46 function Firework( sx, sy, tx, ty ) {
 47
 48     this.x = sx;
 49     this.y = sy;
 50
 51     this.sx = sx;
 52     this.sy = sy;
 53
 54     this.tx = tx;
 55     this.ty = ty;
 56
 57     this.distanceToTarget = calculateDistance( sx, sy, tx, ty );
 58     this.distanceTraveled = 0;
 59
 60     this.coordinates = [];
 61     this.coordinateCount = 3;
 62
 63     while( this.coordinateCount-- ) {
 64         this.coordinates.push( [ this.x, this.y ] );
 65     }
 66     this.angle = Math.atan2( ty - sy, tx - sx );
 67     this.speed = 2;
 68     this.acceleration = 1.05;
 69     this.brightness = random( 50, 70 );
 70
 71     this.targetRadius = 1;
 72 }
 73
 74
 75 Firework.prototype.update = function( index ) {
 76
 77     this.coordinates.pop();
 78
 79     this.coordinates.unshift( [ this.x, this.y ] );
 80
 81     if( this.targetRadius < 8 ) {
 82         this.targetRadius += 0.3;
 83     } else {
 84         this.targetRadius = 1;
 85     }
 86
 87     this.speed *= this.acceleration;
 88
 89     var vx = Math.cos( this.angle ) * this.speed,
 90             vy = Math.sin( this.angle ) * this.speed;
 91
 92     this.distanceTraveled = calculateDistance( this.sx, this.sy, this.x + vx, this.y + vy );
 93
 94     if( this.distanceTraveled >= this.distanceToTarget ) {
 95         createParticles( this.tx, this.ty );
 96         fireworks.splice( index, 1 );
 97     } else {
 98         this.x += vx;
 99         this.y += vy;
100     }
101 }
102
103 Firework.prototype.draw = function() {
104     ctx.beginPath();
105     ctx.moveTo( this.coordinates[ this.coordinates.length - 1][ 0 ], this.coordinates[ this.coordinates.length - 1][ 1 ] );
106     ctx.lineTo( this.x, this.y );
107     ctx.strokeStyle = ‘hsl(‘ + hue + ‘, 100%, ‘ + this.brightness + ‘%)‘;
108     ctx.stroke();
109
110     ctx.beginPath();
111     ctx.arc( this.tx, this.ty, this.targetRadius, 0, Math.PI * 2 );
112     ctx.stroke();
113 }
114
115 function Particle( x, y ) {
116     this.x = x;
117     this.y = y;
118
119     this.coordinates = [];
120     this.coordinateCount = 5;
121     while( this.coordinateCount-- ) {
122         this.coordinates.push( [ this.x, this.y ] );
123     }
124
125     this.angle = random( 0, Math.PI * 2 );
126     this.speed = random( 1, 10 );
127
128     this.friction = 0.95;
129     this.gravity = 1;
130
131     this.hue = random( hue - 20, hue + 20 );
132     this.brightness = random( 50, 80 );
133     this.alpha = 1;
134     this.decay = random( 0.015, 0.03 );
135     //this.decay = 0;
136 }
137
138 Particle.prototype.update = function( index ) {
139
140     this.coordinates.pop();
141     this.coordinates.unshift( [ this.x, this.y ] );
142     this.speed *= this.friction;
143     this.x += Math.cos( this.angle ) * this.speed;
144     this.y += Math.sin( this.angle ) * this.speed + this.gravity;
145     this.alpha -= this.decay;
146
147     if( this.alpha <= this.decay ) {
148         particles.splice( index, 1 );
149     }
150 }
151
152 Particle.prototype.draw = function() {
153     ctx. beginPath();
154     ctx.moveTo( this.coordinates[ this.coordinates.length - 1 ][ 0 ], this.coordinates[ this.coordinates.length - 1 ][ 1 ] );
155     ctx.lineTo( this.x, this.y );
156     ctx.strokeStyle = ‘hsla(‘ + this.hue + ‘, 100%, ‘ + this.brightness + ‘%, ‘ + this.alpha + ‘)‘;
157     ctx.stroke();
158 }
159
160 function createParticles( x, y ) {
161     var particleCount = 30;
162     while( particleCount-- ) {
163         particles.push( new Particle( x, y ) );
164     }
165 }
166
167
168 function loop() {
169     requestAnimFrame( loop );
170
171     hue += 0.5;
172
173     ctx.globalCompositeOperation = ‘destination-out‘;
174     ctx.fillStyle = ‘rgba(0, 0, 0, 0.5)‘;
175     ctx.fillRect( 0, 0, cw, ch );
176     ctx.globalCompositeOperation = ‘lighter‘;
177
178     var i = fireworks.length;
179     while( i-- ) {
180         fireworks[ i ].draw();
181         fireworks[ i ].update( i );
182     }
183
184     var i = particles.length;
185     while( i-- ) {
186         particles[ i ].draw();
187         particles[ i ].update( i );
188     }
189
190     if( timerTick >= timerTotal ) {
191         if( !mousedown ) {
192             fireworks.push( new Firework( cw / 2, ch, random( 0, cw ), random( 0, ch / 2 ) ) );
193             timerTick = 0;
194         }
195     } else {
196         timerTick++;
197     }
198
199     if( limiterTick >= limiterTotal ) {
200         if( mousedown ) {
201             fireworks.push( new Firework( cw / 2, ch, mx, my ) );
202             limiterTick = 0;
203         }
204     } else {
205         limiterTick++;
206     }
207 }
208
209 canvas.addEventListener( ‘mousemove‘, function( e ) {
210     mx = e.pageX - canvas.offsetLeft;
211     my = e.pageY - canvas.offsetTop;
212 });
213
214 canvas.addEventListener( ‘mousedown‘, function( e ) {
215     e.preventDefault();
216     mousedown = true;
217 });
218
219 canvas.addEventListener( ‘mouseup‘, function( e ) {
220     e.preventDefault();
221     mousedown = false;
222 });
223
224 window.onload = loop;
225 </script>
226 </body>
227 </html>
时间: 2024-11-05 22:35:42

canvas礼花小程序的相关文章

javascript canvas九宫格小程序

js核心代码 1 /* 2 *canvasid:html canvas标签id 3 *imageid:html img 标签id 4 *gridcountX:x轴图片分割个数 5 *gridcountY:y轴图片分割个数 6 *gridspace:宫格空隙 7 *offsetX:x*y宫格相对canvas(0,0)X坐标偏移量 8 **offsetX:x*y宫格相对canvas(0,0)Y坐标偏移量 9 *isanimat:是否启用动画显示 10 */ 11 function ImageGrid

微信小程序-整理各种小程序源码和资料免费下载

微信小程序整理下载 [小程序源码]微信小程序-车源宝微信版 [小程序源码]小程序-微赞社区(论坛demo) [小程序源码]微信小程序-收支账单 [小程序工具]微信小程序-日历 [小程序源码]小程序-在线聊天功能 [小程序源码]微信小程序-大好商城(新增功能天气查询和2048游戏) [小程序源码]微信小程序-查询号码归属地 [小程序源码]微信小程序-备忘录2 [小程序源码]微信小程序-QQ音乐 [小程序源码]小程序-货币汇率 [小程序源码]微信小程序-大学图书馆 [小程序源码]小程序-积分商城 [

微信小程序_基础组件大全

微信小程序_基础组件 微信小程序为小程序开发者提供了一系列小程序基础组件,开发者可以通过组合这些小程序基础组件进行微信小程序的快速开发. 微信小程序组件是什么?微信小程序组件怎么用? 小程序组件是视图层的基本组成单元.小程序组件自带一些功能与微信风格的样式.一个小程序组件通常包括开始标签和结束标签,属性用来修饰这个组件,内容在两个标签之内. <tagname property="value"> Content goes here ... </tagename>

用微信小程序开发的Canvas绘制可配置的转盘抽奖

使用https://github.com/givebest/GB-canvas-turntable代码移植过而来. 其它 微信小程序感觉是个半成品,代码移植过程比较繁琐麻烦.canvas API 部分都被重写了...canvas z-index不生效,永远在最上层,不支持rotate动画. 更多:点击打开链接

超详细,用canvas在微信小程序上画时钟教程

最近开始学习canvas,看了慕课网的一个视频,开始自己动手在微信小程序上画个时钟, 首先我们可以先看以下微信小程序的官方文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/canvas/reference.html 和canvas的手册对比:http://www.w3school.com.cn/tags/html_ref_canvas.asp 我觉得其实除了删减一些内容之外没什么太大的区别 直接贴代码: wxml <!--index.wxml-->

微信 小程序 canvas

测试手机为IPHONE6,开发者工具版本0.10.102800 微信小程序里的canvas 非 h5 canvas有很多不一样的地方,以下把微信小程序的canvas叫做wxcanvas 下面全是我一点点测试出的干货,耐心看: 1.wxcanvas,不像h5canvas那样有width和height属性和width和height的style样式.他只有style样式,可以理解为他就是个框吧: 2.wxcanvas不要当成真的H5canvas,就当它是个div就行,画出范围的东西也是存在的,改变wi

微信小程序把玩(四十一)canvas API

原文:微信小程序把玩(四十一)canvas API 绘图是每个移动应用必备的技术,基本上和Android,IOS,等移动开发都是相同的,创建个上下文,给你个画布再上画,官网给的小例子都比较全了自己去看吧,drawImage时没有反应不知道是BUG还是电脑不能测试待定,http://wxopen.notedown.cn/api/api-canvas.html 屏幕就像是数学上的坐标轴,且在第四象限,以屏幕左上角为圆点,X轴向右为正向左为负,Y轴向下为正向上为负(这点和数学上相反的)以圆点为基点画个

小程序canvas截图组件

最近做一个小程序的过程中,需要用到截图功能,网上搜了一下,发现没有符合要求的,就自己搞了个组件,方便复用. 目前功能很简单,传入宽高和图片路径即可,宽高是为了计算截图的比例,只支持缩放和移动. 实现思路是: 1.模拟一个截取框:2.移动图片位置,缩放图片:3.获取图片在其中的位置(left,top,width,height):4.使用canvas绘制图片,然后截取就ok了. 其中第二步的缩放图片比较麻烦,缩放中心点以及平滑缩放 以下是我的实现方式 wxml: <!--component/picP

微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)

最近在学小程序,在把当前画布指定区域的内容导出并生成图片保存到本地这个知识点上踩坑了. 这里用到的方法是: wx.canvasToTempFilePath(),该方法作用是把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径.(详情 看文档) 这里先来分析一下这句话:导出当前画布指定区域的内容并生成图片 .这里以画一个矩形并将该矩形保存到本地相册为例. 首先我们要做的是先在画布上画一个矩形,其次是利用 wx.canvasToTempFilePath()方法导出画布指定区域的内容,这里当