javascript canvas实现雨滴效果


Posted in Javascript onJune 09, 2021

本文实例为大家分享了javascript canvas实现雨滴效果的具体代码,供大家参考,具体内容如下

先看效果

javascript canvas实现雨滴效果

看起来很炫酷,其实就是实现了雨滴的掉落还有最后的圆

还是看源码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        body {
            background-color: #000;
        }
    </style>
</head>

<body>
    <canvas></canvas>
    <script>
        // 获取画布
        var canvas = document.querySelector('canvas')
        // 获取画笔
        var ctx = canvas.getContext('2d')
        // 不能用css改变画布大小
        var ch = canvas.height = window.innerHeight
        var cw = canvas.width = window.innerWidth
        // 放雨滴
        var arrRain = []
        // 监听屏幕大小,屏幕发生变化让画布也跟着改变大小
        window.onresize = function () {
            ch = canvas.height = window.innerHeight
            cw = canvas.width = window.innerWidth
        }
        // 获取一个随机数,目的是为了生成随机雨滴
        function randow(min, max) {
            return Math.random() * (max - min) + min
        }
        // 构造函数
        function Rain() {

        }
        // 为rain添加属性和方法
        Rain.prototype = {
            // 初始化位置和雨滴下落的圆的半径
            init: function () {
                this.x = randow(0, cw)
                this.y = 0
                // 雨滴最终落地的距离不能超出屏幕
                this.h = randow(0.8 * ch, 0.9 * ch)
                this.r = 1 // 开始圆的半径
                this.vr = 1 // 半径增长的速度
                this.vy = randow(4, 5)

            },
            // 画方法
            draw: function () {
                // 小于h的时候,画雨滴,画矩形
                if (this.y < this.h) {
                    ctx.beginPath()
                    ctx.fillStyle = 'white'
                    ctx.fillRect(this.x, this.y, 4, 10)
                } else {
                    // 画圆
                    ctx.beginPath()
                    ctx.strokeStyle = 'white'
                    ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI)
                    ctx.stroke()
                }
            },
            // 雨滴移动
            move: function () {
                // 小于h时,加y实现雨滴移动
                if (this.y < this.h) {
                    this.y += this.vy
                } else {
                    // 实现水花四溅的效果
                    if (this.r < 70) {
                        this.r += this.vr
                    } else {
                        // 结束效果之后初始化,又从天上生成雨滴,所以要调用init函数
                        this.init()
                    }
                }
                this.draw()
            }
        }
        // 生成雨滴
        function createRain(num) {
            for (var i = 0; i < num; i++) {
                // 随机生成雨滴,不是同时生成
                setTimeout(function () {
                    var rain = new Rain()
                    rain.init()
                    rain.draw()
                    arrRain.push(rain)
                }, 300 * i)
            }
        }
        createRain(60)
        setInterval(function () {
            ctx.beginPath()
            ctx.fillStyle = 'rgba(0,0,0,0.05)'
            ctx.fillRect(0, 0, cw, ch)
            for (var k of arrRain) {
                k.move()
            }
        }, 1000 / 80)
    </script>
</body>

</html>

这些也就是雨滴实现的源码,仅供参考。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
效率高的Javscript字符串替换函数的benchmark
Aug 02 Javascript
javascript针对DOM的应用实例(一)
Apr 15 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
Dec 09 Javascript
jquery显示loading图片直到网页加载完成的方法
Jun 25 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
Sep 22 Javascript
基于jQuery实现表格的查看修改删除
Aug 01 Javascript
Angularjs 依赖压缩及自定义过滤器写法
Feb 04 Javascript
angularJS实现动态添加,删除div方法
Feb 27 Javascript
vue双向数据绑定知识点总结
Apr 18 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
May 18 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
May 19 Javascript
Element Steps步骤条的使用方法
Jul 26 Javascript
用JS实现飞机大战小游戏
Jun 09 #Javascript
原生JS实现飞机大战小游戏
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 #Vue.js
JavaScript如何优化逻辑判断代码详解
Jun 08 #Javascript
浅谈react useEffect闭包的坑
Vue中插槽slot的使用方法与应用场景详析
vue+elementui 实现新增和修改共用一个弹框的完整代码
You might like
基于mysql的bbs设计(五)
2006/10/09 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
扩展String功能方法
2006/09/22 Javascript
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
Python 基础知识之字符串处理
2017/01/06 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
python删除某个目录文件夹的方法
2020/05/26 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
IBatis持久层技术
2016/07/18 面试题
卫校中专生的自我评价
2014/01/15 职场文书
优秀经理事迹材料
2014/02/01 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
勇敢的心观后感
2015/06/09 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
运动会报道稿大全
2015/07/23 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript