前言
這個元件是我寫過的關於移動端h5活動轉盤抽獎的頁面,當時寫完之後確定挺好看、挺炫的,所以就把它單獨出來了,以後再寫類似的頁面,可以參考其中的一些實現原理!
主要用到的技術
- 用Math.random()方法實現一個區間的隨機數,用於實現每次使用者點選抽獎的時候,隨機得到轉盤需要所轉的盤數。程式碼原理如下:
//獲取一個介於某兩個數之間的
function getRandomNumber(min,max){
return Math.floor(Math.random() * (max - min)) + min;
};複製程式碼
在實現轉盤的時候,用到了兩個隨機數,一個較小,一個較大,主要用來分別控制指標和獎品轉盤以不同的速度旋轉,用以給使用者實現視差!
轉盤旋轉之前,用不同的初始角度代表不同的不同的獎品,那麼最後轉盤要轉的角度就是:隨機數n 360。比如“xx獎品”的預設角度相對於轉盤是45度,抽獎的時候,得到的隨機數是2,那麼轉盤就應該轉2 360 + 45 = 765度。這樣就能把每次轉盤所轉的角度跟產品對應起來了!
動畫實現方面主要用到了setTimeout和window.requestAnimationFrame,但是主要在用setTimeout的時候,為了防止動畫的抖動,應該保證1s中繪製60幀頁面,也就是說,轉盤要轉3圈,用時3秒的話,那麼每調一次setTimeout方法,轉盤所轉的角度就是:
var perAngle = 3 * 360 / 3 * 60;//6°複製程式碼
- 寫完這段程式碼,是在pc上檢視效果的,在手機上產看效果的時候,會出現抽獎頁面圖片載入慢以及旋轉閃爍燈有點卡頓的問題,我們可以分別採用下面的方法解決:
1、圖片載入慢的問題,我們可以採用一種最原始、最笨、最省錢的方法(其它方法可以使用cdn等等,這裡不介紹)——預載入解決,方法就是在進入本頁面之前,在同一個伺服器的其它頁面把對應的圖片載入一遍,這樣當進入到當前的頁面,需要載入的圖片已經在快取中了,所以此時再載入這些圖片就會快從快取中直接拿圖片,速度就會槓槓的!如(需要在b頁面圖片1,我們可以在a頁面中先載入一次,記住,a頁面和b頁面在同一個伺服器下):
<!--a頁面-->
<div>
<img src="圖片1" />
</div>
<!--b頁面-->
<!--此時載入圖片當然就是從快取中拿到的圖片-->
<div>
<img src="圖片1" />
</div>複製程式碼
2、閃爍燈卡頓的,問題,可以調節響應圖片的動畫的更新頻率解決
- 另外,為了防止使用者多次點選抽獎,多次向後臺傳送資料,對ajax請求進行了一定的處理,當然了,也為了防止連續點選抽獎按鈕,多次動畫,也進行了響應的處理,主要思路就是點選抽獎的時候,顯示一個遮罩層,這個遮罩層的z-index大於抽獎按鈕,這樣就阻止了使用者再次點選抽獎按鈕,最後抽獎成功之後,再把這個遮罩層隱藏。主要原理程式碼如下:
var isRequesting = false;
function getData(){
//如果當前使用者正在進行抽獎,那麼就返回
if(isRequesting)return false;
isRequesting = true;
//顯示遮罩層
$("._mask").css('display','block');
//其餘程式碼省略
$.ajax({
url:server_api_address,
type:'GET',
success : function(data){
isRequesting = false;
//其餘程式碼省略
//當前轉盤動畫完成之後
//再隱藏遮罩層
animationComplate(function(){
$("._mask").css('display','none');
});
},
error:function(data){
//程式碼省略
}
});
};複製程式碼
需要改進的地方
目前來看,我覺得唯一有點欠缺的地方就是:轉盤和指標的旋轉速度總是勻速的,很難帶給使用者那種驚心動魄、期待的真實抽獎的感覺。所以轉盤的速度演算法方面應該做一些改進!讓抽獎更接近真實感覺!
當然其它一些地方問題,這裡就不注重談了,因為涉及到具體的前後臺對接問題!