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系列之数值计算
Jun 07 Javascript
ajax 同步请求和异步请求的差异分析
Jul 04 Javascript
JS基础之undefined与null的区别分析
Aug 08 Javascript
jquery中实现时间戳与日期相互转换
Apr 12 Javascript
Vue.js常用指令汇总(v-if、v-for等)
Nov 03 Javascript
打造通用的匀速运动框架(实例讲解)
Oct 17 Javascript
实例分析JS与Node.js中的事件循环
Dec 12 Javascript
React Component存在的几种形式详解
Nov 06 Javascript
Vue源码解析之数据响应系统的使用
Apr 24 Javascript
vue中 this.$set的用法详解
Sep 06 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
Sep 27 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
Nov 23 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和MySQL保存和输出图片
2006/10/09 PHP
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
一页面多XMLHttpRequest对象
2007/01/22 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
jquery实现炫酷的叠加层自动切换特效
2015/02/01 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
angular实现商品筛选功能
2017/02/01 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
js实现拖拽上传图片功能
2017/08/01 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
夏季奶茶店创业计划书
2014/01/16 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
《三国志》赏析
2019/08/27 职场文书