手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效


Posted in Javascript onDecember 06, 2016

HTML5 Canvas的幸运大奖盘特效

            现在好的微信微商或者微信公众号都有这种大转盘的项目,这里就整理一个,可以参考下。

这是一款基于jquery和HTML5 Canvas的幸运大奖盘特效。该幸运大奖品特效支持移动端,它通过动态构造Canvas元素来生成大奖盘,并通过jquery代码来随机获取奖品。

  使用方法

HTML结构

抽奖用的大转盘使用图片来制作,开始时它们被隐藏。整个抽奖大奖盘放置在一个容器中,控制容器的大小即可以控制奖盘的大小。

XML/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样式:

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实现代码如下:

JavaScript代码

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 (){ 
  $('#wheelcanvas').rotate({ 
   angle:0, 
   animateTo:2160, 
   duration:8000, 
   callback:function (){ 
    alert('网络超时,请检查您的网络设置!'); 
   } 
  }); 
 }; 
  
 //旋转转盘 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; 
  } 
  $('#wheelcanvas').stopRotate(); 
  $('#wheelcanvas').rotate({ 
   angle:0, 
   animateTo:angles+1800, 
   duration:8000, 
   callback:function (){ 
    alert(txt); 
    turnplate.bRotate = !turnplate.bRotate; 
   } 
  }); 
 }; 
  
 $('.pointer').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 = '16px Microsoft YaHei';    
  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?'bold 20px Microsoft YaHei':'16px Microsoft YaHei'; 
     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(); 
   //----绘制奖品结束---- 
  }    
 }  
}

实现效果图:

手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JavaScript prototype属性使用说明
May 13 Javascript
jquery 圆形旋转图片滚动切换效果
Jan 19 Javascript
JavaScript创建对象的写法
Aug 29 Javascript
javascript操作excel生成报表示例
May 08 Javascript
20条学习javascript的编程规范的建议
Nov 28 Javascript
javascript 兼容各个浏览器的事件
Feb 04 Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 Javascript
js判断输入框不能为空格或null值的实现方法
Mar 02 Javascript
Vue CLI3 开启gzip压缩文件的方式
Sep 30 Javascript
JS实现的小火箭发射动画效果示例
Dec 08 Javascript
js刷新页面location.reload()用法详解
Dec 09 Javascript
小程序自定义模板实现吸顶功能
Jan 08 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
Dec 06 #Javascript
jQuery EasyUI 获取tabs的实例解析
Dec 06 #Javascript
如何防止INPUT按回车自动提交表单FORM
Dec 06 #Javascript
详解ECharts使用心得总结
Dec 06 #Javascript
jQuery实现删除li节点的方法
Dec 06 #Javascript
详解springmvc 接收json对象的两种方式
Dec 06 #Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
Dec 06 #Javascript
You might like
How do I change MySQL timezone?
2008/03/26 PHP
深入解析php之apc
2013/05/15 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
关于php中一些字符串总结
2016/05/05 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
document.getElementById介绍
2011/09/13 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
基于jQuery实现可编辑的表格
2019/12/11 jQuery
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
python对象及面向对象技术详解
2016/07/19 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
Python pymsql模块的使用
2020/09/07 Python
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
印刷技术专业自荐信
2014/09/18 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
军事博物馆观后感
2015/06/05 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang