JavaScript canvas实现雨滴特效


Posted in Javascript onJanuary 10, 2021

本文实例为大家分享了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定时器改变坐标的方式实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中的变量声明早于赋值分析
Mar 01 Javascript
详谈jQuery中的this和$(this)
Nov 13 Javascript
jQuery中appendTo()方法用法实例
Jan 08 Javascript
使用JavaScript开发IE浏览器本地插件实例
Feb 18 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
Mar 16 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
Sep 01 Javascript
手机端实现Bootstrap简单图片轮播效果
Oct 13 Javascript
AngularJs分页插件使用详解
Jun 30 Javascript
JavaScript中的 new 命令
May 22 Javascript
JS如何实现动态添加的元素绑定事件
Nov 12 Javascript
在nuxt中使用路由重定向的实例
Nov 06 Javascript
JavaScript实现复选框全选功能
Apr 11 Javascript
多种类型jQuery网页验证码插件代码实例
Jan 09 #jQuery
利用JS判断元素是否为数组的方法示例
Jan 08 #Javascript
JS实现页面侧边栏效果探究
Jan 08 #Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 #Vue.js
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 #Vue.js
详解Typescript里的This的使用方法
Jan 08 #Javascript
Node.js 中如何收集和解析命令行参数
Jan 08 #Javascript
You might like
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
js window.event对象详尽解析
2009/02/17 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
python requests 使用快速入门
2017/08/31 Python
python中如何使用insert函数
2020/01/09 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
"引用"与多态的关系
2013/02/01 面试题
星空联盟C# .net笔试题
2014/12/05 面试题
大学生毕业求职自荐书范文
2014/02/04 职场文书
小学英语教学反思案例
2014/02/04 职场文书
前台岗位职责
2015/02/13 职场文书
2015年药房工作总结
2015/04/25 职场文书
Python中常见的导入方式总结
2021/05/06 Python
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android