Zzhangxiaohuiupdate
82eac837创建于 2021年4月14日历史提交
/*
 * 2017.7.24
 * author:acdSeen
 * */
(function(window,factory){

    if(typeof define === "function" && define.amd){
        //AMD
        define(factory);
    }else if(typeof module === "object" && module.exports){
        //CMD
        module.exports = factory();
    }else{
        //window
        window.WaterPolo = factory();
    }

}(typeof window !== "undefined" ? window : this, function(selector,userOptions){
//采用window作为参数传入,将功能函数挂载到window上

    var WaterPolo=function(selector,userOptions){

        'user strict';
        
        userOptions=userOptions||{};

        var options={
            //容器距边缘的距离
            wrapW:3,

            //canvas属性
            cW:300,
            cH:300,
            lineWidth : 2,

            //液面位置 百分比表示
            baseY: 20,

            //页面起始位置
            nowRange: 0,

            //线条颜色
            lineColor:'rgb(176,204,53)',
            //上层颜色
            oneColor:'rgba(176,204,53,.6)',

            //下层颜色
            twoColor:'rgba(176,204,53,.4)',

            //上层波浪宽度,数越小越宽
            oneWaveWidth:0.06,

            //下层波浪宽度
            twoWaveWidth:0.06,

            //上层波浪高度,数越大越高
            oneWaveHeight:4,

            //下层波浪高度
            twoWaveHeight:4,

            //上层波浪x轴偏移量
            oneOffsetX:10,

            //下层波浪x轴偏移量
            twoOffsetX:20,

            //波浪滚动速度,数越大越快
            speed:0.2
        };

        
        var canvas = null,
            ctx = null,
            W = null,
            H = null;


        Object.defineProperty(this, 'options', {  
                get: function() {  
                    return options;  
                },  
                set: function(value) { 
                    
                    mergeOption(value,options);
                }  
            }); 
         

        //参数混合相当于$.extend([old],[new])
        var mergeOption=function(userOptions,options){
            Object.keys(userOptions).forEach(function(key){
                options[key]=userOptions[key];
            })
        };

        //生成液面
        var makeLiquaid=function(ctx,xOffset,waveWidth,waveHeight,color){
            ctx.save();
            var points = [];//用于存放绘制Sin曲线的点
            ctx.beginPath();
            //在x轴上取点
            for (var x = 0; x < options.cW; x += 20 / options.cW) {
                //此处坐标(x,y)的取点,依靠公式 “振幅高*sin(x*振幅宽 + 振幅偏移量)”
                var y = -Math.sin(x * waveWidth + xOffset);

                //液面高度百分比改变
                var dY = options.cH * (1 - options.nowRange / 100);

                points.push([x, dY + y * waveHeight]);
                ctx.lineTo(x, dY + y * waveHeight);
            }
            //封闭路径
            ctx.lineTo(options.cW, options.cH);
            ctx.lineTo(0, options.cH);
            ctx.lineTo(points[0][0], points[0][1]);
            ctx.fillStyle = color;
            ctx.fill();
            ctx.restore();
        };

        //初始化设置

        var init=function(){
            
            mergeOption(userOptions,options);

            canvas=document.getElementById(selector);
            ctx=canvas.getContext('2d');

            canvas.width=options.cW;
            canvas.height=options.cH;

            ctx.lineWidth=options.lineWidth;

            //圆属性
            var r = options.cH / 2; //圆心
            var cR = r - 6; //圆半径 决定圆的大小
            
            var drawCircle = function(ctx){
                ctx.beginPath();
                ctx.strokeStyle = options.lineColor;
                ctx.arc(r, r, cR+options.wrapW, 0, 2 * Math.PI);
                ctx.stroke();
                ctx.beginPath();
                ctx.arc(r, r, cR, 0, 2 * Math.PI);
                ctx.clip();

            };
            drawCircle(ctx);//画圆

            (function drawFrame(){

                window.requestAnimationFrame(drawFrame);

                ctx.clearRect(0, 0, options.cW, options.cH);
                
                //高度改变动画参数

                if (options.nowRange <= options.baseY) {
                    var tmp = 1;
                    options.nowRange += tmp;
                }

                if (options.nowRange > options.baseY) {
                    var tmp = 1;
                    options.nowRange -= tmp;
                }
                makeLiquaid(ctx,options.oneOffsetX,options.oneWaveWidth,options.oneWaveHeight,options.oneColor);
                makeLiquaid(ctx,options.twoOffsetX,options.twoWaveWidth,options.twoWaveHeight,options.twoColor);

                options.oneOffsetX+=options.speed;
                options.twoOffsetX+=options.speed;

            }());

            
        };
        init();
        
    };
    return WaterPolo;
}));