美文网首页前端攻城狮web前端学习让前端飞
程序员用javascript实力打造流星雨特效

程序员用javascript实力打造流星雨特效

作者: 烟雨丿丶蓝 | 来源:发表于2018-03-08 14:50 被阅读273次
    web前端学习群,189394454,有视频、源码、学习方法等大量干货分享
    关注公众号→‘学习web前端’开启你的web前端学习之路

    知识点:canvas高级绘图标签API运用,数组方法,js逻辑思维,代码性能优化等。
    👇css代码:

            <style>
                *{
                    margin:0;
                    padding:0;
                }
                #canvas{
                    background:#000;
                    display:block;
                }
            </style>
    

    👇javascript代码:

            <canvas id="canvas">您的浏览器不支持cnavas绘图,请您更换浏览器!!</canvas>
            <script>
                var can = document.getElementById("canvas");
                var ctx = can.getContext("2d");//设置绘图环境
                var w = can.width = window.innerWidth;//把窗口的宽度赋值给画布
                var h = can.height = window.innerHeight;//把窗口的高度赋值给画布
                var count = 30;//雨滴的个数
                var drops = [];//定义一个空数组来保存雨滴个数
                //浏览器窗口改变的时候重新获取宽度
                window.onresize = function(){
                    w = can.width = window.innerWidth;
                    h = can.height = window.innerHeight;
                }
                function Drop(){}//定义雨滴对象
                //添加原型对象方法
                Drop.prototype = {
                    init : function(){//初始化
                        this.x = random(0,w);
                        this.y = 0;
                        this.r = 1;//初始半径
                        this.vy = random(4,5);//竖直方向的加速度
                        this.vr = 1;//半径的加速度
                        this.a = 1;//初始透明度
                        this.va = 0.96;//透明度的变化系数
                        this.l = random(h*0.8,h*0.9);//雨滴下落的高度
                    },
                    draw : function(){
                        if (this.y > this.l)
                        {
                            ctx.beginPath();
                            ctx.arc(this.x,this.y,this.r,0,2*Math.PI,false);
                            ctx.strokeStyle = "rgba(0,255,255,"+this.a+")";
                            ctx.stroke();
                        }else{
                            ctx.fillStyle = color(this.a);
                            ctx.fillRect(this.x,this.y,2,10);
                        }
                        this.update();
                    },
                    //更新坐标
                    update : function(){
                        if (this.y < this.l)
                        {
                            this.y += this.vy;
                        }else{
                            if (this.a > 0.03)
                            {
                                this.r += this.vr;
                                if (this.r > 50)
                                {
                                    this.a *= this.va;
                                }
                            }else{
                                this.init();
                            }
                        }
                    }
                }
                //不断的更新雨滴位置
                function move(){
                    ctx.fillStyle = "rgba(0,0,0,.1)";
                    ctx.fillRect(0,0,w,h);  //这个在先绘制
                    for (var i=0;i<drops.length;i++ )
                    {
                        drops[i].draw();
                    }
                    //调用经动画
                    requestAnimationFrame(move);
                }
                //创建一个雨滴实例对象
                //var drop = new Drop();
                //drop.init();
                //drop.draw();
                //延迟产生每个雨滴
                function setup(){
                    for (var i=0;i < count ;i++ )
                    {
                        (function(j){
                            setTimeout(function(){
                                var drop = new Drop();
                                drop.init();
                                drops.push(drop);
                            },j*200);
                        }(i))
                    }
                }
                setup();
                move();
                //封装一个产生随机数的方法
                function random(min,max){
                    return Math.random()*(max-min) + min;
                }
                //封装一个随机颜色
                function color(a){
                    //rgba
                    var r = Math.floor(Math.random()*255);
                    var g = Math.floor(Math.random()*255);
                    var b = Math.floor(Math.random()*255);
                    return "rgba("+r+","+g+","+b+","+a+")"
                }
            </script>
    

    相关文章

      网友评论

      本文标题:程序员用javascript实力打造流星雨特效

      本文链接:https://www.haomeiwen.com/subject/vrryfftx.html