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 相关文章推荐
JS获取后台Cookies值的小例子
Mar 04 Javascript
Jquery实现弹出层分享微博插件具备动画效果
Apr 03 Javascript
jquery.ui.draggable中文文档(原文翻译)
Nov 15 Javascript
jquery中push()的用法(数组添加元素)
Nov 25 Javascript
JS自定义混合Mixin函数示例
Nov 26 Javascript
基于JavaScript实现自动更新倒计时效果
Dec 19 Javascript
非常实用的vue导航钩子
Mar 20 Javascript
Vue中的v-cloak使用解读
Mar 27 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
Mar 08 Javascript
JS中promise化微信小程序api
Apr 12 Javascript
微信小程序Echarts图表组件使用方法详解
Jun 25 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
Nov 06 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
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
[49:31]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第二场 1月29日
2021/03/11 DOTA
Python threading多线程编程实例
2014/09/18 Python
Python中特殊函数集锦
2015/07/27 Python
Python中operator模块的操作符使用示例总结
2016/06/28 Python
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
django页面跳转问题及注意事项
2019/07/18 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
西班牙宠物用品和食品网上商店:Tiendanimal
2019/06/06 全球购物
领导干部培训感言
2014/01/23 职场文书
开学季活动策划方案
2014/02/28 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
依法行政工作汇报
2014/10/28 职场文书
先进党支部事迹材料
2014/12/24 职场文书
校园新闻稿范文
2015/07/18 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python