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 ...
随机推荐
- 云服务器 ECS--查找公网ip使用终端连接云服务
前段时间购买了阿里云服务器,购买之后一直没用使用,今天来操作一波,可谓一波三折,只能说,不看他们的操作指南你可能连地方都找不到,所以,在这里,我想给初次购买阿里云服务的童鞋门,写写我是怎么使用阿里云服 ...
- Android studio常用快捷键与设置
1.格式化代码: 命令 快捷键 将代码合并成一行 Ctrl + Shift + J 格式化 Ctrl+Alt+L 2.API函数参数提示:双击选中所要提示的函数,再按F2即可显示函数的使用方法. 3. ...
- Spotlight 监控工具使用
监控MySQL数据库性能的工具:Spotlight on MySQL <转载> 我们的服务器数据库:是在windows2003上. 这款工具非常的花哨,界面很漂亮,自带报警. 1.创 ...
- 当学术邂逅浪漫 – 记MobiCom 2015大会
作者:微软亚洲研究院主管研究员 刘云新 今年的MobiCom大会在著名的浪漫之都巴黎举行.通常于欧洲举办的会议的参会人数会相对少一些,但今年的MobiCom大会吸引了近400人参加,绝不少于往年.浪漫 ...
- 查漏补缺:OSI七层模型和TCP/IP模型
应用层协议:Telnet.FTP.e-mail等 传输层协议:TCP.UDP.STCP等 网络层协议:IP.ICMP.IGMP等 链路层协议:设备驱动及接口卡
- LiteOS内核教程01-IoT-Studio介绍及安装
1. 物联网一站式开发工具 -- IoT Studio IoT Studio 是支持 LiteOS 嵌入式系统软件开发的工具,提供了代码编辑.编译.烧录 及调试等一站式开发体验,支持 C.C++.汇编 ...
- 【简单版】hexo博客搭建流程梳理
前言 本文章会为你梳理一个搭建hexo博客的流程 相关网址: Docs: https://hexo.io/docs/ Themes: https://hexo.io/themes/ 安装hexo 准备 ...
- React之mockjs+sass+生命周期函数
mdn W3C标准网站 运行sass cnpm i -D node-sass-chokidar npm-run-all rem单位设置 <script> //rem单位设置 documen ...
- Roma - Facebook工具链大一统
什么是roma roma,中文名罗马,是Facebook的rn团队的产出,是一个试验性质的javascript工具链,集编译,linter,格式化,打包,测试等等于一体.目标是成为一个处理javasc ...
- Qt_QChart的使用记录(小白)
主要是记录柱状图的数值显示,散点图的点坐标显示(防止后续忘记,把文件都贴出来,方便复查) 资源库: WarehouseInputOrOutput.pro QT += core gui QT += ch ...