小猿圈web前端之jQuery抽奖系统

你有没有想过有一天可以成为千万富翁呢?你是通过自己的努力和奋斗还是其他手段获得的呢?前端程序员是通过jQuery获得的,他自己写了一个抽奖系统,下面就小猿圈前端讲师分享给大家。

效果图:


<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,minimum-scale=1,user-scalable=no">

<meta http-equiv="X-UA-Compatible" content="ie=edge">

<title>抽奖</title>

<style>

.lottery {

position: relative;

display: inline-block;

}

.lottery img {

position: absolute;

top: 50%;

left: 50%;

margin-left: -76px;

margin-top: -82px;

cursor: pointer;

}

#message {

position: absolute;

top: 0px;

left: 10%;

}

</style>

<!--[if lte IE 8]>

<style>

.lottery img{

display: none;

}

</style>

<![endif]-->

</head>

<body>

<div>

<canvas id="myCanvas" width="600" height="600" style="border:1px solid #d3d3d3;">

当前浏览器版本过低,请使用其他浏览器尝试

</canvas>

<p id="message"></p>

<img src="./images/start.png" id="start">

</div>

<script src="这里引入jquery.js"></script>

<script>

(function ($) {

/**

* @param {Object} options

* @param {Array} options.list 存储奖品的的列表,example [{1:{name:'谢谢参与',image:'1.jpg'}}]

* @param {Object} options.outerCircle {color:'#df1e15'} 外圈颜色,默认红色

* @param {Object} options.innerCircle {color:'#f4ad26'} 里圈颜色,默认黄色

* @param {Array} options.dots ['#fbf0a9', '#fbb936'] 装饰点颜色 ,默认深黄浅黄交替

* @param {Array} options.disk ['#ffb933', '#ffe8b5', '#ffb933', '#ffd57c', '#ffb933', '#ffe8b5', '#ffd57c'] 中心奖盘的颜色,默认7彩

* @param {Object} options.title {color:'#5c1e08',font:'19px Arial'} 奖品标题颜色

*/

$.fn.WheelSurf = function (options) {

var _default = {

outerCircle: {

color: '#df1e15'

},

innerCircle: {

color: '#f4ad26'

},

dots: ['#fbf0a9', '#fbb936'],

disk: ['#ffb933', '#ffe8b5', '#ffb933', '#ffd57c', '#ffb933', '#ffe8b5', '#ffd57c'],

title: {

color: '#5c1e08',

font: '19px Arial'

}

}

$.extend(_default,options)

// 画布中心移动到canvas中心

var _this = this[0],

width = _this.width,

height = _this.height,

ctx = _this.getContext("2d"),

imgs = [],

awardTitle = [],

awardPic = []

for (var item in _default.list) {

awardTitle.push(_default.list[item].name)

imgs.push(_default.list[item].image)

}

var num = imgs.length

// 圆心

var x = width / 2

var y = height / 2

ctx.translate(x, y)

return {

init: function (angelTo) {

angelTo = angelTo || 0;

ctx.clearRect(-this.width, -this.height, this.width, this.height);

// 平分角度

var angel = (2 * Math.PI / 360) * (360 / num);

var startAngel = 2 * Math.PI / 360 * (-90)

var endAngel = 2 * Math.PI / 360 * (-90) + angel

// 旋转画布

ctx.save()

ctx.rotate(angelTo * Math.PI / 180);

// 画外圆

ctx.beginPath();

ctx.lineWidth = 25;

ctx.strokeStyle = _default.outerCircle.color;

ctx.arc(0, 0, 243, 0, 2 * Math.PI)

ctx.stroke();

// 画里圆

ctx.beginPath();

ctx.lineWidth = 23;

ctx.strokeStyle = _default.innerCircle.color;

ctx.arc(0, 0, 218, 0, 2 * Math.PI)

ctx.stroke();

// 装饰点

var dotColor = _default.dots

for (var i = 0; i < 12; i++) {

// 装饰点 圆心 坐标计算

ctx.beginPath();

var radius = 230;

var xr = radius * Math.cos(startAngel)

var yr = radius * Math.sin(startAngel)

ctx.fillStyle = dotColor[i % dotColor.length]

ctx.arc(xr, yr, 11, 0, 2 * Math.PI)

ctx.fill()

startAngel += (2 * Math.PI / 360) * (360 / 12);

}

// 画里转盘

var colors = _default.disk

for (var i = 0; i < num; i++) {

ctx.beginPath();

ctx.lineWidth = 208;

ctx.strokeStyle = colors[i % colors.length]

ctx.arc(0, 0, 104, startAngel, endAngel)

ctx.stroke();

startAngel = endAngel

endAngel += angel

}

// 添加奖品

function loadImg() {

var dtd = $.Deferred()

var countImg = 0

if (awardPic.length) {

return dtd.resolve(awardPic);

}

for (var i = 0; i < num; i++) {

var img = new Image()

awardPic.push(img)

img.src = imgs[i]

img.onload = function () {

countImg++

if (countImg == num) {

dtd.resolve(awardPic);

}

}

}

return dtd.promise()

}

$.when(loadImg()).done(function (awardPic) {

startAngel = angel / 2

for (var i = 0; i < num; i++) {

ctx.save();

ctx.rotate(startAngel)

ctx.drawImage(awardPic[i], -48, -48 - 130);

ctx.font = _default.title.font;

ctx.fillStyle = _default.title.color

ctx.textAlign = "center";

ctx.fillText(awardTitle[i], 0, -170);

startAngel += angel

ctx.restore();

}

})

ctx.restore();

},

/**

* @param angel 旋转角度

* @param callback 转完后的回调函数

*/

lottery: function (angel, callback) {

angel = angel || 0

angel = 360-angel

angel += 720

// 基值(减速)

var baseStep = 30

// 起始滚动速度

var baseSpeed = 0.3

// 步长

var count = 1;

var _this = this

var timer = setInterval(function () {

_this.init(count)

if (count == angel) {

clearInterval(timer)

if (typeof callback == "function") {

callback()

}

}

count = count + baseStep * (((angel - count) / angel) > baseSpeed ? baseSpeed : ((angel - count) / angel))

if (angel - count < 0.5) {

count = angel

}

}, 25)

}

}

}

}(jQuery))

