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';
  }
}

硬币翻转模拟器现在可以使用了。

参见演示