码迷,mamicode.com
首页 > 其他好文 > 详细

canvas入门级基本用法实现雨滴下落特效

时间:2019-08-21 16:21:38      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:位置   time   距离   fun   charset   this   方法   nts   基础知识   

canvas基础知识点参考各种文档,直接上代码,有非常详细注释

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>canvas雨滴特效</title>
        <style>
            body{
                margin: 0;
                overflow: hidden;
            }
            #rain{
                display: block;
                background-color: #000;
            }
        </style>
    </head>
    <body>
        <canvas id="rain"></canvas>

        <script>
            //获取canvas元素
            const canvas = document.querySelector(#rain);
            //设置canvas元素宽高的函数
            var wX,wY;
            ~~function setSize(){
                //监控窗口发生变化时自动调用setSize函数
                window.onresize = arguments.callee;
                //获取浏览器窗口宽高
                wX = window.innerWidth;
                wY = window.innerHeight;
                //给canvas设置宽高
                canvas.width = wX;
                canvas.height = wY;
            }();
            //获取绘制区域(相当于画笔,可在canvas中任意位置绘制图形)
            var ctx = canvas.getContext(2d);

            //随机产生两个数之间随机数
            function random(min,max){
                return Math.random()*(max-min) + min;
            }
            //生成雨滴的构造函数
            function Rain(){};
            //添加原型方法
            Rain.prototype = {
                init : function(){
                    this.x = random(0,wX);//雨滴横坐标
                    this.y = 0;//雨滴纵坐标默认从最上方下落
                    this.v = random(3,4);//雨滴每秒下落的速度
                    this.h = random(0.9*wY,wY);//下落到窗口高度的90%~100%
                    this.r = 1;//雨滴绽放的初始半径
                    this.vr = 0.4;//半径扩大的速度
                },
                draw : function(){
                    if(this.y<this.h){//判断是否在90%~100%之间
                        ctx.beginPath();                    //抬笔作画
                        ctx.fillStyle = #666;             //内容实心用颜色填充
                        ctx.fillRect(this.x,this.y,4,8);    //画矩形小雨滴
                    }else{//不在区间则以下落到地绽放成圆
                        ctx.beginPath();
                        ctx.strokeStyle = #666;
                        ctx.arc(this.x,this.y,this.r,0,Math.PI*2);
                        ctx.stroke();
                    }
                },
                move : function(){
                    if(this.y<this.h){//下落
                        this.y+=this.v;//每秒下落3~4滴的距离
                    }else{//绽放成圆
                        if(this.r<35){
                            this.r+=this.vr;
                        }else{
                            this.init();
                        }
                    }
                    this.draw();//移动的雨滴画出来
                }
            }

            //生成的雨滴要添加动画为方便找到存在数组中
            var aRain = [];
            //创造雨滴函数
            function createRain(num){
                for(var i=0;i<num;i++){
                    setTimeout(function(){//每隔200毫秒生成一个
                        var rain = new Rain();
                        rain.init();
                        rain.draw();
                        aRain.push(rain);
                    },200*i)
                }
            }
            createRain(50);

            //用定时器画帧形成动画
            setInterval(function(){
                // ctx.clearRect(0,0,wX,wY);//擦除上一个图形(下雪的感觉)
                // 这里不是擦除雨滴效果是加蒙版达到渐变效果
                ctx.fillStyle = rgba(0,0,0,0.05);
                ctx.fillRect(0,0,wX,wY);
                for(var item of aRain){
                    item.move();
                }
            },1000/144);//根据自己屏幕刷新频率设置(此处是144HZ)
            
        </script>
    </body>
</html>

 

内容本人原创,有不足之处请见谅!欢迎指正!转载请注明出处附上链接,谢谢!

canvas入门级基本用法实现雨滴下落特效

标签:位置   time   距离   fun   charset   this   方法   nts   基础知识   

原文地址:https://www.cnblogs.com/J1019/p/11389398.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!