• 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

  • 相关阅读:
    java反射
    2018 Multi-University Training Contest 4 Problem B. Harvest of Apples 【莫队+排列组合+逆元预处理技巧】
    逆元小结
    2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】
    Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array 【dp】
    Codeforces Round #533 (Div. 2) B. Zuhair and Strings 【模拟】
    2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】
    ZOJ Monthly, January 2019 Little Sub and his Geometry Problem 【推导 + 双指针】
    ZOJ Monthly, January 2019 Little Sub and Isomorphism Sequences 【离线离散化 + set + multiset】
    EOJ Monthly 2019.1 唐纳德先生与这真的是签到题吗 【数学+暴力+multiset】
  • 原文地址:https://www.cnblogs.com/zhengweijie/p/7754894.html
Copyright © 2020-2023  润新知