canvas基础知识点参考各种文档,直接上代码,有非常详细注释

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>canvas雨滴特效</title>
<style>
body{
margin: 0;
overflow: hidden;
}
#rain{
display: block;
background-color: #000;
}
</style>
</head>
<body>
<canvas id="rain"></canvas> <script>
//获取canvas元素
const canvas = document.querySelector('#rain');
//设置canvas元素宽高的函数
var wX,wY;
~~function setSize(){
//监控窗口发生变化时自动调用setSize函数
window.onresize = arguments.callee;
//获取浏览器窗口宽高
wX = window.innerWidth;
wY = window.innerHeight;
//给canvas设置宽高
canvas.width = wX;
canvas.height = wY;
}();
//获取绘制区域(相当于画笔,可在canvas中任意位置绘制图形)
var ctx = canvas.getContext('2d'); //随机产生两个数之间随机数
function random(min,max){
return Math.random()*(max-min) + min;
}
//生成雨滴的构造函数
function Rain(){};
//添加原型方法
Rain.prototype = {
init : function(){
this.x = random(0,wX);//雨滴横坐标
this.y = 0;//雨滴纵坐标默认从最上方下落
this.v = random(3,4);//雨滴每秒下落的速度
this.h = random(0.9*wY,wY);//下落到窗口高度的90%~100%
this.r = 1;//雨滴绽放的初始半径
this.vr = 0.4;//半径扩大的速度
},
draw : function(){
if(this.y<this.h){//判断是否在90%~100%之间
ctx.beginPath(); //抬笔作画
ctx.fillStyle = '#666'; //内容实心用颜色填充
ctx.fillRect(this.x,this.y,4,8); //画矩形小雨滴
}else{//不在区间则以下落到地绽放成圆
ctx.beginPath();
ctx.strokeStyle = '#666';
ctx.arc(this.x,this.y,this.r,0,Math.PI*2);
ctx.stroke();
}
},
move : function(){
if(this.y<this.h){//下落
this.y+=this.v;//每秒下落3~4滴的距离
}else{//绽放成圆
if(this.r<35){
this.r+=this.vr;
}else{
this.init();
}
}
this.draw();//移动的雨滴画出来
}
} //生成的雨滴要添加动画为方便找到存在数组中
var aRain = [];
//创造雨滴函数
function createRain(num){
for(var i=0;i<num;i++){
setTimeout(function(){//每隔200毫秒生成一个
var rain = new Rain();
rain.init();
rain.draw();
aRain.push(rain);
},200*i)
}
}
createRain(50); //用定时器画帧形成动画
setInterval(function(){
// ctx.clearRect(0,0,wX,wY);//擦除上一个图形(下雪的感觉)
// 这里不是擦除雨滴效果是加蒙版达到渐变效果
ctx.fillStyle = 'rgba(0,0,0,0.05)';
ctx.fillRect(0,0,wX,wY);
for(var item of aRain){
item.move();
}
},1000/144);//根据自己屏幕刷新频率设置(此处是144HZ) </script>
</body>
</html>

内容本人原创,有不足之处请见谅!欢迎指正!转载请注明出处附上链接,谢谢!

最新文章

  1. Java控制Appium server start/stop
  2. 怎样修改 Openstack Horizon(Dashboard)的显示界面 (一)
  3. 理解js中this的指向
  4. bootstarp 样式细节(tooltip布局)
  5. css3用AnimationEnd判断动画是否完成, css3在动画完成后执行事件
  6. SOA和Web Service介绍
  7. LeetCode37 Sudoku Solver
  8. c# 使用ChartDirector绘图的一些个人体会
  9. linux shell if 参数
  10. winform中的 datagriview 字段自动填充长度
  11. Windows Server 2016-客户端加域端口汇总
  12. 【XSY2693】景中人 区间DP
  13. Vagrant 中配置局域网端口
  14. 【C#】解析C#中JSON.NET的使用
  15. 第7月第19天 swift on linux
  16. linux安装PHP-memcache-redis扩展
  17. python开发_pprint()
  18. Git 版本导致 clone 故障
  19. [BZOJ1601][Usaco2008 Oct]灌水 最小生成树水题
  20. 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

热门文章

  1. (三)AppScan扫描策略的选择
  2. SQL的左连接与右链接
  3. 017_STM32程序移植之_AS608指纹模块
  4. Start Failed, Internal error: recovering IDE to the working state after the critical startup error
  5. 开源分布式中间件 DBLE 快速入门指南
  6. 参数类型 (@Controller层)
  7. Java进阶知识25 Spring与Hibernate整合到一起
  8. [Luogu] 魔板
  9. C/C++语言之由数字26引起的文件的数据保存与读取调试。
  10. pymysql基本使用