HTML5 Canvas 모바일 행운권 추첨 특수 효과

黄舟
풀어 주다: 2017-01-18 14:19:04
원래의
1692명이 탐색했습니다.

간략한 튜토리얼

jquery와 HTML5 Canvas를 기반으로 한 행운권 추첨 특수 효과입니다. 행운의 경품 특수 효과는 모바일 단말기를 지원하며 Canvas 요소를 동적으로 구성하여 대상 디스크를 생성하고 jquery 코드를 통해 경품을 무작위로 획득합니다.

사용법

HTML 구조

복권의 큰 바퀴는 이미지를 이용해 만들어지며, 처음에는 숨겨져 있습니다. 로또 당첨판 전체를 용기에 담으며, 용기의 크기를 조절하면 상판의 크기도 조절할 수 있습니다.

<div class="container">
  <img src="images/1.png" id="shan-img" style="display:none;" />
  <img src="images/2.png" id="sorry-img" style="display:none;" />
  <div class="banner">
    <div class="turnplate" style="background-image:url(images/turnplate-bg.png);background-size:100% 100%;">
      <canvas class="item" id="wheelcanvas" width="422px" height="422px"></canvas>
      <img class="pointer" src="images/turnplate-pointer.png"/>
    </div>
  </div>
</div>
로그인 후 복사

CSS 스타일

대상 디스크에 다음 CSS 스타일을 추가합니다.

.banner{display:block;width:95%;margin-left:auto;margin-right:auto;margin-bottom: 20px;}
.banner .turnplate{display:block;width:100%;position:relative;}
.banner .turnplate canvas.item{width:100%;}
.banner .turnplate img.pointer{position:absolute;width:31.5%;height:42.5%;left:34.6%;top:23%;}
로그인 후 복사

JavaScript

전체 대상 디스크의 jquery 구현 코드

var turnplate={
    restaraunts:[],       //大转盘奖品名称
    colors:[],          //大转盘奖品区块对应背景颜色
    outsideRadius:192,      //大转盘外圆的半径
    textRadius:155,       //大转盘奖品位置距离圆心的距离
    insideRadius:68,      //大转盘内圆的半径
    startAngle:0,       //开始角度
     
    bRotate:false       //false:停止;ture:旋转
};
 
$(document).ready(function(){
  //动态添加大转盘的奖品与奖品区域背景颜色
  turnplate.restaraunts = ["50M免费流量包", "10金币", "谢谢参与", "5金币", "10M免费流量包", "20M免费流量包", "20金币 ", "30M免费流量包", "100M免费流量包", "2金币"];
  turnplate.colors = ["#FFF4D6", "#FFFFFF", "#FFF4D6", "#FFFFFF","#FFF4D6", "#FFFFFF", "#FFF4D6", "#FFFFFF","#FFF4D6", "#FFFFFF"];
 
   
  var rotateTimeOut = function (){
    $(&#39;#wheelcanvas&#39;).rotate({
      angle:0,
      animateTo:2160,
      duration:8000,
      callback:function (){
        alert(&#39;网络超时,请检查您的网络设置!&#39;);
      }
    });
  };
 
  //旋转转盘 item:奖品位置; txt:提示语;
  var rotateFn = function (item, txt){
    var angles = item * (360 / turnplate.restaraunts.length) - (360 / (turnplate.restaraunts.length*2));
    if(angles<270){
      angles = 270 - angles; 
    }else{
      angles = 360 - angles + 270;
    }
    $(&#39;#wheelcanvas&#39;).stopRotate();
    $(&#39;#wheelcanvas&#39;).rotate({
      angle:0,
      animateTo:angles+1800,
      duration:8000,
      callback:function (){
        alert(txt);
        turnplate.bRotate = !turnplate.bRotate;
      }
    });
  };
 
  $(&#39;.pointer&#39;).click(function (){
    if(turnplate.bRotate)return;
    turnplate.bRotate = !turnplate.bRotate;
    //获取随机数(奖品个数范围内)
    var item = rnd(1,turnplate.restaraunts.length);
    //奖品数量等于10,指针落在对应奖品区域的中心角度[252, 216, 180, 144, 108, 72, 36, 360, 324, 288]
    rotateFn(item, turnplate.restaraunts[item-1]);
  });
});
 
