HOWTO · JavaScript
JavaScript 中的硬幣翻轉模擬器
本教程將幫助你使用 JavaScript、HTML 和 CSS 模擬硬幣翻轉。
本教程將演示如何使用 JavaScript 和 HTML 製作硬幣翻轉模擬器。還包括基於 CSS 的視覺硬幣翻轉。
在 JavaScript 中使用 Math.random() 模擬硬幣翻轉
內建的 Math.random() 方法可以在 JavaScript 中模擬擲硬幣。它會生成一個介於 0 和 0.99999999 之間的隨機數,因此你可以使用生成的數字來確定它會產生正面還是反面。
翻轉的斷點在 0.50,如下圖:
let number = Math.random();
if (number < 0.5) {
console.log('HEAD');
} else {
console.log('TAIL');
}
當值在 0 和 0.49999999999999999 之間時,結果將是一個尾巴。
使用 HTML 和 JavaScript 建立硬幣翻轉模擬器
你可以使用上面的程式碼製作一個硬幣翻轉模擬器,使用 HTML 按鈕觸發 JavaScript 程式碼並在 div 元素中顯示結果。
首先,在你的 HTML 元素中,建立一個按鈕和一個具有 id 屬性的 div:
<body>
<button id="flp" type="button">Flip the coin</button>
<div id="rslt"></div>
</body>
之後,向按鈕元素新增一個 script 標籤,併為其附加一個事件偵聽器以偵聽點選事件。當按鈕被按下時,JavaScript 將呼叫 fpClick() 函式,如下所示:
<body>
<button id="flp" type="button">Flip the coin</button>
<div id="rslt"></div>
<script>
let button = document.getElementById("flp");
function fpClick() {
}
button.addEventListener("click", fpClick);
</script>
</body>
使用 Math.random() 方法,fpClick() 函式將執行程式碼以模擬擲硬幣。HTML 正文中 div 元素的內容將被設定為結果:
<body>
<button id="flp" type="button">Flip the coin</button>
<div id="rslt"></div>
<script>
let button = document.getElementById("flp");
let result = document.getElementById("rslt");
function fpClick(event) {
let num = Math.random();
if (num < 0.5) {
result.innerHTML = "You got Head";
} else {
result.innerHTML = "You got Tail";
}
}
button.addEventListener("click", fpClick);
</script>
</body>
你可以在此處觀看演示。
你還可以製作一個模擬器,它會根據使用者的輸入翻轉多達 x 次。在下一節中,我們將討論如何做到這一點。
使用 HTML 和 JavaScript 為 X 次建立硬幣翻轉模擬器
你需要建立一個 HTML 輸入元素來接受使用者的輸入,以便根據使用者的需要多次翻轉硬幣:
<body>
<div>
<label for="qt">How many times to fli?</label>
<input type="number" id="qt" min="1" value="1" />
</div>
<button id="flp" type="button">Flip the coin</button>
<div id="rslt"></div>
</body>
然後,更新 fpClick() 函式以獲取輸入標籤的值並使用 for 語句迴圈擲硬幣程式碼。
翻轉的結果必須包含在一個 <p> 標記中並儲存在一個變數中(在下面的示例中命名為 score)。收集完模擬器的所有結果後,將其指定為 div 元素的內容。
檢視 fpClick() 函式的以下程式碼:
let button = document.getElementById('flp');
let result = document.getElementById('rslt');
function fpClick(event) {
let qty = document.getElementById('qt').value;
let score = '';
for (let i = 0; i < qty; i++) {
let num = Math.random();
if (num < 0.5) {
score += '<p>You got Head</p>';
} else {
score += '<p>You got Tail</p>';
}
}
result.innerHTML = score;
}
button.addEventListener('click', fpClick);
你現在將獲得與你在輸入元素中鍵入的數字一樣多的結果。
點選這裡檢視演示。
使用 CSS 動畫、HTML 和 JavaScript 建立硬幣翻轉模擬器
要使用 CSS 製作硬幣翻轉模擬器,你需要使用該語言設定樣式和動畫的三個 div 元素。
首先,在新的 HTML 正文標記中編寫以下程式碼:
<body>
<h1>Click on the coin below to flip</h1>
<div id="coin_side">
<div class="side_head"></div>
<div class="side_tail"></div>
</div>
</body>
三個 div 元件代表瀏覽器中的硬幣,父 div 硬幣用作硬幣頭部和尾部的容器。
接下來,編寫以下 CSS 程式碼來設定硬幣的樣式:
h1 {
text-align: center;
}
#coin {
position: relative;
margin: 0 auto;
width: 100px;
height: 100px;
cursor: pointer;
}
.side {
width: 100%;
height: 100%;
border-radius: 50%;
position: absolute;
backface-visibility: hidden;
}
.head {
background-color: green;
z-index: 10;
}
.tail {
background-color: blue;
transform: rotateX(-180deg);
}
#coin 樣式將你的視覺硬幣放置在 HTML 頁面的中心,並使其寬和高為 100 畫素。游標也會變成一個指標,表示可以點選。
通過將所有邊的邊框半徑設定為 50%,.side 樣式會將代表硬幣邊的兩個 div 元件變成一個圓形。backface-visibility 屬性被隱藏以防止在旋轉時背面可見。
硬幣的每一面都由頭部和尾部樣式著色。頭部的顏色為黃色,而尾部的顏色為紅色。
head 類的 z-index 屬性設定為 10 以將其置於 tail 類之上。tail 類的 transform: rotateX() 屬性將是 -180deg 以與旋轉動畫對齊。
現在讓我們使用@keyframes 製作 CSS 動畫,因為 div 元素已被設計為視覺硬幣。
@keyframes resultHead {
from {
transform: rotateX(0);
}
to {
transform: rotateX(1800deg);
}
}
@keyframes resultTail {
from {
transform: rotateX(0);
}
to {
transform: rotateX(1980deg);
}
}
該規則將確定動畫的初始條件。上面的程式碼將變換屬性設定為 rotate(0),確保翻轉總是從可見的頭部開始。
如果翻轉的結果是正面,硬幣將翻轉 1800 度。因為一次翻轉是 360 度,產生了五個翻轉動畫。
當翻轉結果是尾巴時,硬幣會旋轉五次,然後旋轉 180 度以顯示尾巴的一面。這就是為什麼尾部類的 rotateX 值設定為 -180 度的原因。
如果指定了 CSS 動畫規則,你可以使用動畫屬性從 CSS 類中呼叫它們:
.flipHead {
animation: resultHead 2s ease-out forwards;
}
.flipTail {
animation: resultTail 2s ease-out forwards;
}
至此,我們完成了模擬器的 CSS 程式碼。處理翻轉的指令碼是唯一剩下的東西。
將事件監聽器新增到 div id='coin_side' 並從中呼叫 fpClick() 函式以在單擊時翻轉硬幣。fpClick() 函式和之前一樣,將使用 Math.random() 方法來獲取翻轉結果。
將設定硬幣 div 的 className 屬性,而不是將結果傳送到 HTML 元素:
let coin = document.getElementById('coin_side');
coin.addEventListener('click', fpClick);
function fpClick() {
var flipResult = Math.random();
if (flipResult < 0.5) {
coin.className = 'flipHead';
} else {
coin.className = 'flipTail';
}
}
硬幣翻轉模擬器現在可以使用了。
參見演示。