</script>

<script>

var wheelSurf

// 初始化装盘数据 正常情况下应该由后台返回

var initData = {

"success": true,

"list": [{

"id": 100,

"name": "5000元京东卡",

"image": "./images/1.png",

"rank":1,

"percent":3

},

{

"id": 101,

"name": "1000元京东卡",

"image": "./images/2.png",

"rank":2,

"percent":5

},

{

"id": 102,

"name": "100个比特币",

"image": "./images/3.png",

"rank":3,

"percent":2

},

{

"id": 103,

"name": "50元话费",

"image": "./images/4.png",

"rank":4,

"percent":49

},

{

"id": 104,

"name": "100元话费",

"image": "./images/5.png",

"rank":5,

"percent":30

},

{

"id": 105,

"name": "500个比特币",

"image": "./images/6.png",

"rank":6,

"percent":1

},

{

"id": 106,

"name": "500元京东卡",

"image": "./images/7.png",

"rank":7,

"percent":10

}

]

}

// 计算分配获奖概率(前提所有奖品概率相加100%)

function getGift(){

var percent = Math.random()*100

var totalPercent = 0

for(var i = 0 ,l = initData.list.length;i<l;i++){

totalPercent += initData.list[i].percent

if(percent<=totalPercent){

return initData.list[i]

}

}

}

var list = {}


var angel = 360 / initData.list.length

// 格式化成插件需要的奖品列表格式

for (var i = 0, l = initData.list.length; i < l; i++) {

list[initData.list[i].rank] = {

id:initData.list[i].id,

name: initData.list[i].name,

image: initData.list[i].image

}

}

// 查看奖品列表格式


// 定义转盘奖品

wheelSurf = $('#myCanvas').WheelSurf({

list: list, // 奖品 列表,(必填)

outerCircle: {

color: '#df1e15' // 外圈颜色(可选)

},

innerCircle: {

color: '#f4ad26' // 里圈颜色(可选)

},

dots: ['#fbf0a9', '#fbb936'], // 装饰点颜色(可选)

disk: ['#ffb933', '#ffe8b5', '#ffb933', '#ffd57c', '#ffb933', '#ffe8b5', '#ffd57c'], //中心奖盘的颜色,默认7彩(可选)

title: {

color: '#5c1e08',

font: '19px Arial'

} // 奖品标题样式(可选)

})

// 初始化转盘

wheelSurf.init()

// 抽奖

var throttle = true;

$("#start").on('click', function () {

var winData = getGift() // 正常情况下获奖信息应该由后台返回

$("#message").html('')

if(!throttle){

return false;

}

throttle = false;

var count = 0

// 计算奖品角度

for (const key in list) {

if (list.hasOwnProperty(key)) {

if (winData.id == list[key].id) {

break;

}

count++

}

}


// 转盘抽奖,

wheelSurf.lottery((count * angel + angel / 2), function () {

$("#message").html(winData.name)

throttle = true;

})

})

</script>

</body>

</html>

以上就是小猿圈web前端讲师给大家分享的jQuery抽奖系统,希望对你成为百万富翁有一定的帮助吧仅供娱乐,如果遇到技术上的问题可以到小猿圈寻找你需要的答案,里面有最全最新的技术等你去学习。


