源码:

<!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绘制流星雨特效的更多相关文章

  1. 使用 HTML5 Canvas 绘制出惊艳的水滴效果

    HTML5 在不久前正式成为推荐标准,标志着全新的 Web 时代已经来临.在众多 HTML5 特性中,Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作 ...

  2. Canvas与javaScript特效笔记

    第六章   Canvas与javaScript特效笔记 q  <canvas>标签的用途 HTML5 canvas 提供了通过 JavaScript 绘制图形的方法,此方法使用简单但功能强 ...

  3. canvas之背景特效

    需具备js基础知识以及canvas相关方法(可查阅相关文档) 下面是一篇有关js与canvas的背景特效 基于面向过程的思维 <!DOCTYPE html> <html> &l ...

  4. 结合canvas做雨滴特效

    雨滴特效 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  5. HTML5学习总结——canvas绘制象棋(canvas绘图)

    一.HTML5学习总结——canvas绘制象棋 1.第一次:canvas绘制象棋(笨方法)示例代码: <!DOCTYPE html> <html> <head> & ...

  6. 用canvas绘制折线图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 封装 用canvas绘制直线的函数--面向对象

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 学习笔记:HTML5 Canvas绘制简单图形

    HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...

  9. canvas绘制经典折线图(一)

    最终效果图如下: 实现步骤如下:注-引用了jQuery HTML代码 <!doctype html> <html lang="en"> <head&g ...

随机推荐

  1. 云服务器 ECS--查找公网ip使用终端连接云服务

    前段时间购买了阿里云服务器,购买之后一直没用使用,今天来操作一波,可谓一波三折,只能说,不看他们的操作指南你可能连地方都找不到,所以,在这里,我想给初次购买阿里云服务的童鞋门,写写我是怎么使用阿里云服 ...

  2. Android studio常用快捷键与设置

    1.格式化代码: 命令 快捷键 将代码合并成一行 Ctrl + Shift + J 格式化 Ctrl+Alt+L 2.API函数参数提示:双击选中所要提示的函数,再按F2即可显示函数的使用方法. 3. ...

  3. Spotlight 监控工具使用

    监控MySQL数据库性能的工具:Spotlight on MySQL    <转载> 我们的服务器数据库:是在windows2003上. 这款工具非常的花哨,界面很漂亮,自带报警. 1.创 ...

  4. 当学术邂逅浪漫 – 记MobiCom 2015大会

    作者:微软亚洲研究院主管研究员 刘云新 今年的MobiCom大会在著名的浪漫之都巴黎举行.通常于欧洲举办的会议的参会人数会相对少一些,但今年的MobiCom大会吸引了近400人参加,绝不少于往年.浪漫 ...

  5. 查漏补缺:OSI七层模型和TCP/IP模型

    应用层协议:Telnet.FTP.e-mail等 传输层协议:TCP.UDP.STCP等 网络层协议:IP.ICMP.IGMP等 链路层协议:设备驱动及接口卡

  6. LiteOS内核教程01-IoT-Studio介绍及安装

    1. 物联网一站式开发工具 -- IoT Studio IoT Studio 是支持 LiteOS 嵌入式系统软件开发的工具,提供了代码编辑.编译.烧录 及调试等一站式开发体验,支持 C.C++.汇编 ...

  7. 【简单版】hexo博客搭建流程梳理

    前言 本文章会为你梳理一个搭建hexo博客的流程 相关网址: Docs: https://hexo.io/docs/ Themes: https://hexo.io/themes/ 安装hexo 准备 ...

  8. React之mockjs+sass+生命周期函数

    mdn W3C标准网站 运行sass cnpm i -D node-sass-chokidar npm-run-all rem单位设置 <script> //rem单位设置 documen ...

  9. Roma - Facebook工具链大一统

    什么是roma roma,中文名罗马,是Facebook的rn团队的产出,是一个试验性质的javascript工具链,集编译,linter,格式化,打包,测试等等于一体.目标是成为一个处理javasc ...

  10. Qt_QChart的使用记录(小白)

    主要是记录柱状图的数值显示,散点图的点坐标显示(防止后续忘记,把文件都贴出来,方便复查) 资源库: WarehouseInputOrOutput.pro QT += core gui QT += ch ...