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 相关文章推荐
FireFox中textNode分片的问题
Apr 10 Javascript
直接生成打开窗口代码,不必下载
May 14 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
Aug 13 Javascript
JavaScript Array对象扩展indexOf()方法
May 09 Javascript
JavaScript制作淘宝星级评分效果的思路
Jun 23 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
Dec 23 Javascript
基于jQuery实现选取月份插件附源码下载
Dec 28 Javascript
JavaScript原型及原型链终极详解
Jan 04 Javascript
jQuery实现6位数字密码输入框
Dec 29 Javascript
浅析vue中的provide / inject 有什么用处
Nov 10 Javascript
深入webpack打包原理及loader和plugin的实现
May 06 Javascript
vue 遮罩层阻止默认滚动事件操作
Jul 28 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过滤表单提交的html等危险代码
2014/11/03 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
javascript事件问题
2009/09/05 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
Python面向对象之继承代码详解
2018/01/29 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
transform python环境快速配置方法
2018/09/27 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
学python爬虫能做什么
2020/07/29 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
不拖欠农民工工资承诺书
2014/03/31 职场文书
国庆促销活动总结
2014/08/29 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书