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 学习之旅 (2)
Feb 05 Javascript
JavaScript基础语法、dom操作树及document对象
Dec 02 Javascript
Bootstrap图片轮播组件使用实例解析
Jun 30 Javascript
微信小程序 教程之wxapp视图容器 swiper
Oct 19 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
Nov 18 Javascript
深入浅析Vue组件开发
Nov 25 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
基于JS实现移动端左滑删除功能
Jul 28 Javascript
VueJs组件prop验证简单介绍
Sep 12 Javascript
微信小程序中post方法与get方法的封装
Sep 26 Javascript
JavaScript代码简化技巧实例解析
Sep 09 Javascript
vue vant中picker组件的使用
Nov 03 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
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
PHP分享图片的生成方法
2018/04/25 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
js获取内联样式的方法
2015/01/27 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
Python实现图片拼接的代码
2018/07/02 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
Tensorflow累加的实现案例
2020/02/05 Python
Python中Yield的基本用法
2020/10/18 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
浙江文明网签名寄语
2014/01/18 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
浅谈Python数学建模之数据导入
2021/06/23 Python