render.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * 2017.7.24
  3. * author:acdSeen
  4. * */
  5. (function(window,factory){
  6. if(typeof define === "function" && define.amd){
  7. //AMD
  8. define(factory);
  9. }else if(typeof module === "object" && module.exports){
  10. //CMD
  11. module.exports = factory();
  12. }else{
  13. //window
  14. window.WaterPolo = factory();
  15. }
  16. }(typeof window !== "undefined" ? window : this, function(selector,userOptions){
  17. //采用window作为参数传入,将功能函数挂载到window上
  18. var WaterPolo=function(selector,userOptions){
  19. 'user strict';
  20. userOptions=userOptions||{};
  21. var options={
  22. //容器距边缘的距离
  23. wrapW:3,
  24. //canvas属性
  25. cW:300,
  26. cH:300,
  27. lineWidth : 2,
  28. //液面位置 百分比表示
  29. baseY: 20,
  30. //页面起始位置
  31. nowRange: 0,
  32. //线条颜色
  33. lineColor:'rgb(176,204,53)',
  34. //上层颜色
  35. oneColor:'rgba(176,204,53,.6)',
  36. //下层颜色
  37. twoColor:'rgba(176,204,53,.4)',
  38. //上层波浪宽度,数越小越宽
  39. oneWaveWidth:0.06,
  40. //下层波浪宽度
  41. twoWaveWidth:0.06,
  42. //上层波浪高度,数越大越高
  43. oneWaveHeight:4,
  44. //下层波浪高度
  45. twoWaveHeight:4,
  46. //上层波浪x轴偏移量
  47. oneOffsetX:10,
  48. //下层波浪x轴偏移量
  49. twoOffsetX:20,
  50. //波浪滚动速度,数越大越快
  51. speed:0.2
  52. };
  53. var canvas = null,
  54. ctx = null,
  55. W = null,
  56. H = null;
  57. Object.defineProperty(this, 'options', {
  58. get: function() {
  59. return options;
  60. },
  61. set: function(value) {
  62. mergeOption(value,options);
  63. }
  64. });
  65. //参数混合相当于$.extend([old],[new])
  66. var mergeOption=function(userOptions,options){
  67. Object.keys(userOptions).forEach(function(key){
  68. options[key]=userOptions[key];
  69. })
  70. };
  71. //生成液面
  72. var makeLiquaid=function(ctx,xOffset,waveWidth,waveHeight,color){
  73. ctx.save();
  74. var points = [];//用于存放绘制Sin曲线的点
  75. ctx.beginPath();
  76. //在x轴上取点
  77. for (var x = 0; x < options.cW; x += 20 / options.cW) {
  78. //此处坐标(x,y)的取点,依靠公式 “振幅高*sin(x*振幅宽 + 振幅偏移量)”
  79. var y = -Math.sin(x * waveWidth + xOffset);
  80. //液面高度百分比改变
  81. var dY = options.cH * (1 - options.nowRange / 100);
  82. points.push([x, dY + y * waveHeight]);
  83. ctx.lineTo(x, dY + y * waveHeight);
  84. }
  85. //封闭路径
  86. ctx.lineTo(options.cW, options.cH);
  87. ctx.lineTo(0, options.cH);
  88. ctx.lineTo(points[0][0], points[0][1]);
  89. ctx.fillStyle = color;
  90. ctx.fill();
  91. ctx.restore();
  92. };
  93. //初始化设置
  94. var init=function(){
  95. mergeOption(userOptions,options);
  96. canvas=document.getElementById(selector);
  97. ctx=canvas.getContext('2d');
  98. canvas.width=options.cW;
  99. canvas.height=options.cH;
  100. ctx.lineWidth=options.lineWidth;
  101. //圆属性
  102. var r = options.cH / 2; //圆心
  103. var cR = r - 6; //圆半径 决定圆的大小
  104. var drawCircle = function(ctx){
  105. ctx.beginPath();
  106. ctx.strokeStyle = options.lineColor;
  107. ctx.arc(r, r, cR+options.wrapW, 0, 2 * Math.PI);
  108. ctx.stroke();
  109. ctx.beginPath();
  110. ctx.arc(r, r, cR, 0, 2 * Math.PI);
  111. ctx.clip();
  112. };
  113. drawCircle(ctx);//画圆
  114. (function drawFrame(){
  115. window.requestAnimationFrame(drawFrame);
  116. ctx.clearRect(0, 0, options.cW, options.cH);
  117. //高度改变动画参数
  118. if (options.nowRange <= options.baseY) {
  119. var tmp = 1;
  120. options.nowRange += tmp;
  121. }
  122. if (options.nowRange > options.baseY) {
  123. var tmp = 1;
  124. options.nowRange -= tmp;
  125. }
  126. makeLiquaid(ctx,options.oneOffsetX,options.oneWaveWidth,options.oneWaveHeight,options.oneColor);
  127. makeLiquaid(ctx,options.twoOffsetX,options.twoWaveWidth,options.twoWaveHeight,options.twoColor);
  128. options.oneOffsetX+=options.speed;
  129. options.twoOffsetX+=options.speed;
  130. }());
  131. };
  132. init();
  133. };
  134. return WaterPolo;
  135. }));