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 new后的constructor属性
Aug 05 Javascript
JavaScript中“基本类型”之争小结
Jan 03 Javascript
解析JSON对象与字符串之间的相互转换
Dec 18 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
Sep 04 Javascript
javascript中sort() 方法使用详解
Aug 30 Javascript
jQuery表格插件datatables用法详解
Nov 23 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
Feb 08 Javascript
Vue.js对象转换实例
Jun 07 Javascript
Vue 重置组件到初始状态的方法示例
Oct 10 Javascript
JavaScript模板引擎应用场景及实现原理详解
Dec 14 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
Jul 20 Javascript
js属性对象的hasOwnProperty方法的使用
Feb 05 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
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
在centos7中分布式部署pyspider
2017/05/03 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
node中使用shell脚本的方法步骤
2021/03/23 Javascript
公司门卫的岗位职责
2014/02/19 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
自荐信的基本格式
2014/02/22 职场文书
综治宣传月活动总结
2014/04/28 职场文书
论文评语大全
2014/04/29 职场文书
安全施工标语
2014/06/07 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript
Python anaconda安装库命令详解
2021/10/16 Python