HTML5 Canvas圆盘抽奖应用(适用于Vue项目)

<!DOCTYPE html>
<html lang="zh-cn">

<head>
  <meta charset="UTF-8">
  <title>HTML5 Canvas圆盘抽奖应用DEMO演示</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  <style>
    * {
      padding: 0px;
      margin: 0px;
      font-size: 16px;
      font-family: "Microsoft YaHei";
    }

    .xttblog_box {
      width: 300px;
      height: 300px;
      margin: 100px auto;
      position: relative;
    }

    .xttblog_box canvas {
      position: absolute;
    }

    #xttblog {
      background-color: white;
      border-radius: 100%;
    }

    #xttblog01,
    #xttblog03 {
      left: 50px;
      top: 50px;
      z-index: 30;
    }

    #xttblog02 {
      left: 75px;
      top: 75px;
      z-index: 20;
    }

    #xttblog {
      -o-transform: transform 6s;
      -ms-transform: transform 6s;
      -moz-transform: transform 6s;
      -webkit-transform: transform 6s;
      transition: transform 6s;
      -o-transform-origin: 50% 50%;
      -ms-transform-origin: 50% 50%;
      -moz-transform-origin: 50% 50%;
      -webkit-transform-origin: 50% 50%;
      transform-origin: 50% 50%;
    }

    .taoge_btn {
      width: 60px;
      height: 60px;
      left: 120px;
      top: 120px;
      border-radius: 100%;
      position: absolute;
      cursor: pointer;
      border: none;
      background: transparent;
      outline: none;
      z-index: 40;
    }
  </style>
  <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
  <script>
    $(document).ready(function () {
      //旋转角度
      var angles;
      //旋转次数
      var rotNum = 0;
      //中奖公告
      var notice = null;
      //转盘初始化各样式颜色
      var color = ["#ffefbf", "#ffbb04", "#e72c2c", "#DCC722", "#f4a005", "#cb1418"];
      // 后台获取奖品替换数据
      var info = ["1", "2", " 3", " 4", " 5", " 6"];
      canvasRun();
      $('#tupBtn').bind('click', function () {
        //转盘旋转
        runCup();
        //转盘旋转过程“开始抽奖”按钮无法点击
        $('#tupBtn').attr("disabled", true);
        //“开始抽奖”按钮无法点击恢复点击
        setTimeout(function () {
          alert('中奖拉')
          $('#tupBtn').removeAttr("disabled", true);
        }, 6000);
      });

      //转盘旋转 
      function runCup() {
        var num = null
        //获取随机数0-5 取回获奖数据下标代替 此处获取获奖数据使用异步方法
        var num = parseInt(Math.random() * (5 - 0 + 0) + 0);
        // 记录旋转的次数,依次叠加旋转度数,防止往回倒转  transform属性的值必须依次增加,否则会发生倒转
        rotNum = rotNum + 1

        if(num !== null) {
          //  旋转角度 = 旋转6圈(2160度)* 已经旋转的次数 + 最少旋转的圈数(5圈)+ 每个奖品下标对应的角度
          angles = 2160 * rotNum + 1800 + 360 / info.length * (info.length - num);
        } else {
          angles = 2160 * rotNum + 1800 
        }
        var degValue = 'rotate(' + angles + 'deg' + ')';
        $('#xttblog').css('transform', degValue);
        // 如果没有获取到获奖数据继续转动
        if(num === null) {
          runCup();
        }
      }

      //绘制转盘
      function canvasRun() {
        var canvas = document.getElementById('xttblog');
        var canvas01 = document.getElementById('xttblog01');
        var canvas03 = document.getElementById('xttblog03');
        var canvas02 = document.getElementById('xttblog02');
        var ctx = canvas.getContext('2d');
        var ctx1 = canvas01.getContext('2d');
        var ctx3 = canvas03.getContext('2d');
        var ctx2 = canvas02.getContext('2d');
        createCircle();
        createCirText(); // 绘制文字
        initPoint(); // 绘制指针

        //外圆
        function createCircle() {
          var startAngle = 0; //扇形的开始弧度
          var endAngle = 0; //扇形的终止弧度
          //画一个等份扇形组成的圆形
          for (var i = 0; i < info.length; i++) {
            startAngle = Math.PI * (i / (info.length / 2) - 2 / info.length);
            endAngle = startAngle + Math.PI * (1 / (info.length / 2));

            ctx.save(); // 保存备份
            ctx.beginPath(); // 绘制两条线
            ctx.arc(150, 150, 100, startAngle, endAngle, false); // 绘制圆
            ctx.lineWidth = 120;
            if (i % 2 == 0) { // 绘制颜色
              ctx.strokeStyle = color[1];
            } else {
              ctx.strokeStyle = color[0];
            }
            ctx.stroke();
            ctx.restore();
          }
        }

        //各奖项
        function createCirText() {
          ctx.textAlign = 'start';
          ctx.textBaseline = 'middle';
          ctx.fillStyle = color[3];
          var step = 2 * Math.PI / info.length;
          for (var i = 0; i < 6; i++) {
            ctx.save();
            ctx.beginPath();
            ctx.translate(150, 150);
            ctx.rotate(i * step);
            ctx.font = " 20px Microsoft YaHei";
            ctx.fillStyle = color[3];
            ctx.fillText(info[i], -30, -100, 60); // 书写转盘文字
            ctx.font = " 14px Microsoft YaHei";
            ctx.closePath();
            ctx.restore();
          }
        }


        //箭头指针
        function initPoint() {
          //箭头指针
          ctx1.beginPath();
          ctx1.moveTo(100, 24);
          ctx1.lineTo(90, 62);
          ctx1.lineTo(110, 62);
          ctx1.lineTo(100, 24);
          ctx1.fillStyle = color[5]; // 指针颜色
          ctx1.fill();
          ctx1.closePath();
          //中间圆圈
          ctx2.beginPath();
          ctx2.arc(75, 75, 50, 0, Math.PI * 2, false); // 创建一个圆
          ctx2.fillStyle = color[2]; // 颜色
          ctx2.fill();
          ctx2.closePath();
          //中间小圆
          ctx3.beginPath();
          ctx3.arc(100, 100, 40, 0, Math.PI * 2, false);
          ctx3.fillStyle = color[5];
          ctx3.fill();
          ctx3.closePath();
          //小圆文字
          ctx3.font = "Bold 20px Microsoft YaHei";
          ctx3.textAlign = 'start';
          ctx3.textBaseline = 'middle';
          ctx3.fillStyle = color[4]; //抽奖文字颜色
          ctx3.beginPath();
          ctx3.fillText('开始', 80, 90, 40);
          ctx3.fillText('抽奖', 80, 110, 40);
          ctx3.fill();
          ctx3.closePath();
        }
      }
    });
  </script>
</head>

<body>
  <div class="xttblog_box">
    <canvas id="xttblog" width="300px" height="300px">抱歉!浏览器不支持。</canvas>
    <canvas id="xttblog01" width="200px" height="200px">抱歉!浏览器不支持。</canvas>
    <canvas id="xttblog03" width="200px" height="200px">抱歉!浏览器不支持。</canvas>
    <canvas id="xttblog02" width="150px" height="150px">抱歉!浏览器不支持。</canvas>
    <button id="tupBtn" class="taoge_btn"></button>
  </div>
</body>

</html>

 参考其他demo : http://www.html5tricks.com/html5-canvas-choujiang.html

原文地址:https://www.cnblogs.com/zhengweijie/p/7754894.html