微信小程序開發(fā)之大轉(zhuǎn)盤 仿天貓超市抽獎實(shí)例
天貓超市翻牌的轉(zhuǎn)盤經(jīng)常用,以前做Android,沒啥想法,現(xiàn)在嘗試微信小程序,看到別人家APP里有啥好玩的,就想去做一個(gè).
上GIF看效果:

簡要的說一下.
1.外面一圈閃爍的小球是用js控制的樣式.500ms改變一次樣式.簡單粗暴;
2.抽獎的item也是js控制背景,但是怎么樣讓它優(yōu)雅的停下來是個(gè)問題.動畫中有timingFunction可以設(shè)置速度.自己用js就沒那么簡單了.我這里用setInterval(),時(shí)間是線性變化的.換個(gè)斜率先小后大的函數(shù)效果應(yīng)該會好一些.
注釋寫了一些,湊合這看吧.有不對的地方,
歡迎批評!
上代碼:
1.index.wxml
<view class="container-out">
<view class="circle" wx:for="{{circleList}}" style="top:{{item.topCircle}}rpx;left:{{item.leftCircle}}rpx;background-color: {{(index%2==0)?colorCircleFirst:colorCircleSecond}};"></view>
<view class="container-in">
<view class="content-out" wx:for="{{awardList}}" style="top:{{item.topAward}}rpx;left:{{item.leftAward}}rpx;background-color: {{(index==indexSelect)?colorAwardSelect:colorAwardDefault}};">
<image class="award-image" src="{{item.imageAward}}"></image>
</view>
<view class="start-btn" bindtap="startGame" style=" background-color:{{isRunning?'#e7930a':'#ffe400'}}">START</view>
</view>
</view>
2.index.wxss
.container-out {
height: 600rpx;
width: 650rpx;
background-color: #b136b9;
margin: 100rpx auto;
border-radius: 40rpx;
box-shadow: 0 10px 0 #871a8e;
position: relative;
}
.container-in {
width: 580rpx;
height: 530rpx;
background-color: #871a8e;
border-radius: 40rpx;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
/**小圓球
box-shadow: inset 3px 3px 3px #fff2af;*/
.circle {
position: absolute;
display: block;
border-radius: 50%;
height: 20rpx;
width: 20rpx;
}
.content-out {
position: absolute;
height: 150rpx;
width: 166.6666rpx;
background-color: #f5f0fc;
border-radius: 15rpx;
box-shadow: 0 5px 0 #d87fde;
}
/**居中 加粗*/
.start-btn {
position: absolute;
margin: auto;
top: 0;
left: 0;
bottom: 0;
right: 0;
border-radius: 15rpx;
height: 150rpx;
width: 166.6666rpx;
background-color: #ffe400;
box-shadow: 0 5px 0 #e7930a;
color: #f6251e;
text-align: center;
font-size: 55rpx;
font-weight: bolder;
line-height: 150rpx;
}
.award-image {
position: absolute;
margin: auto;
top: 0;
left: 0;
bottom: 0;
right: 0;
height: 140rpx;
width: 130rpx;
}
3.index.js
Page({
data: {
circleList: [],//圓點(diǎn)數(shù)組
awardList: [],//獎品數(shù)組
colorCircleFirst: '#FFDF2F',//圓點(diǎn)顏色1
colorCircleSecond: '#FE4D32',//圓點(diǎn)顏色2
colorAwardDefault: '#F5F0FC',//獎品默認(rèn)顏色
colorAwardSelect: '#ffe400',//獎品選中顏色
indexSelect: 0,//被選中的獎品index
isRunning: false,//是否正在抽獎
imageAward: [
'../../images/1.jpg',
'../../images/2.jpg',
'../../images/3.jpg',
'../../images/4.jpg',
'../../images/5.jpg',
'../../images/6.jpg',
'../../images/7.jpg',
'../../images/8.jpg',
],//獎品圖片數(shù)組
},
onLoad: function () {
var _this = this;
//圓點(diǎn)設(shè)置
var leftCircle = 7.5;
var topCircle = 7.5;
var circleList = [];
for (var i = 0; i < 24; i++) {
if (i == 0) {
topCircle = 15;
leftCircle = 15;
} else if (i < 6) {
topCircle = 7.5;
leftCircle = leftCircle + 102.5;
} else if (i == 6) {
topCircle = 15
leftCircle = 620;
} else if (i < 12) {
topCircle = topCircle + 94;
leftCircle = 620;
} else if (i == 12) {
topCircle = 565;
leftCircle = 620;
} else if (i < 18) {
topCircle = 570;
leftCircle = leftCircle - 102.5;
} else if (i == 18) {
topCircle = 565;
leftCircle = 15;
} else if (i < 24) {
topCircle = topCircle - 94;
leftCircle = 7.5;
} else {
return
}
circleList.push({ topCircle: topCircle, leftCircle: leftCircle });
}
this.setData({
circleList: circleList
})
//圓點(diǎn)閃爍
setInterval(function () {
if (_this.data.colorCircleFirst == '#FFDF2F') {
_this.setData({
colorCircleFirst: '#FE4D32',
colorCircleSecond: '#FFDF2F',
})
} else {
_this.setData({
colorCircleFirst: '#FFDF2F',
colorCircleSecond: '#FE4D32',
})
}
}, 500)
//獎品item設(shè)置
var awardList = [];
//間距,怎么順眼怎么設(shè)置吧.
var topAward = 25;
var leftAward = 25;
for (var j = 0; j < 8; j++) {
if (j == 0) {
topAward = 25;
leftAward = 25;
} else if (j < 3) {
topAward = topAward;
//166.6666是寬.15是間距.下同
leftAward = leftAward + 166.6666 + 15;
} else if (j < 5) {
leftAward = leftAward;
//150是高,15是間距,下同
topAward = topAward + 150 + 15;
} else if (j < 7) {
leftAward = leftAward - 166.6666 - 15;
topAward = topAward;
} else if (j < 8) {
leftAward = leftAward;
topAward = topAward - 150 - 15;
}
var imageAward = this.data.imageAward[j];
awardList.push({ topAward: topAward, leftAward: leftAward, imageAward: imageAward });
}
this.setData({
awardList: awardList
})
},
//開始游戲
startGame: function () {
if (this.data.isRunning) return
this.setData({
isRunning: true
})
var _this = this;
var indexSelect = 0
var i = 0;
var timer = setInterval(function () {
indexSelect++;
//這里我只是簡單粗暴用y=30*x+200函數(shù)做的處理.可根據(jù)自己的需求改變轉(zhuǎn)盤速度
i += 30;
if (i > 1000) {
//去除循環(huán)
clearInterval(timer)
//獲獎提示
wx.showModal({
title: '恭喜您',
content: '獲得了第' + (_this.data.indexSelect + 1) + "個(gè)優(yōu)惠券",
showCancel: false,//去掉取消按鈕
success: function (res) {
if (res.confirm) {
_this.setData({
isRunning: false
})
}
}
})
}
indexSelect = indexSelect % 8;
_this.setData({
indexSelect: indexSelect
})
}, (200 + i))
}
})
demo代碼下載
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript運(yùn)動框架 多物體任意值運(yùn)動(三)
這篇文章主要為大家詳細(xì)介紹了JavaScript運(yùn)動框架的第三部分,多物體任意值運(yùn)動,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
javascript簡單拖拽實(shí)現(xiàn)代碼(鼠標(biāo)事件 mousedown mousemove mouseup)
javascript簡單拖拽,簡單拖拽實(shí)現(xiàn)2012-05-05
JS實(shí)現(xiàn)隨機(jī)生成字符串(可指定長度)的示例代碼
本文主要介紹了JS實(shí)現(xiàn)隨機(jī)生成字符串(可指定長度)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
JS尾遞歸的實(shí)現(xiàn)方法及代碼優(yōu)化技巧
這篇文章主要介紹了JS尾遞歸的實(shí)現(xiàn)方法及代碼優(yōu)化技巧,結(jié)合實(shí)例形式分析了尾遞歸的原理、JS實(shí)現(xiàn)方法及優(yōu)化技巧,需要的朋友可以參考下2019-01-01
js控住DOM實(shí)現(xiàn)發(fā)布微博效果
這篇文章主要為大家詳細(xì)介紹了js控住DOM實(shí)現(xiàn)發(fā)布微博效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
JS使用對象的defineProperty進(jìn)行變量監(jiān)控操作示例
這篇文章主要介紹了JS使用對象的defineProperty進(jìn)行變量監(jiān)控操作,結(jié)合實(shí)例形式分析了對象defineProperty方法的功能及簡單使用技巧,需要的朋友可以參考下2019-02-02
uni-app跨端自定義指令實(shí)現(xiàn)按鈕權(quán)限操作
實(shí)現(xiàn)uni-app自定義指令按鈕權(quán)限需要涉及到對于vue.config.js新增loader配置,基礎(chǔ)正則知識,webpack的loader開發(fā)和調(diào)試,以及npm本地調(diào)試和發(fā)布,接下來就從了解這些前置知識開始,需要的朋友可以參考下2023-01-01