转载于:https://juejin.im/post/5cd532526fb9a0324e4a5403

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统说明 TonyCode抽奖系统(前身《html+js抽奖系统》),由tony于2011年自身公司年会需要设计演变而来,从单机网页版本,逐步演变为基于WEB可执行程序的系列版本。系统适用于投影投射宴会、晚宴、活动等场景的互动抽奖,最新版本支持用手机端遥控进程,系统采用HTML及WEB前端、后端相关技术开发,作者用最简单的方式打包了exe自解压程序,内置的HTA客户端脚本来执行相关的代码程序。 建议使用时采用分屏模式运行程序,如果运行场所有网络的话,您可以选择结合手机等移动端扫描的形式来获取抽奖控制权限,这样可以有更好的互动体验。 当然安装部分杀毒软件的电脑有几率会杀掉相关程序,如果出现无法开启的情况,您关闭一下杀毒软件再运行。 功能描述: 1) 可以设置按照数字号码或名单列表抽取的方式,等级、数量全部可以自由定义 2) 连接投影机扩展屏幕后,再启动程序可以自动识别投放到扩展屏幕上全屏幕显示(建议投影分辨率1024*768) 3) 界面美观大方,背景图片及顶部公司logo自由替换为文字或图片,适合于投影仪投射晚会晚宴豪华场所抽奖系统。(图片自行设计宽度可以根据投影显示器,高度216像素,本例子参考如片“tops.png”) 4) 可自由选择键盘、鼠标、移动端扫描控制等操作方式完成抽奖控制。 5) 正常windows7及以上内核系统即可流畅运行,建议不要使用非常卡顿的电脑执行程序。 6) 抽出“未到场”无效人员可以双击“演示器”屏幕的数字或号码位置,选择单独 重抽。 7) 自由定义配置每一次操作抽一组或者抽一个的显示效果 8) 自由定义过滤掉没有发到的号码段,或排除不能中间的名额号段。 9) 系统运行期间程序活动状态,自动屏蔽键盘上无用键以免人员误操作。 10) 抽奖完成后可以选择保存结果“抽取结果.csv”以便日后备案分析。 历史版本概况: V1.2.1----------------------------------------------- 2011-01-08 修复了window.obo = 1;时出现重复数字的错误,V1.1之前版本无此错误 ~感谢石路街道的领导提醒:) 2011-01-08 增加了可选滚动姓名的功能 配置 m_name=[]; 即可 2011-01-08 增加双击数字单独重抽时的提示选项“此号码在以后的环节是否还有机会抽到!” 2011-01-08 修改了结果显示部分的错位样式 2011-01-08 修复了组抽号码重复错误问题 V1.2.2----------------------------------------------- 2011-01-14 兼容了火狐浏览器,但本人建议仍然用IE,要用火狐只有按F11手动全屏了 2011-01-14 部分键 F5、退格、Ctrl+R、Ctrl+N、Shift+F10、Alt+F4 被屏蔽,避免一些意外发生 2011-01-14 优化了一些繁琐的结构,效率有所提升! 2011-01-16 去掉了配置参数 r、r_name,奖项配置变为window.ini,使配合样式表更加灵活 V1.2.2----------------------------------------------- 2011-02-10 在配置文件增加了速度控制变量,以便于在不同机器环境中做速度微调 V1.2.3----------------------------------------------- 2011-08-10 政府项目《12315电视直播》抽奖使用未对外发布定制增强版本 V2.0----------------------------------------------- 2011-09-13 突破性的解决了手工修改代码烦恼增加了图形化界面 2011-09-13 可以通过图形化设置界面保存配置文件(只在IE下有效) 2011-09-13 配置文件从HTML内提取出来,变为ini.js 2011-09-13 图形化配置界面做了一些兼容性优化 2011-09-13 奖项框除了可以填写样式名还可以直接填写样式代码,程序可以自动识别 2011-09-13 增加了手动和自动整理列表功能 V2.0.1----------------------------------------------- 2011-12-09 bug处理:列表获取处理错误,已修正! V2.0.2----------------------------------------------- 2011-12-31 bug处理:window.obo = 1;解决了不该有的错误提示!(未发布,直接发布下一版) V2.1----------------------------------------------- 2012-01-05 采用exe直接执行hta抛弃常见的浏览器模式,以免兼容性问题太多 V3.0-----------------------------------------------(终结版) 2017-1-23 修正了上一个版本的保存中间结果的bug问题,中奖结果直接保存到程序根目录 2017-1-23 修正了一次抽一个人的逻辑bug,增加作防范弊代码错误修正功能 2017-1-23 新增了保存配置文件是否下次跳过“引导页设置界面”选项,改进了保存等函数的效率及不兼容问题 2017-1-23 实现了扩展屏幕的自适应(存在扩展屏幕默认投放到扩展屏幕,否则就本地监视器显示) 2017-1-23 3.0版本把逻辑代码直接打包入了执行文件中,减少了冗余的文件数量 V4.0-----------------------------------------------(扩展屏幕移动控制板) 2017-04-10 增加了“扩展屏”奖项扩展控制器功能,原单屏版不受影响 2017-04-10 抽奖结果保存为“中奖结果.csv”文件,不再保存为原有的网页文件 2017-04-10 增加了移动端扫描二维码扫描进行遥控控制的基本进程控制功能 2017-04-10 对原有的逻辑文件做了全新打包精简掉一些不必要的冗余文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值