【來、來、來自己寫——九宮格轉盤】

五一告急,4月29日接到小任務,放假前做個九宮格轉盤小頁面,噢~~設計稿已出,當前時間下午兩點,

正在改bug,主流項目30日得上線,九宮格30日中午得上線。時間略緊下午6點改完bug,加班搞九宮格。



一個頁面,三屏內容,九宮格、結果彈窗和分享提示。

計劃:

晚上寫靜態頁面
明早寫js
晚上搞定了靜態界面,如下: 111821h4i011f1l0pt1tss.png 
111822b64y3rfjrp2yhjz2.png 

111825rnmr2aqlrnqvkr4z.png 

htmlcss方面,寬度用320px(主要用於移動端),主體內容絕對定位,我覺得目前的寫法還是不錯,

這裏就不貼代碼了,結尾我會附上頁面鏈接,如果有好的建議,希望得到大神的指點。



JS方面,因爲不想到網上去下載別人的代碼,也沒時間去研究別人的好的實現方式,就自己隨便寫了個。

大致思路如下:

1.先實現勻速轉動:把執行順序存入數組,setTimeout重複調用,改變當前active位置(這裏的命名有點坑請忽略):

  1. var turnOrder = ['bg-3','bg-6','bg-9','bg-8','bg-7','bg-4','bg-1','bg-2'];

  2. var turnDom = [];

  3. for(var i = 0;i < turnOrder.length; i++){

  4.     turnDom.push($('.'+turnOrder[i]));

  5. }

  6. function goScroll(i){if(i==8)  i = 0;

  7.     turnDom[i].addClass('active');

  8.     setTimeout(function(){

  9.                     turnDom[i].removeClass('active');

  10.                     i++;

  11.                     goScroll(i);

  12.               },500);

  13. }

複製代碼


2.實現先加速、再減速、最後得出結果。

加速和減速需要用setTImeout的延遲控制,加速或者減速需要用延遲範圍來判斷。

爲方便理解,我先直接提代碼:

  1. $(document).on('click', '[data-action]', function(e){

  2.     var $this = $(this),

  3.         action = $this.data('action');

  4.     switch(action){

  5.         case 'start':

  6.             var speed = Math.floor(Math.random()*150) + 200;//350-200的範圍

  7.             goScroll(0,  speed, 0.8);

  8.             break;

  9.     }

  10. });


  11. function goScroll(i, speed, mul){

  12.     if(speed < 30) mul = 1.1;

  13.     if(i==8)  i = 0;

  14.     turnDom[i].addClass('active');

  15.     if(speed > 350) {//結束

  16.         turnDom[i].addClass('active');

  17.         scrolling = false;

  18.         openResult(i);

  19.         return;

  20.     }

  21.     setTimeout(function(){

  22.                     turnDom[i].removeClass('active');

  23.                     i++;

  24.                     speed = speed * mul;

  25.                     goScroll(i, speed, mul);

  26.               },speed);

  27. }

複製代碼


向自調函數goScroll傳入速度和乘數,speed隨機範圍我設置爲350-200毫秒,初始乘數是0.8,每次自調用speed和mul相乘,

這樣速度就慢慢變快了,當速度小於30毫秒,乘數爲1.1,速度慢慢就變慢了,當速度大於350時,停止並公佈結果。這裏的結果速度

一定要大於初始的隨機速度,否則會出現直接輸出結果。


到目前爲止還不完善,現在每一種的結果隨機機率並不平均,開始轉動後、也沒有阻止轉動按鈕。

還是直接貼代碼:

  1. var scrolling = false;//是否在轉

  2. var who;

  3. function setWho(){

  4.     who = Math.floor(Math.random()*9);

  5.     if(who == 8) who = 0;

  6. }


  7. $(document).on('click', '[data-action]', function(e){

  8.     var $this = $(this),

  9.         action = $this.data('action');

  10.     switch(action){

  11.         case 'start':

  12.             if(scrolling==true) return;

  13.             setWho();

  14.             var speed = Math.floor(Math.random()*150) + 200;//350-200的範圍

  15.             scrolling = true;

  16.             goScroll(0,  speed, 0.8);

  17.             break;

  18.     }

  19. });


  20. function goScroll(i, speed, mul){

  21.     if(speed < 30) mul = 1.1;

  22.     if(i==8)  i = 0;

  23.     turnDom[i].addClass('active');

  24.     if(speed > 350 && who==i) {//結束

  25.         turnDom[i].addClass('active');

  26.         scrolling = false;

  27.         openResult(i);

  28.         return;

  29.     }

  30.     setTimeout(function(){

  31.                     turnDom[i].removeClass('active');

  32.                     i++;

  33.                     speed = speed * mul;

  34.                     goScroll(i, speed, mul);

  35.               },speed);

  36. }

複製代碼

setWho用來確定結果(這裏給自己公司的軟件的概率+1,也就是九分之二的概率,不過分撒 O(∩_∩)O ...),isScrolling,確定是否正在轉動。


嗯,大致比較重要的邏輯就是這些了。當然還有部分都沒貼出來,如果需要,可以到實際項目裏去看,那麼來看看效果吧!》點這裏《


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章