最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文教你用JavaScript制作個簡單的大轉(zhuǎn)盤游戲

 更新時間:2023年02月01日 15:52:33   作者:WhaleFE  
日常生活中,我們經(jīng)常會見到形形色色的抽獎活動,例如九宮格、大轉(zhuǎn)盤等等……本文就來教大家如何利用JavaScript制作個簡單的大轉(zhuǎn)盤游戲,感興趣的可以了解一下

背景

日常生活中,我們經(jīng)常會見到形形色色的抽獎活動,例如九宮格、大轉(zhuǎn)盤等等……以前都沒去深入考慮過,如果讓我去做這些小游戲,有哪些需要注意的事項,不試不知道,一試全是坑。正好最近有需求讓我做一個大轉(zhuǎn)盤游戲,那我也總結(jié)一下我的一些感想和經(jīng)驗。

一、開始前的準(zhǔn)備

首先就是確定產(chǎn)品需求,仔細(xì)一看,emmm,就是正常的一個大轉(zhuǎn)盤該有的東西,也沒啥特殊要求,唯一需要注意的是大轉(zhuǎn)盤的轉(zhuǎn)盤個數(shù)需要動態(tài)變化,即用戶設(shè)置多少獎品我就需要顯示多少塊區(qū)域。

既然要做大轉(zhuǎn)盤,不外乎三個步驟:

  • 畫出大轉(zhuǎn)盤
  • 把獎勵放上去
  • 讓大轉(zhuǎn)盤滾起來

這有啥難的,讓UI給我N個大轉(zhuǎn)盤背景圖,用戶設(shè)了多少獎品我就顯示對應(yīng)的背景圖... 哦,那樣圖片太多了,太麻煩了,也行吧... 那給我每個角度的扇形切圖一張,我轉(zhuǎn)一下不就出來了?... ?。坎唤o啊,那沒事了...(當(dāng)時的表情:冷靜分析...仔細(xì)思索...眉頭稍皺...好耶,我涼了呀)

二、畫出大轉(zhuǎn)盤

畫出大轉(zhuǎn)盤底圖部分就不必多說了,最難的部分在于把一個圓動態(tài)平均分成N份,并讓其在底圖上正常顯示。

我采用的方法是:用戶選擇了多少獎品(除2個獎品以外)我就在底圖上生成多少個寬高為底圖50%的div,目的是使每個div的右下角正好與底圖的中心點重合(這里有個坑,看下去就知道了),接著計算出對應(yīng)的圓心角 angle = 360 / n ,然后將其形變后以右下角為圓心旋轉(zhuǎn)對應(yīng)的角度拼成一個圓形。其中,形變和旋轉(zhuǎn)分別采用skew與rotate進(jìn)行實現(xiàn)。

注:

  • skew形變的角度為(90 - angle)deg
  • 如果要給每一塊加上漸變色的話,由于使用了skew形變,所以要顯示從左到右的漸變的效果,就需要從原先正方形的底邊變到右邊,即:background: linear-gradient('45deg', color1, color2)

如想看到更為細(xì)致的旋轉(zhuǎn)原理與demo,請點擊下方鏈接:

原理:https://www.w3cplus.com/css3/building-a-circular-navigation-with-css-transforms.html

demo:https://tympanus.net/Tutorials/CircularNavigation/interactivedemo/index.html

// 以下為N為8時,用純JS寫的一個測試demo
const n = 8; // 獎品數(shù)量
const circle = document.getElementById('circle');
for(let i = 0; i < n ; i++) {
    let item = document.createElement('div');
    item.className = `circle-item  circle-item-${n}`;
  	// n為2時,旋轉(zhuǎn)原點不在右下角改為底部中點,不需要skew形變,并且寬度不是50%而是100%
    if(n !== 2) {
      item.style=
        `transform: rotate(${i * angle}deg) skew(${90 - angle}deg);
         transform-origin: bottom right;
         background-color: ${colorList[i % colorList.length]}; //設(shè)置了每個格子的背景色,可以不設(shè)置
        `
    } else {
      item.style=
        `transform: rotate(${i * angle}deg);
         transform-origin: bottom;
         background-color: ${colorList[i % colorList.length]};
        `
    }
    circle.appendChild(item);
  }

本以為算解決了一個難題,直到我開始測試時,發(fā)現(xiàn) n == 3時出現(xiàn)了奇怪的現(xiàn)象:

好嘛,當(dāng) n == 3時,只設(shè)置50%的寬高顯然并不能填充滿整個背景圖。于是更改了當(dāng) n != 2時的樣式,改為寬高的60%,并設(shè)置其初始位置往左和上各平移10%。

.circle-item {
    border: 1px solid;
    height: 60%;
    width: 60%;
    position: absolute;
    left: -10%;
    top: -10%;
}

這樣乍一看是實現(xiàn)了平均分的問題,但仔細(xì)一想還有一個問題,那便是如果加上指針,指針永遠(yuǎn)是向上的,這樣看起來就怪怪的了,所以還需要將整個圖像進(jìn)行一個旋轉(zhuǎn),使初始指針默認(rèn)指向第一塊的中心位置。

旋轉(zhuǎn)角度為: (180 - angle) / 2。

三、把獎勵放上去

把獎勵放上去我想到兩種方法:

1、給每個獎勵生成一個與底部背景圖寬高一樣的正方形,然后將其對著中心點旋轉(zhuǎn)對應(yīng)的角度,將其一層層的放在底部背景圖上,即可完成。如下圖1所示,每一個正方形的大小都是與底部的背景圖的寬高是一樣的,只是將其進(jìn)行一個旋轉(zhuǎn)即可。(當(dāng)時以為不好顯示用戶抽中的扇形的部分,就沒采用這種方法,現(xiàn)在總結(jié)了才發(fā)現(xiàn)只需要將顏色填充在每個扇形中即可,不用填充在獎勵背景上,如下圖2所示,應(yīng)該也是能實現(xiàn)的)

圖1 每一層獎勵的范圍

圖2 總結(jié)時想到的實現(xiàn)方法

2、將獎勵直接放在每一個扇形區(qū)域里面,這樣我就直接修改每個扇形的背景色即可??瓷先ズ芎唵?,但實際開始操作了就發(fā)現(xiàn)了兩個問題:

  • 由于每一塊方格是skew形變出來的,獎勵直接放上去也會產(chǎn)生形變,需要將形變消除;
  • 獎勵居中顯示很麻煩,到現(xiàn)在我也沒有找到可以套用的公式;

第一點解決起來較為簡單,只需要將獎勵進(jìn)行一個反向的skew變形,旋轉(zhuǎn)角度為:-(90 – (angle / 2))deg。 第二點我到現(xiàn)在也沒有找到可以套用的公式,是每一種給他寫了一個樣式居中的。(還好產(chǎn)品只要求2-6的獎勵數(shù)量,不然可能就沒有這篇文章了,如果大家有好的方法也可以教教我)

兩種方法各有優(yōu)點: 方法一的優(yōu)點是不需要將獎勵進(jìn)行反向形變,怎么放上去就是怎么顯示; 方法二的優(yōu)點是獎勵與扇形不分離,我不需要額外的添加太多的div來實現(xiàn)獎勵正確顯示。

四、讓大轉(zhuǎn)盤滾起來

大轉(zhuǎn)盤到現(xiàn)在已經(jīng)完成了七七八八了,現(xiàn)在就差最后一步,讓其滾起來,點擊一次后滾動到對應(yīng)的位置然后停下。

采用的方法是給大轉(zhuǎn)盤添加一個旋轉(zhuǎn)的動畫,突然想起來 transform 中有 ease-in-out 這個過渡方法,即慢-快-慢的過渡效果,正好滿足我抽獎所需,于是直接采用了這種方法。

這里有個小細(xì)節(jié),由于大轉(zhuǎn)盤上本來就設(shè)置了transform的動畫效果,如果不想現(xiàn)在的旋轉(zhuǎn)動畫覆蓋掉之前的動畫,就需要單獨給動畫加上一層div,放在大轉(zhuǎn)盤底圖的外邊一層。

const circle = 8; // 旋轉(zhuǎn)圈數(shù)
let circleAdd = 0; // 抽獎次數(shù),每次抽完自增
let rotateAngle = 0; // 旋轉(zhuǎn)角度
let getPrizeIndex = 0; // 抽到的獎品的index

在定義完上面的內(nèi)容之后計算需要旋轉(zhuǎn)的角度: rotateAngle = circle * 360 * circleAdd - angle * getPrizeIndex,將這個rotateAngle放入需要旋轉(zhuǎn)的style中即可完成旋轉(zhuǎn)。

這里走了兩次彎路,一次是沒有加上circleAdd,然后就發(fā)現(xiàn)第一次大轉(zhuǎn)盤會正常旋轉(zhuǎn),第二次開始就不動或者只往前滾不到360°甚至往回滾!原因是因為每一次給style賦新值的時候,由于已經(jīng)有旋轉(zhuǎn)的角度了,他會在你設(shè)置新的旋轉(zhuǎn)角度的時候從上一個旋轉(zhuǎn)角度開始執(zhí)行動畫。

第二次是我在寫計算公式的時候,想當(dāng)然的把上面的“-”寫成了“+”,想的是我先旋轉(zhuǎn)了circle * circleAdd圈,然后還要滾 getPrizeIndex 個獎勵就是我需要顯示的獎勵,然后發(fā)現(xiàn)指針指向的獎勵與我需要選擇的 getPrizeIndex 并不相符。仔細(xì)檢查了才發(fā)現(xiàn)雖然大轉(zhuǎn)盤旋轉(zhuǎn)是順時針方向的,但是獎勵的讀取方向應(yīng)該是逆向的,所以應(yīng)該是“-”而不是“+”。

個人總結(jié)

