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模拟的QQ面板上的多级可展开的菜单
Oct 10 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
Apr 08 Javascript
jquery常用操作小结
Jul 21 Javascript
JavaScript中用toString()方法返回时间为字符串
Jun 12 Javascript
探讨跨域请求资源的几种方式(总结)
Dec 02 Javascript
Angular JS 生成动态二维码的方法
Feb 23 Javascript
浅谈vue项目如何打包扔向服务器
May 08 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
Aug 13 Javascript
vue模式history下在iis中配置流程
Apr 17 Javascript
vue element 生成无线级左侧菜单的实现代码
Aug 21 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 jQuery
js this 绑定机制深入详解
Apr 30 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 zend解密软件绿色版测试可用
2008/04/14 PHP
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
php 无限级数据JSON格式及JS解析
2010/07/17 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
Python多线程实例教程
2014/09/06 Python
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
对python函数签名的方法详解
2019/01/22 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
银行职员思想汇报
2013/12/31 职场文书
合作投资意向书
2014/04/01 职场文书
关于安全的演讲稿
2014/05/09 职场文书
五四青年节的活动方案
2014/08/20 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
环境保护建议书
2014/08/26 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
python分分钟绘制精美地图海报
2022/02/15 Python
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js