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表数据排序 sort table data
Feb 18 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
JavaScript原生对象之Date对象的属性和方法详解
Mar 13 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
Apr 03 Javascript
PassWord输入框代码分享
Jun 07 Javascript
JS中常用的输出方式(五种)
Jun 12 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
Jun 20 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
微信小程序request请求后台接口php的实例详解
Sep 20 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
Dec 05 Javascript
vue实现一拉到底的滑动验证
Jul 25 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
Aug 26 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
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
python 5个实用的技巧
2020/09/27 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
初一学生期末评语
2014/04/24 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
医生见习报告范文
2014/11/03 职场文书
家长意见书
2015/06/04 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers
Redis实现短信验证码登录的示例代码
2022/06/14 Redis