canvas绘制流星雨特效
源码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="keywords" content="一起来看流星雨">
<meta name="description" content="流星雨效果">
<title>canvas雨滴</title>
<style>
body {
margin: 0
}
#rain {
display: block;
background: #33ffff;
/* width: 100%;
height: 100%; */
}
</style>
</head>
<body>
<canvas id="rain"></canvas>
<script>
// 1.1 设置canvas元素的宽高与浏览器一样
var can = document.getElementById("rain");
// 1.2 获取浏览器宽高
var w = window.innerWidth;
var h = window.innerHeight;
// 1.3 给canvas元素设置宽高
can.width = w
can.height = h
// 1.4 当窗口大小发生变化的时候自动再调整canvas的宽高
window.onresize = function() {
w = window.innerWidth
h = window.innerHeight
can.width = w
can.height = h
}
// 2 如何用canvas绘制图形 画布(卷轴 -> 宣纸)
var canContent = can.getContext("2d") //拿到画画的宣纸
function Rain() {} //生成雨滴的封装函数
//随机函数,生成x和y的坐标
function random(min, max) {
return Math.random() * (max - min) + min
}
Rain.prototype = {
init: function() {
this.x = random(0, w) //雨滴初始的x坐标
this.y = 0 //雨滴初始的y坐标
this.v = random(4, 5) //下落加速度
this.h = random(0.8 * h, 0.9 * h) //雨滴下落的地面
this.r = 1//初始半径
this.vr = random(0.4, 0.6) //半径增长率
this.a = 1//初始透明度
this.va = 0.96 // 透明度变化系数
},
draw: function() {
if (this.y < this.h) {
canContent.fillStyle = "#33ffff" //拿一只画实心图形的红色的笔
canContent.fillRect(this.x, this.y, 2, 10) // 画一个实心的矩形
} else {
canContent.strokeStyle = "rgba(51,255,255," + this.a + ")"
canContent.beginPath() //重新拿起笔
canContent.arc(this.x, this.y, this.r, 0, Math.PI * 2)
canContent.stroke();
}
},
move: function() {
if (this.y < this.h) {
this.y += this.v
} else {
if (this.a > 0.02) {
this.r += this.vr
if(this.r > 50){
this.a *= this.va
}
} else {
this.init()
}
}
this.draw()
}
}
//复用性
var rainArray = []
function createRain() {
var rain = new Rain()
rain.init() //基本配置
rain.draw()
rainArray.push(rain)
}
createRain()
for (var i = 0; i < 30; i++) {
setTimeout(createRain, 200 * i)
}
function moveRain() {
canContent.fillStyle = "rgba(0, 0, 0, 0.05)"
canContent.fillRect(0, 0, w, h)
for (var k = 0; k < rainArray.length; k++) {
rainArray[k].move();
}
}
function run(){
moveRain()
setTimeout(run, 100 / 60)
}
run()
// setInterval(moveRain, 1000 / 60) //所有的计算和渲染必须在16ms内完成
</script>
</body>
</html>
分析:
雨滴由rain函数创建,rain的原型上挂在的init、draw、move分别对应的是数据初始化、雨滴绘制、雨滴移动;
雨滴其实是一个小长方形,每次产生一个遮罩层和一个小长方形,那么之前的小长方形会逐渐倍淡化直到看不见,这就产生了视觉上的错觉,形成了小雨滴的形态
通过move反复改变小长方形的位置,并重新加遮罩层,并且绘制小长方形,就实现了下滴的感觉
快到底部时停止绘制小长方形,但是遮罩层依旧存在,开始绘制小圆,并且小圆半径逐渐扩大,实现雨滴扩散的效果,当小圆半径扩大到一定程度时开始让小圆逐渐变得透明直到消失
效果图:

canvas绘制流星雨特效的更多相关文章
- 使用 HTML5 Canvas 绘制出惊艳的水滴效果
HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...
- Canvas与javaScript特效笔记
第六章 Canvas与javaScript特效笔记 q <canvas>标签的用途 HTML5 canvas 提供了通过 JavaScript 绘制图形的方法,此方法使用简单但功能强 ...
- canvas之背景特效
需具备js基础知识以及canvas相关方法(可查阅相关文档) 下面是一篇有关js与canvas的背景特效 基于面向过程的思维 <!DOCTYPE html> <html> &l ...
- 结合canvas做雨滴特效
雨滴特效 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- HTML5学习总结——canvas绘制象棋(canvas绘图)
一.HTML5学习总结——canvas绘制象棋 1.第一次:canvas绘制象棋(笨方法)示例代码: <!DOCTYPE html> <html> <head> & ...
- 用canvas绘制折线图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 封装 用canvas绘制直线的函数--面向对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 学习笔记:HTML5 Canvas绘制简单图形
HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...
- canvas绘制经典折线图(一)
最终效果图如下: 实现步骤如下:注-引用了jQuery HTML代码 <!doctype html> <html lang="en"> <head&g ...
随机推荐
- Python如何让字典保持有序
问题: Python如何让字典保持有序 ? 解决方案: 使用collections.OrderedDict代替Dict. 验证程序: from collections import OrderedDi ...
- AIDLservice
有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定.具体的启动情况有下: 其中很重要一点:bindService和unbindService是成对出现的. 1 ...
- Welcome to Giyber Blog - LC的博客
"You can be the best! " 一切才刚开始 "不知道行不行,试试吧."抱着这样的理由,一个小白的成长记录,由此开始. 在 Mr.锤 的&quo ...
- Golang: chan定义问题(7)
通常都是定义读写双向的 chan,定义单向 chan 问题. 专栏的介绍可以参考 <GotchaGolang专栏>,代码可以看<宝库-Gotcha>. 通过 只写 chan 传 ...
- 迈克尔·乔丹:几百年内AI不会觉醒
此乔丹非飞人乔丹.他是研究统计学和计算机科学家,目前研究的领域正是普通人所说的人工智能.权威的学术搜索引擎Semantic Scholar在2105年做了一项排名,关于计算机科学领域谁最具影响力 ...
- Android中使用AsyncTask
>##今天写作业用到了AnsyncTask,记录一下自己的使用情况 >###1.Android.os.AsyncTask类 > 1.AsyncTask类对线程间通讯进行了包装,我们 ...
- string类应用举例
* Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhello ...
- 后渗透之meterpreter使用攻略
Metasploit中的Meterpreter模块在后渗透阶段具有强大的攻击力,本文主要整理了meterpreter的常用命令.脚本及使用方式.包含信息收集.提权.注册表操作.令牌操纵.哈希利用.后门 ...
- 小白学 Python 数据分析(12):Pandas (十一)数据透视表(pivot_table)
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- 解决vue2.0下IE浏览器白屏问题
公司新开发的项目需要兼容到IE9+ 就在index.html页面加入 <meta http-equiv="X-UA-Compatible" content="IE= ...