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中的undefined 与 null 的区别  补充篇
Mar 17 Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
Sep 10 Javascript
javascript验证身份证完全方法具体实现
Nov 18 Javascript
jQuery中获取checkbox选中项等操作及注意事项
Nov 24 Javascript
关于js内存泄露的一个好例子
Dec 09 Javascript
深入理解JS中的变量及作用域、undefined与null
Mar 04 Javascript
JavaScript中模拟实现jsonp
Jun 19 Javascript
js实现数组转换成json
Jun 26 Javascript
JSON+Jquery省市区三级联动
Jan 13 Javascript
input框中的name和id的区别
Nov 16 Javascript
在小程序中使用canvas的方法示例
Sep 17 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
Nov 02 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
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
jquery垂直公告滚动实现代码
2013/12/08 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
Vue中computed及watch区别实例解析
2020/08/01 Javascript
JS实现手风琴特效
2020/11/08 Javascript
python dict remove数组删除(del,pop)
2013/03/24 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
2017/08/15 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
python实例化对象的具体方法
2020/06/17 Python
python如何爬取网页中的文字
2020/07/28 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
市场营销专业推荐信
2013/11/03 职场文书
大二学习计划书范文
2014/04/27 职场文书
理发店策划方案
2014/06/05 职场文书
环保志愿者活动方案
2014/08/14 职场文书
小学生家长意见
2015/06/03 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
自考生自我评价
2019/06/21 职场文书
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android
Go获取两个时区的时间差
2022/04/20 Golang