這是我參與8月更文挑戰的第12天,活動詳情查看:8月更文挑戰。css
關於關於【SSD系列】:
前端一些有意思的內容,旨在3-10分鐘裏, 500-1500字,有所獲,又不爲所累。前端
掘金抽獎,不中大獎,本身復原UI, 中一個大獎知足本身,順便封裝一個庫。css3
若是點贊破100,再寫一篇轉盤抽獎的相關文章,並順便封裝一個庫。git
luckDraw 源碼github
抽獎嘛,簡單說就是障眼法。 前先後後的動畫都是加強一些體驗,尋求一點刺激罷了,幻想本身能成爲那個大獎得到者。web
常見的抽獎表現有兩種,九宮格和轉盤,轉盤又有轉動指針和轉動轉盤兩種。 從實現難度上來講, 轉盤大於九宮格。chrome
這裏就客串分析下掘金的技術棧,推薦一款 BuiltWith Technology Profiler的chrome建立,其能分析出網站的採用哪些技術構建。 咱們一看看看掘金的。api
看看DOm節點熟悉的__nuxt
和 data-v
, 還真是那麼回事。 微信
掘金的抽獎屬於典型的九宮格,中間是抽獎的按鈕。markdown
典型的flex佈局,九個格子,九個turntable-item
div,抽獎按鈕採用單獨的lottery
樣式標記。
抽獎接口是https://api.juejin.cn/growth_api/v1/lottery/draw
,咱們打開控制面板, Network板塊,輸入draw
過濾請請求。
執行一次,而後block抽獎請求。
再次執行,能夠明顯的看到先執行了動畫,因此我推斷是動畫先行,至於真相,他重要嗎?不重要,反正我也抽不中!!!!!!
咱們採用動畫先行方案,先啓動動畫,中途請求結果,獲得結果後,執行命中動畫。
1. 編號
0-n
個坑位,九宮格的話,就是0-7
個坑位,坑位的東西能夠重複。
2.啓動動畫
勻速的切換格子,同時請求服務接口。
3. 中獎動畫
收到結果後,計算出命中獎品的編號,並執行減速邏輯。
基本思路就是這樣子的,爲了通用性,咱們須要多思考一些,抽獎重要的是邏輯,表面的形式重要嗎? 其實並不過重要,因此咱們這裏把抽獎邏輯封裝,提供可變性,並對外提供事件通知。
可變性
可變性通常是經過參數和對外暴露方法來實現的,咱們也不例外。
事件通知
整個過程可能存在的事件:
咱們把這些整個起來, 大概就是這個樣子了,都很簡單。
var defaultOption = {
startIndex: 0, // 初始位置
pits: 8, // 格子數
interval: 100, // 初始間隔
rate: 2.5, // 係數
cycle: 5, //轉動基本次數:即至少須要轉動多少次再進入抽獎環節
getInterval: null // 自定義旋轉間隔函數
//onStart: null, // 當開始
//onUpdate: null, // 旋轉一次
//onEnded: null, // 結束
//onError: null // 異常, 好比轉動次數已經達到設定值, 可是沒有設置獎項
};
複製代碼
先封裝兩個添加方法,一個添加選中的class,一個刪除選中的class。
function removeChosenClass() {
var el = lotteryEl.querySelector('.turntable-item.chosen');
if (el) {
el.classList.remove('chosen');
}
}
function addChosenClass(index){
lotteryEl.querySelector('.turntable-item.turntable-item-' + index).classList.add('chosen');
}
複製代碼
Lottery是咱們封裝的邏輯類。
var options = {
};
var lottery = new Lottery(options);
複製代碼
4號坑位是大獎
var btnStart = document.querySelector(".turntable-box .turntable-item.lottery");
btnStart.addEventListener('click', function () {
lottery.start();
setTimeout(() => {
setPrize();
}, 800)
})
function setPrize() {
lottery.setPrize([4]) // 4號坑位是大獎
}
複製代碼
lottery.onUpdate = function (ins, index, times) {
removeChosenClass();
addChosenClass(index);
}
lottery.onEnded = function (ins, index, prizeIndexes) {
removeChosenClass();
addChosenClass(index);
setTimeout(function () {
dialogEl.classList.remove("hide");
}, 500)
}
複製代碼
到此爲止,使用代碼完畢,與框架無關。
邏輯庫的完整代碼位於 抽獎邏輯Lottery.js , 我就不全貼出來,否則違揹我500-1500字的原則了,就貼一張簡單的屬性圖吧。
是否是很簡單,一切都看起來沒那麼難。
不忘初衷,【SSD系列】,3-5分鐘,500-1000字,有所得,而不爲所累,若是你以爲不錯,你的一讚一評就是我前行的最大動力。
技術交流羣請到 這裏來。 或者添加個人微信 cloud-dirge,一塊兒學習。