canvas制作雨滴下落至消失的特效方法是怎样
Admin 2022-06-14 群英技术资讯 545 次浏览
本文实例为大家分享了canvas实现雨滴特效的具体代码,供大家参考,具体内容如下
一、雨滴特效需求
雨滴从窗口顶部随机下落到达底部将呈现波纹逐渐散开变淡直到消失,雨滴特效随窗口变化自适应
二、雨滴实现思路
1. 用面向对象的思维 首先创建canvas画布 ,绘制一个雨滴的初始化形状
2. 在给雨滴添加运动的方法
3. 通过定时器让雨滴运动起来
三、具体分析
1.雨滴初始化需要的属性有哪些?
坐标x,y 宽高w,h 。
2.雨滴下落是逐渐加速下落不是匀速需要给一个加速度的属性,也就是y轴坐标不断加上加速度的值
3.雨滴下落到底部某一个区域后开始呈现波纹逐渐散开,也就是到达底部某个范围内开始画圆,圆逐渐变大并且变淡加上透明度
4.雨滴下落拖尾效果需要绘制一层阴影覆盖之前运动的雨滴
四、代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>canvas</title> <style> * { margin: 0; padding: 0; } canvas { vertical-align: middle; background: #000; } </style> </head> <body> <canvas id="myCanvas"></canvas> <script> // 创建画布 let myCanvas = document.getElementById('myCanvas') let ctx = myCanvas.getContext('2d') // 自适应窗口 let width = myCanvas.width = window.innerWidth let height = myCanvas.height = window.innerHeight window.addEventListener('resize', () => { width = myCanvas.width = window.innerWidth height = myCanvas.height = window.innerHeight }) // 绘制雨滴 let raindropArr = [] function Raindrop(x, y, w, h, l, r, dr, maxR, a, va) { this.x = rand(0, window.innerWidth) // 雨滴的x轴 this.y = y || 0 // 雨滴的y轴 this.dy = rand(2, 4) // 雨滴的加速度 this.w = w || 2 // 雨滴的宽度 this.h = h || 10 // 雨滴的高度 this.l = rand(0.8 * height, 0.9 * height) // 雨滴的下落高度 this.r = r || 1 // 波纹半径 this.dr = dr || 1 // 波纹增加半径 this.maxR = maxR || 50 // 波纹最大半径 this.a = a || 1 // 波纹透明度 this.va = 0.96 // 波纹透明度系数 } Raindrop.prototype = { draw: function (index) { // 绘制雨滴 if (this.y > this.l) { ctx.beginPath() ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2) ctx.strokeStyle = `rgba(0,191,255,${this.a})` ctx.stroke() } else { ctx.fillStyle = 'skyBlue' ctx.fillRect(this.x, this.y, this.w, this.h) } this.update(index) }, update: function (index) { // 更新雨滴坐标 运动起来 if (this.y > this.l) { if (this.a > 0.03) { this.r += this.dr if (this.r > this.maxR) { this.a *= this.va } } else { this.a = 0 raindropArr.splice(index, 1) } } else { this.y += this.dy } } } function rand(min, max) { return Math.random() * (max - min) + min } setInterval(() => { let raindrop = new Raindrop() raindropArr.push(raindrop) }, 100) setInterval(() => { ctx.fillStyle = 'rgba(0, 0, 0, 0.1)' ctx.fillRect(0, 0, myCanvas.width, myCanvas.height) for (let i = 0; i < raindropArr.length; i++) { raindropArr[i].draw(i) } }, 30) </script> </body> </html>
五、总结
canvas基本上任何运动,特效,都是通过js定时器改变坐标的方式实现。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了使用javascript实现双端队列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在前面随笔《循序渐进VUE+Element 前端应用开发之动态菜单和路由的关联处理》中介绍了在Vue + Element整合框架中,实现了动态菜单和动态路由的处理,从而可以根据用户角色对应的菜单实现本地路由的过滤和绑定,菜单顺利弄好了,就需要进一步开发页面功能了,本篇随笔介绍一个案例,通过获取后端数据后,进行产品信息页面的处理。
本文实例为大家分享了vue实现简易音乐播放器的具体代码,供大家参考,具体内容如下先看效果代码中使用的ivewUI前端框架使用的是font-awesome字体图标 需要先安装 npm install font-awesome --savetemplate Card style=width:100% temp
关于ES6字符串的扩展详解 目录 一.字符串的扩展 字符的 Unicode 表示法 字符串的遍历器接口 模板字符串 二.字符串的新增方法 includes(), startsWith(), endsWith() 实例方法:repeat() 实例方法:padStart(),padEnd() 实例方法:trimStart(),trimEnd() 总结 一.字符串的扩展 字符的 Unicode 表示法 ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点.
加减商品是购物车的一个很重要的操作,但一些新手可能不清楚该怎样做,对此,这篇文章就给大家分享用vue怎样实现购物车的加减商品功能,效果如下,感兴趣的朋友可以参考。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008