美文网首页让前端飞
Canvas水波效果

Canvas水波效果

作者: 聪明的汤姆 | 来源:发表于2018-07-23 11:29 被阅读5次
    效果图
    water.gif
    完整代码
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Javascript水波图</title>
      <style>
        html,
        body {
          width: 100%;
          height: 100%;
          padding: 0;
          margin: 0;
          overflow: hidden;
        }
      </style>
    </head>
    
    <body>
    
      <canvas id="water"></canvas>
    
      <script>
        // 兼容的requestAnimationFrame函数
        let requestAnimationFrame = (function () {
          return window.requestAnimationFrame || webkitRequestAnimationFrame || mozRequestAnimationFrame || function (
            callback) {
            window.setTimeout(callback, 1000 / 60);
          }
        })();
    
        // 封装设置canvas大小的函数
        let setCanvasSize = function () {
          canvas.width = canvas.parentNode.offsetWidth;
          canvas.height = canvas.parentNode.offsetHeight;
        }
    
        // 获取canvas相关
        let canvas = document.querySelector('#water');
        let ctx = canvas.getContext('2d');
        setCanvasSize();
    
        // 一些变量
        let boHeight = canvas.height / 30; // 顶峰高度
        let posHeight = canvas.height / 1.1; // 最低高度
        let step = 0; // 初始角度
        let colors = ['rgba(0, 150, 138, 0.6)', 'rgba(0, 150, 138, 0.3)', 'rgba(0, 150, 138, 0.1)'];
    
        // 绘制函数
        let paint = function () {
          ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布
          step += 1; // 角度
    
          // 遍历colors数组,进行绘制
          colors.forEach((item, index) => {
            ctx.fillStyle = item; // 画笔的颜色
            let angle = (step + index * 50) * Math.PI / 180; // 相差的角度
            let deltaHeight = Math.sin(angle) * boHeight; // 线条左边的起点
            let deltaHeightRight = Math.cos(angle) * boHeight; //线条右边的终点
            ctx.beginPath();
            ctx.moveTo(0, posHeight + deltaHeight);
            ctx.bezierCurveTo(canvas.width / 2, posHeight + deltaHeight - boHeight, canvas.width / 2, posHeight +
              deltaHeightRight - boHeight, canvas.width, posHeight + deltaHeightRight); // 绘制贝塞尔曲线
            ctx.lineTo(canvas.width, canvas.height); // 防止右侧出现空隙
            ctx.lineTo(0, canvas.height); // 防止左侧出现空隙
            ctx.closePath();
            ctx.fill();
          })
    
          requestAnimationFrame(paint); // 自调
        }
    
        // 调用绘制函数
        paint();
    
        // 响应式
        window.onresize = setCanvasSize;
      </script>
    
    </body>
    
    </html>
    
    如果您喜欢这篇文章,那么记得动动你们的👋,给个like或者关注我哦👍。

    相关文章

      网友评论

        本文标题:Canvas水波效果

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