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 相关文章推荐
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
Jan 14 Javascript
实例详解ECMAScript5中新增的Array方法
Apr 05 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
May 03 Javascript
javascript获取select标签选中的值
Jun 04 Javascript
JS简单生成两个数字之间随机数的方法
Aug 03 Javascript
js实现上传图片预览方法
Oct 25 Javascript
JavaScript实现图片懒加载(Lazyload)
Nov 28 Javascript
JS实现复选框的全选和批量删除功能
Apr 05 Javascript
vue中使用element-ui进行表单验证的实例代码
Jun 22 Javascript
Vue基本使用之对象提供的属性功能
Apr 30 Javascript
Express结合Webpack的全栈自动刷新
May 23 Javascript
Vue修改项目启动端口号方法
Nov 07 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
第十四节 命名空间 [14]
2006/10/09 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
2016/10/31 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
人机交互程序 python实现人机对话
2017/11/14 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
2020/07/13 Python
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
董事长职责范文
2013/11/08 职场文书
英文产品推荐信
2015/03/27 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
html5调用摄像头截图功能
2022/01/18 Javascript