js+php+大转盘,H5 Canvas抽奖大转盘代码实现及总结
最近项目上写了一个签到页面,放在h5、ios和安卓中一起用 ,其中有一个功能是抽奖大转盘,这是一个很常用的功能,现在总结记录一下:
效果gif
需求
1、每种奖品的中奖概率由后台确定,非随机。
2、页面上大转盘中的奖品图品和名称有后台提供,灵活非静态。
技术栈
1、HTML5 Canvas
2、引用Jquery插件jQueryRotate.js
踩坑和注意
1、绘制后的画布文字模糊,画布设置尺寸后,css将其设置为一半大小,如此就相当于画了一张200*400的图片,然后设置他显示成100*200的大小,这样一来就变得清晰了。需要注意的是,这样将画布放大之后,绘制的过程中对应的那些坐标,长度等等都要相应的放大
2、canvas加载奖品图片,全都堆叠在左上角,原因是绘制画布时图片还没加载出来,需要使用onload解决
//注意需要等图片加载完成后绘制
window.onload = function() {
drawWheelCanvas();
};
3、ios的Webview ajax不兼容,因为当时是本地作为服务器测试的,部署在服务器上就行了。参考
4、save()与restore()区别
save表示保存save函数之前的状态;restore表示获取save保存的状态
5、canvas是从水平位置开始绘制的
6、实现转盘四周闪烁效果,其实就是两张图片的切换,如图
两张图片的切换
四周闪烁效果.gif
具体代码
第一步:HTML布局
第二部:绘制大转盘
做一些画布的基础设置,此处预先假设抽奖奖项为6项
//获取canvas画布
var canvas = document.getElementById("wheelCanvas");
var ctx = canvas.getContext("2d");
var canvasW = canvas.width; // 画板的高度
var canvasH = canvas.height; // 画板的宽度
//计算每个奖项所占角度数
var baseAngle = Math.PI * 2 / 6;
ctx.clearRect(0,0,canvasW,canvasH);//去掉背景默认的黑色
console.log(canvasW);
ctx.strokeStyle = "#199301"; //设置画图线的颜色
ctx.font = '26px Microsoft YaHei';//设置字号字体
循环绘制6个60度的扇形,canvas是从水平位置开始绘制的,效果如图
colors = ["#AE3EFF","#4D3FFF","#FC262C","#3A8BFF","#EE7602","#FE339F"];
for(var index = 0; index < 6; index++) {
var angle = index * baseAngle;
ctx.fillStyle = colors[index];//设置每个扇形区域的颜色
ctx.beginPath();//开始绘制
ctx.arc(canvasW * 0.5, canvasH * 0.5, 170, angle, angle + baseAngle, false);
ctx.arc(canvasW * 0.5, canvasH * 0.5, 68, angle + baseAngle, angle, true);
//context.arc(x,y,r,sAngle,eAngle,counterclockwise);创建弧/曲线
ctx.stroke();//开始链线
ctx.fill();//填充颜色
ctx.save();//保存当前环境的状态
}
循环绘制6个60度的扇形,并放上文字图片
colors = ["#AE3EFF","#4D3FFF","#FC262C","#3A8BFF","#EE7602","#FE339F"];
rewardUrl =[]//从服务器请求回来的imgurl
prizeId =[]//从服务器请求回来的奖项
// 图片信息
var imgUrl1 = new Image();
imgUrl1.src = turnWheel.rewardUrl[0];
var imgUrl2 = new Image();
imgUrl2.src = turnWheel.rewardUrl[1];
var imgUrl3 = new Image();
imgUrl3.src = turnWheel.rewardUrl[2];
var imgUrl4 = new Image();
imgUrl4.src = turnWheel.rewardUrl[3];
var imgUrl5 = new Image();
imgUrl5.src = turnWheel.rewardUrl[4];
var imgUrl6 = new Image();
imgUrl6.src = turnWheel.rewardUrl[5];
//注意需要等图片加载完成后绘制
window.onload = function() {
drawWheelCanvas();
};
for(var index = 0; index < 6; index++) {
var angle = index * baseAngle;
ctx.fillStyle = colors[index];//设置每个扇形区域的颜色
ctx.beginPath();//开始绘制
ctx.arc(canvasW * 0.5, canvasH * 0.5, 170, angle, angle + baseAngle, false);
ctx.arc(canvasW * 0.5, canvasH * 0.5, 68, angle + baseAngle, angle, true);
//context.arc(x,y,r,sAngle,eAngle,counterclockwise);创建弧/曲线
ctx.stroke();//开始链线
ctx.fill();//填充颜色
ctx.save();//保存当前环境的状态
ctx.fillStyle = "#fff000";
var rewardName = prizeId[index];
var line_height = 24;
// translate方法重新映射画布上的 (0,0) 位置
var translateX = canvasW * 0.5 + Math.cos(angle + baseAngle / 2) * turnWheel.textRadius;
var translateY = canvasH * 0.5 + Math.sin(angle + baseAngle / 2) * turnWheel.textRadius;
ctx.translate(translateX, translateY);
// rotate方法旋转当前的绘图,因为文字适合当前扇形中心线垂直的!
// angle,当前扇形自身旋转的角度 + baseAngle / 2 中心线多旋转的角度 + 垂直的角度90°
ctx.rotate(angle + baseAngle / 2 + Math.PI / 2);
//设置文本位置,居中显示
ctx.fillText(rewardName, -ctx.measureText(rewardName).width / 2, 100);
//添加对应图标
if(index == 0){
ctx.drawImage(imgUrl1,-35,0,60,60);
}else if(index == 1){
ctx.drawImage(imgUrl2,-35,0,60,60);
}else if(index == 2){
ctx.drawImage(imgUrl3,-35,0,60,60);
}else if(index == 3){
ctx.drawImage(imgUrl4,-35,0,60,60);
}else if(index == 4){
ctx.drawImage(imgUrl5,-35,0,60,60);
}else{
ctx.drawImage(imgUrl6,-35,0,60,60);
}
ctx.restore(); //很关键,还原画板的状态到上一个save()状态之前
}
第三部:设置旋转转盘配置
//旋转转盘 item:奖品序号,从0开始的; txt:提示语 ,count 奖品的总数量;
var rotateFunc = function(item, tip, count) {
// 应该旋转的角度,旋转插件角度参数是角度制。
var baseAngle = 360 / count;
// 旋转角度 == 270°(当前第一个角度和指针位置的偏移量) - 奖品的位置 * 每块所占的角度 - 每块所占的角度的一半(指针指向区域的中间)
angles = 360 * 3 / 4 - (item * baseAngle) - baseAngle / 2; // 因为第一个奖品是从0°开始的,即水平向右方向
$('#wheelCanvas').stopRotate();
// 注意,jqueryrotate 插件传递的角度不是弧度制。
// 哪个标签调用方法,旋转哪个控件
$('#wheelCanvas').rotate({
angle: 0,
animateTo: angles + 360 * 5, // 这里多旋转了5圈,圈数越多,转的越快
duration: 8000,
callback: function() { // 回调
//弹出中奖提示
turnWheel.bRotate = !turnWheel.bRotate;
}
});
};
第四部:点击抽奖事件
此处需要做的是,在用户点击时向后台发送请求,接收中奖信息,开始旋转...
// 抽取按钮按钮点击触发事件
$('.pointer').click(function() {
// 正在转动,直接返回
if(turnWheel.bRotate) return;
turnWheel.bRotate = !turnWheel.bRotate;
var count = turnWheel.rewardNames.length;
$.ajax({
type: "POST",
url: "./drawPrize.htm",
data: {
customerId: $(".customerId").val()
},
async: false,
dataType: "json", // 返回数据类型
success: function(data) {
console.log(data);
if(data.type == 1) { //积分不足
} else if(data.type == 2) { //抽奖次数已经用完
} else { //抽奖次数已经用完
turnWheel.prizeId.forEach(function(currentValue, index) {
if(currentValue == data.prize.id) {
var item = index;
$(".award-warp .content").html(data.prize.name);
// 开始抽奖
rotateFunc(item, turnWheel.rewardNames[item], count);
}
})
}
},
error: function(data) {
console.log("网络错误,请检查您的网络设置!");
}
});
});
js+php+大转盘,H5 Canvas抽奖大转盘代码实现及总结相关推荐
- canvas抽奖插件大转盘和九宫格
下载地址 两款canvas抽奖插件包含大转盘和九宫格// 大转盘抽奖 let luckyWheel = new LuckyCanvas.LuckyWheel({ el: "#my-lucky ...
- h5大转盘 php,HTML5 canvas实现中奖转盘的实例代码
本篇文章给大家带来的内容是关于HTML5 canvas实现中奖转盘的实例代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 最近在学canvas做动画,于是就写个转盘练下手. 上个简 ...
- vue幸运抽奖大转盘的丑绝实现
自己通过canvas+vue(vue不是必备的可以)实现的一个抽奖转盘,重点在实现逻辑,所以样式丑绝. 基本效果图,中间指针可以替换为图片 数据格式 转盘的分块由传入的数组长度确定,分为4,6,8块还 ...
- css3抽奖转盘,从零制作CSS3抽奖大转盘
今天的任务是做一个纯CSS3的还算比较漂亮的抽奖大转盘,也就是下图效果. 我只说思路和重要的CSS3代码. Paste_Image.png 外盘 外盘是指有彩灯的深橙色圆环,以及圆环的外边线. 外盘设 ...
- 微信小程序独家秘笈之抽奖大转盘
代码地址如下: http://www.demodashi.com/demo/14209.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...
- 用html实现抽奖大转盘,【项目实战】用CSS实现一个抽奖转盘(附详细代码+思路)...
原标题:[项目实战]用CSS实现一个抽奖转盘(附详细代码+思路) 效果 基本是用CSS实现的,没有用图片,加一丢丢JS. 完全没有考虑兼容性. 首先画一个转盘 < htmllang= " ...
- 大转盘H5游戏的优点
不论是线上还是线下的活动方案和模式越来越多,不过大转盘抽奖依旧是使用率最高的游戏模式.越来越多的电商.银行等主流行业采用大转盘H5游戏进行抽奖,得到了用户们的广泛青睐,那么,到底大转盘游戏到底有何种魅 ...
- 大转盘H5模板的游戏优点
不论是线上还是线下的营销活动方案和模式越来越多,不过大转盘抽奖依旧是使用率最高的营销游戏模式.越来越多的电商.银行等主流行业采用大转盘H5游戏进行抽奖促销,得到了用户们的广泛青睐,那么,到底大转盘游戏 ...
- 自学小程序,我教你呀(三)实现大转盘 仿天猫抽奖 跑马灯效果
往期精选: 自学小程序,我教你呀(一)简单倒计时 自学小程序,我教你呀(二)小程序实现电商秒杀倒计时效果 基本实现功能 1,小程序仿天猫超市抽奖大转盘 2,跑马灯效果 3,开始抽奖,抽奖完成后有弹窗 ...
- 微信小程序源码大集004---小程序实现大转盘 仿天猫抽奖 跑马灯效果(有图有源码)
10天零基础入门微信小程序开发,只讲干货,实战入门,10天开发属于自己的上线小程序. 10天零基础入门小程序系列教程 基本实现功能 1,小程序仿天猫超市抽奖大转盘 2,跑马灯效果 3,开始抽奖,抽奖完 ...
最新文章
- python可以做测试软件吗_Python如何给你的程序做性能测试
- C++中类的继承方式的区别以及private public protected 范围
- 克莱姆V(克莱姆相关系数、克莱姆关联系数、独立系数)
- 浅谈5G机房配套那些事
- HTML+CSS+JavaScript复习笔记持更(二)——列表篇
- 圆桌的项目Alpha冲刺(团队)
- 控制台服务编写 Linux,一步步搭建ubuntu server console(控制台,字符模式)开发环境...
- 数据库流行度7月排行榜:Oracle 和 MySQL 暴跌创历史新低
- java innodb存储引擎_MySQL InnoDB存储引擎的事务隔离级别
- 银联接口(注意项备忘)
- maven本地仓库中存在jar包,但编译不成功,显示jar包不存在
- mysql中url的格式_MySQL JDBC URL中的格式以及参数介绍
- 啦啦外卖UNIAPP(4.0)源码商家+骑手
- ati.c ATI顯卡開發源代碼
- CoAP协议学习笔记 3.2 CoAP协议翻译 DTLS加密
- Wekan 部署文档
- java茌首字母_获取输入字符的首字母(中文为拼音首字母)
- ucdavis计算机科学专业,加州大学戴维斯分校有哪些专业处于世界顶尖水平?
- MAXIMO学习笔记
- 粗糙集的概念和一些例子
热门文章
- 问的书写规则是什么意思_水的书写规则是什么
- Chrome浏览器使用“油猴插件”观看巨人(免疫港澳台限制)
- 医学知识-骨密度以及骨密度测量
- 黑马程序员——双列集合、泛型 笔记第十一篇
- Laravel第二章
- 计算机系固态硬盘机械硬盘,固态硬盘和机械硬盘可以在一起使用吗?
- 嵌入式单片机基础篇(五)之stm32F1以及51单片机时钟详解
- xml文件怎么转换成wps_word文档怎样转换成xml 怎么将XML文档转成WORD文档
- RGB颜色对照表(数值+英文,Markdown可用)
- 免费pdf转换成jpg图片方法