首页前端开发其他前端知识水球动态效果,要怎么用JS canvas实现

水球动态效果,要怎么用JS canvas实现

时间2024-03-27 15:28:03发布访客分类其他前端知识浏览370
导读:关于“水球动态效果,要怎么用JS canvas实现”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“水球动态效果,要怎...
关于“水球动态效果,要怎么用JS canvas实现”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“水球动态效果,要怎么用JS canvas实现”吧。

    

本文实例为大家分享了canvas实现水球加载动画的具体代码,供大家参考,具体内容如下

效果展示:

源码展示:

!doctype html>
    
html>
    
head>
    
  meta charset="utf-8">
    
  title>
    canvas实现水球加载动画/title>
    
  style>

    body {
    
      display:flex;
    
      flex-flow:column wrap;
    
      justify-content:center;
    
      align-items:center;

    }

    #c {
    
      margin-top:20px;

    }

    input[type=range]::before {
    
      content:attr(min);
    
      color:#000;
    
      padding-right:5px;

    }

    input[type=range]::after {
    
      content:attr(max);
    
      color:#000;
    
      padding-left:5px;

    }
    
  /style>
    
/head>
    
body>
    
canvas id="c">
    当前浏览器不支持canvas 请升级!/canvas>
    
input type="range" name="range" min="0" max="100" step="1">
    

script>
    
  canvas = document.getelementbyid("c");
    
  ctx = canvas.getcontext("2d");
    
  orange = document.getelementsbyname("range")[0];
    

  m = math;
    
  sin = m.sin;
    
  cos = m.cos;
    
  sqrt = m.sqrt;
    
  pow = m.pow;
    
  pi = m.pi;
    
  round = m.round;
    

  ow = canvas.width = 300;
    
  oh = canvas.height = 300;
    

  // 线宽
  linewidth = 2

  // 大半径
  r = (ow / 2);
    
  cr = r - 8 * linewidth;
    

  ctx.beginpath();
    

  ctx.linewidth = linewidth;
    

  // 水波动画初始参数
  axislength = 2 * r - 16 * linewidth;
     // sin 图形长度
  unit = axislength / 8;
     // 波浪宽
  range = .2 // 浪幅
  nowrange = range;
    
  xoffset = 8 * linewidth;
     // x 轴偏移量
  data = ~~(orange.value) / 100;
     // 数据量
  sp = 0;
     // 周期偏移量
  nowdata = 0;
    
  waveupsp = 0.002;
     // 水波上涨速度

  // 圆动画初始参数
  arcstack = [];
     // 圆栈
  br = r - 8 * linewidth;
    
  soffset = -(pi / 2);
     // 圆动画起始位置
  circlelock = true;
     // 起始动画锁

  // 获取圆动画轨迹点集
  for (var i = soffset;
     i  soffset + 2 * pi;
 i += 1 / (8 * pi)) {

    arcstack.push([
      r + br * cos(i),
      r + br * sin(i)
    ])
  }
    

  cstartpoint = arcstack.shift();
     // 圆起始点

  ctx.strokestyle = "#1c86d1";
    
  ctx.moveto(cstartpoint[0], cstartpoint[1])

  render();
 // 开始渲染

  function drawsine() {
    
    ctx.beginpath();
    
    ctx.save();
    
    var stack = [];
     // 记录起始点和终点坐标
    for (var i = xoffset;
     i = xoffset + axislength;
 i += 20 / axislength) {
    
      var x = sp + (xoffset + i) / unit;
    
      var y = sin(x) * nowrange;
    

      var dx = i;
    

      var dy = 2 * cr * (1 - nowdata) + (r - cr) - (unit * y);
    

      ctx.lineto(dx, dy);

      stack.push([dx, dy])
    }
    

    // 获取初始点和结束点
    var startp = stack[0]
    var endp = stack[stack.length - 1]

    ctx.lineto(xoffset + axislength, ow);
    
    ctx.lineto(xoffset, ow);
    
    ctx.lineto(startp[0], startp[1])
    ctx.fillstyle = "#1c86d1";
    
    ctx.fill()
    ctx.restore();

  }


  function drawtext() {
    
    ctx.globalcompositeoperation = 'source-over';
    

    var size = 0.4 * cr;
    
    ctx.font = 'bold ' + size + 'px microsoft yahei';
    

    txt = (nowdata.tofixed(2) * 100).tofixed(0) + '%';
    

    var fonty = r + size / 2;
    
    var fontx = r - size * 0.8;
    
    ctx.fillstyle = "rgba(06, 85, 128, 0.8)";

    ctx.filltext(txt, fontx, fonty)
  }


  function render() {
    
    ctx.clearrect(0, 0, ow, oh);


    if (circlelock) {

      if (arcstack.length) {
    
        var temp = arcstack.shift();
    
        ctx.lineto(temp[0], temp[1])
        ctx.stroke();

      }
 else {
    
        circlelock = false;
    
        ctx.lineto(cstartpoint[0], cstartpoint[1])
        ctx.stroke();
    
        arcstack = null;
    

        ctx.globalcompositeoperation = 'destination-over';
    
        ctx.beginpath();
    
        ctx.linewidth = linewidth;
    
        ctx.arc(r, r, br, 0, 2 * pi, 1);
    

        ctx.beginpath();
    
        ctx.save();
    
        ctx.arc(r, r, r - 16 * linewidth, 0, 2 * pi, 1);
    
        ctx.restore()
        ctx.clip();
    

        ctx.fillstyle = "#1c86d1";


        // 初始拖拽控件
        orange.addeventlistener("change", function() {
    
          data = ~~(orange.value) / 100;

          console.log("data=" + data)
        }
    , 0);

      }

    }
 else {
    
      // 开始水波动画
      // 控制波幅
      if (data >
= 0.85) {
    
        if (nowrange >
 range / 4) {
    
          var t = range * 0.01;
    
          nowrange -= t;

        }

      }
 else if (data = 0.1) {

        if (nowrange  range * 1.5) {
    
          var t = range * 0.01;
    
          nowrange += t;

        }

      }
 else {

        if (nowrange = range) {
    
          var t = range * 0.01;
    
          nowrange += t;

        }
    

        if (nowrange >
= range) {
    
          var t = range * 0.01;
    
          nowrange -= t;

        }

      }
    

      if ((data - nowdata) >
 0) {
    
        nowdata += waveupsp;

      }


      if ((data - nowdata)  0) {

        nowdata -= waveupsp
      }
    

      sp += 0.07;
    
      drawsine();
    
      drawtext();

    }

    requestanimationframe(render)
  }
    
/script>
    
hr>
    

pre style="color:red">
    
感: 最近贡献一下我在教学中的小案例 希望能给你一些帮助 ,希望大家继续关注我的博客

                                       --王
/pre>
    

/body>
    
/html>
    



以上就是关于水球动态效果,要怎么用JS canvas实现的介绍,本文内容仅供参考,有需要的朋友可以借鉴了解看看,希望对大家学习或工作,想要了解更多欢迎关注网络,小编每天都会为大家更新不同的知识。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

jscanvas加载

若转载请注明出处: 水球动态效果,要怎么用JS canvas实现
本文地址: https://pptw.com/jishu/654309.html
 javascript数组中的slice方法和join​​方法 怎么用JS和HTML来还原童年经典游戏吃豆人

游客 回复需填写必要信息