function rnd(n, m){
  var random = Math.floor(Math.random()*(m-n+1)+n);
  return random;
   
}
 
 
//页面所有元素加载完毕后执行drawRouletteWheel()方法对转盘进行渲染
window.onload=function(){
  drawRouletteWheel();
};
 
function drawRouletteWheel() {    
  var canvas = document.getElementById("wheelcanvas");    
  if (canvas.getContext) {
    //根据奖品个数计算圆周角度
    var arc = Math.PI / (turnplate.restaraunts.length/2);
    var ctx = canvas.getContext("2d");
    //在给定矩形内清空一个矩形
    ctx.clearRect(0,0,422,422);
    //strokeStyle 属性设置或返回用于笔触的颜色、渐变或模式  
    ctx.strokeStyle = "#FFBE04";
    //font 属性设置或返回画布上文本内容的当前字体属性
    ctx.font = &#39;16px Microsoft YaHei&#39;;      
    for(var i = 0; i < turnplate.restaraunts.length; i++) {       
      var angle = turnplate.startAngle + i * arc;
      ctx.fillStyle = turnplate.colors[i];
      ctx.beginPath();
      //arc(x,y,r,起始角,结束角,绘制方向) 方法创建弧/曲线(用于创建圆或部分圆)    
      ctx.arc(211, 211, turnplate.outsideRadius, angle, angle + arc, false);    
      ctx.arc(211, 211, turnplate.insideRadius, angle + arc, angle, true);
      ctx.stroke();  
      ctx.fill();
      //锁画布(为了保存之前的画布状态)
      ctx.save();   
       
      //----绘制奖品开始----
      ctx.fillStyle = "#E5302F";
      var text = turnplate.restaraunts[i];
      var line_height = 17;
      //translate方法重新映射画布上的 (0,0) 位置
      ctx.translate(211 + Math.cos(angle + arc / 2) * turnplate.textRadius, 211 + Math.sin(angle + arc / 2) * turnplate.textRadius);
       
      //rotate方法旋转当前的绘图
      ctx.rotate(angle + arc / 2 + Math.PI / 2);
       
      /** 下面代码根据奖品类型、奖品名称长度渲染不同效果,如字体、颜色、图片效果。(具体根据实际情况改变) **/
      if(text.indexOf("M")>0){//流量包
        var texts = text.split("M");
        for(var j = 0; j<texts.length; j++){
          ctx.font = j == 0?&#39;bold 20px Microsoft YaHei&#39;:&#39;16px Microsoft YaHei&#39;;
          if(j == 0){
            ctx.fillText(texts[j]+"M", -ctx.measureText(texts[j]+"M").width / 2, j * line_height);
          }else{
            ctx.fillText(texts[j], -ctx.measureText(texts[j]).width / 2, j * line_height);
          }
        }
      }else if(text.indexOf("M") == -1 && text.length>6){//奖品名称长度超过一定范围 
        text = text.substring(0,6)+"||"+text.substring(6);
        var texts = text.split("||");
        for(var j = 0; j<texts.length; j++){
          ctx.fillText(texts[j], -ctx.measureText(texts[j]).width / 2, j * line_height);
        }
      }else{
        //在画布上绘制填色的文本。文本的默认颜色是黑色
        //measureText()方法返回包含一个对象,该对象包含以像素计的指定字体宽度
        ctx.fillText(text, -ctx.measureText(text).width / 2, 0);
      }
       
      //添加对应图标
      if(text.indexOf("金币")>0){
        var img= document.getElementById("shan-img");
        img.onload=function(){  
          ctx.drawImage(img,-15,10);      
        }; 
        ctx.drawImage(img,-15,10);  
      }else if(text.indexOf("谢谢参与")>=0){
        var img= document.getElementById("sorry-img");
        img.onload=function(){  
          ctx.drawImage(img,-15,10);      
        };  
        ctx.drawImage(img,-15,10);  
      }
      //把当前画布返回(调整)到上一个save()状态之前 
      ctx.restore();
      //----绘制奖品结束----
    }     
  } 
}
로그인 후 복사

위 내용은 HTML5 Canvas 휴대폰의 행운의 대박 특수 효과 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