123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- /*
- * 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;
- }));
|