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 相关文章推荐
IE6下JS动态设置图片src地址问题
Jan 08 Javascript
jquery EasyUI的formatter格式化函数代码
Jan 12 Javascript
jquery写个checkbox——类似邮箱全选功能
Mar 19 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
Angularjs material 实现搜索框功能
Mar 08 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
Mar 24 Javascript
Bootstrap 手风琴菜单的实现代码
Jan 20 Javascript
用angular实现多选按钮的全选与反选实例代码
May 23 Javascript
JS文件中加载jquery.js的实例代码
May 05 jQuery
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
May 22 Javascript
JS中比Switch...Case更优雅的多条件判断写法
Sep 05 Javascript
vue中的循环对象属性和属性值用法
Sep 04 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
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
Python中的集合介绍
2019/01/28 Python
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
高级护理专业大学生求职信
2013/10/24 职场文书
工厂厂长岗位职责
2013/11/08 职场文书
计算机专业毕业生推荐信
2013/11/25 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
青年文明号申报材料
2014/12/23 职场文书
欢迎词范文
2015/01/27 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP
golang slice元素去重操作
2021/04/30 Golang
Golang 并发编程 SingleFlight模式
2022/04/26 Golang