在寫這個大轉(zhuǎn)盤之前我一直沒覺得大轉(zhuǎn)盤這種小游戲有多難,無非就是轉(zhuǎn)一下,然后獎勵顯示一下,這有啥難的?寫了之后才發(fā)現(xiàn)自己真的too young too simple,一個簡單的大轉(zhuǎn)盤里面也有不少的數(shù)學(xué)的公式需要學(xué)習(xí)計算,真的是走一步卡半天,一步一個坑。還是需要多多學(xué)習(xí)!

到此這篇關(guān)于一文教你用JavaScript制作個簡單的大轉(zhuǎn)盤游戲的文章就介紹到這了,更多相關(guān)JavaScript大轉(zhuǎn)盤游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于JavaScript實現(xiàn)智能右鍵菜單

    基于JavaScript實現(xiàn)智能右鍵菜單

    這篇文章主要介紹了基于JavaScript實現(xiàn)智能右鍵菜單的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 在b/s開發(fā)中經(jīng)常用到的javaScript技術(shù)

    在b/s開發(fā)中經(jīng)常用到的javaScript技術(shù)

    在b/s開發(fā)中經(jīng)常用到的javaScript技術(shù)...
    2006-08-08
  • 原生JavaScript實現(xiàn)頁面滾動監(jiān)聽的方法步驟

    原生JavaScript實現(xiàn)頁面滾動監(jiān)聽的方法步驟

    滾動監(jiān)聽事件一般網(wǎng)頁中的返回頂部按鈕都是通過滾動監(jiān)聽事件來實現(xiàn)的,本文給大家介紹了原生JavaScript實現(xiàn)頁面滾動監(jiān)聽的方法步驟,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2025-03-03
  • AngularJS+Bootstrap實現(xiàn)多文件上傳與管理

    AngularJS+Bootstrap實現(xiàn)多文件上傳與管理

    這篇文章主要為大家詳細(xì)介紹了AngularJS+Bootstrap實現(xiàn)多文件上傳與管理,對上傳文件進(jìn)行加載與刪除操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 超全面的JavaScript開發(fā)規(guī)范(推薦)

    超全面的JavaScript開發(fā)規(guī)范(推薦)

    作為一名開發(fā)人員(WEB前端JavaScript開發(fā)),不規(guī)范的開發(fā)不僅使日后代碼維護(hù)變的困難,同時也不利于團(tuán)隊的合作,通常還會帶來代碼安全以及執(zhí)行效率上的問題。本文就主要介紹了關(guān)于Javascript的命名規(guī)范、注釋規(guī)范以及框架開發(fā)的一些問題,需要的朋友可以參考學(xué)習(xí)。
    2017-01-01
  • javascript搜索框效果實現(xiàn)方法

    javascript搜索框效果實現(xiàn)方法

    這篇文章主要介紹了javascript搜索框效果實現(xiàn)方法,可實現(xiàn)顯示默認(rèn)提示文字的搜索框效果,非常簡單實用,需要的朋友可以參考下
    2015-05-05
  • 使用JavaScript在html文檔內(nèi)添加新的元素節(jié)點

    使用JavaScript在html文檔內(nèi)添加新的元素節(jié)點

    這篇文章主要介紹了使用JavaScript在html文檔內(nèi)添加新的元素節(jié),主要打方式就是動態(tài)的改變原有html文檔結(jié)構(gòu),下文詳細(xì)介紹內(nèi)容需要的可以參考一下
    2022-02-02
  • js控制不同的時間段顯示不同的css樣式的實例代碼

    js控制不同的時間段顯示不同的css樣式的實例代碼

    這篇文章介紹了js控制不同的時間段顯示不同的css樣式的實例代碼,有需要的朋友可以參考一下
    2013-11-11
  • 微信小程序使用canvas繪制鐘表

    微信小程序使用canvas繪制鐘表

    這篇文章主要為大家詳細(xì)介紹了微信小程序使用canvas繪制鐘表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 利用JS實現(xiàn)簡單的瀑布流加載圖片效果

    利用JS實現(xiàn)簡單的瀑布流加載圖片效果

    今天學(xué)習(xí)了一個瀑布流加載效果,很多網(wǎng)站都有瀑布流效果,下面通過本文給大家分享利用JS實現(xiàn)簡單的瀑布流加載圖片效果,需要的朋友參考下吧
    2017-04-04

最新評論

开原市| 宜兴市| 柳江县| 金华市| 梁平县| 延庆县| 乌恰县| 紫阳县| 万荣县| 化德县| 中西区| 称多县| 思南县| 武定县| 平南县| 登封市| 满城县| 乐山市| 交口县| 桐梓县| 瑞安市| 宽城| 东源县| 东丰县| 如皋市| 贡嘎县| 县级市| 昌吉市| 惠安县| 永济市| 葵青区| 营口市| 涟水县| 平远县| 吴忠市| 黄石市| 吴堡县| 郎溪县| 平顶山市| 景谷| 都昌县|