VUE實(shí)現(xiàn)大轉(zhuǎn)盤抽獎(jiǎng)
UI
老規(guī)矩,先看下靜態(tài)UI,以便于有個(gè)圖像概念
初始參考各值參考圖
方案分析-參數(shù)配置
核心思路:
將指針和中獎(jiǎng)區(qū)域劃分兩部分,目前常規(guī)的效果,控制中獎(jiǎng)區(qū)域旋轉(zhuǎn),然后停在指針處,當(dāng)然控制指針也可以,一套思路,dom結(jié)構(gòu)也比較簡(jiǎn)單,唯一算是復(fù)雜點(diǎn)的就是中獎(jiǎng)區(qū)域,但是如果你足夠懶,像我一樣,你可以傳遞一張圖也可以,完全依賴遠(yuǎn)端數(shù)據(jù);
關(guān)于旋轉(zhuǎn)位置
每個(gè)移動(dòng)位置應(yīng)均分,360/個(gè)數(shù) === 每個(gè)獎(jiǎng)品所占據(jù)的位置,以本文為例8個(gè)獎(jiǎng)品位置,每個(gè)區(qū)域應(yīng)為45deg,每個(gè)指針中心位置應(yīng)為±22.5deg(±的意思看你是順時(shí)針還是逆時(shí)針)具體值看下面 實(shí)現(xiàn)邏輯 區(qū)域
參數(shù)配置
- data 給與組件一些系統(tǒng)參數(shù) 旋轉(zhuǎn)的圈數(shù)、效果等等配置
- 計(jì)算屬性 rotateStyle 旋轉(zhuǎn)角度,實(shí)時(shí)調(diào)整
- props 提供組件內(nèi)部接口的參數(shù)和一些核心數(shù)據(jù),比如轉(zhuǎn)盤的圖片等等
// 基礎(chǔ)參數(shù) data () { return { isrun: false, rotateAngle: 0, // 旋轉(zhuǎn)角度 config: { duration: 4000, // 總旋轉(zhuǎn)時(shí)間 ms級(jí) circle: 8, // 旋轉(zhuǎn)圈數(shù) mode: 'ease-in-out' // 由快到慢 慣性效果都省了 }, cricleAdd: 1, // 第幾次抽獎(jiǎng) drawIndex: 0 // 中獎(jiǎng)索引 轉(zhuǎn)盤圖片排序 指針右手開(kāi)始 0-... } } // 計(jì)算屬性 computed: { rotateStyle () { const _c = this.config return ` -webkit-transition: transform ${_c.duration}ms ${_c.mode}; transition: transform ${_c.duration}ms ${_c.mode}; -webkit-transform: rotate(${this.rotateAngle}deg); transform: rotate(${this.rotateAngle}deg);` } } // 入?yún)? props: { httpData: {}, // 接口調(diào)用所需參數(shù) stateData: { type: Object, default: () => { return { coin: 0, // 超級(jí)幣數(shù)量 prize_img: '' // 轉(zhuǎn)盤圖片 } } } }
實(shí)現(xiàn)邏輯
- 咱們要做的事情很簡(jiǎn)單,計(jì)算出中獎(jiǎng)獎(jiǎng)品的位置,輸出即可
- 位置即對(duì)應(yīng)圈數(shù),drawIndex對(duì)應(yīng)獎(jiǎng)品位置,這個(gè)參數(shù)里面說(shuō)過(guò)了
this.rotateAngle = this.config.circle * 360 * this.cricleAdd - (22.5 + this.drawIndex * 45) // 圈數(shù)位置解析 // this.config.circle * 360 * this.cricleAdd 順時(shí)針總?cè)?shù)/累積總?cè)?shù) // 22.5 + this.drawIndex * 45 ===> (獎(jiǎng)品位置 === this.drawIndex * 45) (指針中間位置 === 22.5)
- drawIndex,直接從服務(wù)端拿就行了,如果沒(méi)有跑出位置,自己可以計(jì)算一下
- 為了方便拓展,拋出了兩個(gè)狀態(tài)對(duì)應(yīng)抽獎(jiǎng)的開(kāi)始于完成,start和fin
this.$emit('draw_fin', 'start') this.$emit('draw_fin', 'fin')
- 完整代碼,css就不水字?jǐn)?shù)了,下面附上源碼地址
methods: { async run () { if (this.stateData.coin < 10) { console.log('超級(jí)幣不足') return } if (this.isrun) return // const data = await this.goDraw() // 可以作為彈窗等信息展示 this.$emit('draw_fin', 'start') this.$set(this.stateData, 'coin', 0) // 更新數(shù)據(jù),此處僅為示例,推薦使用 draw_fin方法的 start/fin 進(jìn)行相應(yīng)數(shù)據(jù)更新 this.isrun = true this.rotateAngle = this.config.circle * 360 * this.cricleAdd - (22.5 + this.drawIndex * 45) // 圈數(shù)位置解析 // this.config.circle * 360 * this.cricleAdd 順時(shí)針總?cè)?shù)/累積總?cè)?shù) // 22.5 + this.drawIndex * 45 ===> (獎(jiǎng)品位置 === this.drawIndex * 45) (指針中間位置 === 22.5) this.cricleAdd++ setTimeout(() => { this.$emit('draw_fin', 'fin') this.isrun = false }, this.config.duration) }, goDraw () { // 請(qǐng)求接口拿到中獎(jiǎng)商品 // 加下自己項(xiàng)目的樣式 loading 用戶體驗(yàn) return new Promise(async (resolve, reject) => { // await 獎(jiǎng)品接口 resolve({ msg: '抽獎(jiǎng)明細(xì)' }) }) }
組件使用
使用
import dialWrap from '../../components/dial/dial.vue' <dialWrap ref="dialWrap" :stateData="stateData"></dialWrap>
抽獎(jiǎng)效果
結(jié)語(yǔ)
以上就是大概的實(shí)現(xiàn)思路了,比較簡(jiǎn)單的效果;再細(xì)的一些東西以及拓展,大家可以自行發(fā)揮哈~
另附本文-源碼地址,歡迎探討哈~
以上就是VUE實(shí)現(xiàn)大轉(zhuǎn)盤抽獎(jiǎng)的詳細(xì)內(nèi)容,更多關(guān)于vue 大轉(zhuǎn)盤抽獎(jiǎng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- vue3實(shí)現(xiàn)抽獎(jiǎng)模板設(shè)置
- vue實(shí)現(xiàn)大轉(zhuǎn)盤抽獎(jiǎng)功能
- Vue組件實(shí)現(xiàn)數(shù)字滾動(dòng)抽獎(jiǎng)效果
- vue實(shí)現(xiàn)宮格輪轉(zhuǎn)抽獎(jiǎng)
- vue簡(jiǎn)單實(shí)現(xiàn)轉(zhuǎn)盤抽獎(jiǎng)
- vue組件實(shí)現(xiàn)移動(dòng)端九宮格轉(zhuǎn)盤抽獎(jiǎng)
- Vue.js實(shí)現(xiàn)大轉(zhuǎn)盤抽獎(jiǎng)總結(jié)及實(shí)現(xiàn)思路
- 基于VUE實(shí)現(xiàn)的九宮格抽獎(jiǎng)功能
- vue實(shí)現(xiàn)手機(jī)號(hào)碼抽獎(jiǎng)上下滾動(dòng)動(dòng)畫示例
- vue組件封裝實(shí)現(xiàn)抽獎(jiǎng)隨機(jī)數(shù)
相關(guān)文章
Vue組件BootPage實(shí)現(xiàn)簡(jiǎn)單的分頁(yè)功能
這篇文章主要為大家詳細(xì)介紹了Vue小組件BootPage實(shí)現(xiàn)簡(jiǎn)單的分頁(yè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09解決Element中el-date-picker組件不回填的情況
這篇文章主要介紹了解決Element中el-date-picker組件不回填的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Vue中的echarts圖表如何實(shí)現(xiàn)loading效果
這篇文章主要介紹了Vue中的echarts圖表如何實(shí)現(xiàn)loading效果,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08vue項(xiàng)目base64字符串轉(zhuǎn)圖片的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue項(xiàng)目base64字符串轉(zhuǎn)圖片的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07Vue3?源碼分析reactive?readonly實(shí)例
這篇文章主要為大家介紹了Vue3?源碼分析reactive?readonly實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10vue 詳情跳轉(zhuǎn)至列表頁(yè)實(shí)現(xiàn)列表頁(yè)緩存
這篇文章主要介紹了vue 詳情跳轉(zhuǎn)至列表頁(yè)實(shí)現(xiàn)列表頁(yè)緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Vue.js中關(guān)于偵聽(tīng)器(watch)的高級(jí)用法示例
Vue.js 提供了一個(gè)方法 watch,它用于觀察Vue實(shí)例上的數(shù)據(jù)變動(dòng)。下面這篇文章主要給大家介紹了關(guān)于Vue.js中關(guān)于偵聽(tīng)器(watch)的高級(jí)用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-05-05vue3+elementPlus項(xiàng)目支持生成、設(shè)置默認(rèn)附件方式
這篇文章主要介紹了vue3+elementPlus項(xiàng)目支持生成、設(shè)置默認(rèn)附件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03