html css做骰子,纯 CSS 制作摇骰子(随机结果)

大家好,我是 Steven。

这一期,我们会做一个摇骰子的效果。等等,这个很容易?那就挑战一下,不用 JavaScript,只用 CSS 去制作,我们来看看怎么实现。

edd57963ae52f669fce9edb44c8fcf25.gif

素材准备

首先,我们要准备一张图片:

5a63b7a0e945e46d53f52a9800e85b9c.png

里面是骰子从一到六的面板,然后为了等下转骰子的时候看上去随机一点,这里我将一到六的顺序掉乱一下。

HTML 的部分

打开 CodePen 编辑器,在 HTML 的部分新增一个

,class 是 dice。

87a9c4215c3343033d14ef314f3ef891.png

CSS 的部分

然后到 CSS 的部分,新增 body 选择器,用 Flexbox 的方法将内容上下左右居中。然后新增 .dice 选择器,设定刚才我们准备好的骰子图片,宽度和高度设定为 366px,由于我们的的骰子图片是横向的,所以 background-position 设定为 0% 100%。

13a32ec67740220582804708e43e6299.png

例如我们把 x 的值改成 100%:

5cfc83035e6dd5bd5ed194631aaf1d36.png

就会换成最后一个号码(四)先把他改回 0%。

好了,那我们要如何做到摇骰子的动作呢?新增 @keyframes random 定义一个动画,from 的区块把 background-position 设定为 0% 100%,而 to 的区块把 background-position 设定为 100% 100%。

8eff5ac02a9c2c8dd355cfe72a01c30f.png

由于 from 区块里面的定义和 .dice 里面的定义相同,所以在这里可以省略 from 区块,然后设定动画 animation,设定为 .2s,加速度是线性 linear,动画名称是 random,重覆次数是无限 infinite。

02044154f0220e570ce8780c8e7ccaf9.gif

现在可以看到骰子在横向方向不停在转,但是这个不像摇骰子的效果,所以关键在这里,animation 可以指定进行的格数有多少,把加速度 linear 换成 steps(5, start)(更正:steps(6, jump-none),这样才不会漏掉一个,谢谢网友的反馈),就可以看到骰子在一个一个的转了。

5def18bd82b7332fef2690a88a3ca346.gif

好了,那下一步就是处理摇骰子结果的逻辑。在不用 JavaScript 的情况下,我们可以通过表单元素 checkbox 实现一开一关的逻辑。

调整一下 HTML 的部分,加入一个 checkbox,id 是 dice。再新增一个 标签,for 等于 checkbox 的 id,dice。再把 .dice 这个

包起来:

af780b13f6d26d94ec504feefee5565b.png

这样我们在点击骰子的同时,就可以触发到 checkbox 的点击。

在 CSS 的部分,新增 #dice 选择器,将 display 设定为 none,隐藏这个 checkbox。新增 #dice:checked + label .dice 选择器,即是当 checkbox 是勾选的状态的时候,控制后面的 label 里面的 .dice 的样式。

那我们在这里可以做什么呢?把 animation 暂停就可以了,animation-play-state 设定为 paused。

d01cfb06f67f8564080407a601a916dd.png

现在随机结果的效果已经实现了。

再在摇骰子的时候,在骰子的上面加一层装饰。

加入 .dice::before 选择器,将 content 设定为问号,背景颜色设定为 80% 透明度的白色。宽度和高度继承自父元素,设定为 inherit,display 设定为 flex,justify-content 与 align-items 设定为 center。

1990850e2752494ac08e310187316a58.png

文字大小设定为大一点,320px,字体 font-family 是祖传的 Helvetica,然后要把背景变成模糊,加入 backdrop-filter,设定为 blur(20px),同时加入 -webkit 的版本,再设定圆角 border-radius 为 60px。

ab9c6f029c14fd411f9b366dfc9836d4.png

最后,要在显示骰子的结果时,把问号这一层隐藏。加入 #dice:checked + label .dice::before 选择器,将 display 设定为 none。

a5527628ffba57db1d4f712228e3134d.png

我们来看看这个案例的完成效果

edd57963ae52f669fce9edb44c8fcf25.gif

以上,就是这期要介绍的全部内容。

你的支持是我的动力,请关注 CodingStartup 起码课,我们一起加油!

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。以下是一个用 JavaScript、HTMLCSS 编写的骰子HTML 代码: ``` <div class="dice"> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> </div> ``` CSS 代码: ``` .dice { width: 100px; height: 100px; border: 1px solid black; border-radius: 10px; display: flex; flex-wrap: wrap; justify-content: space-between; padding: 10px; } .dot { width: 20px; height: 20px; border-radius: 50%; background-color: black; margin: 5px; display: none; } .dot.active { display: block; } @keyframes roll { % { transform: rotateX(deg) rotateY(deg) rotateZ(deg); } 100% { transform: rotateX(720deg) rotateY(720deg) rotateZ(720deg); } } ``` JavaScript 代码: ``` const dice = document.querySelector('.dice'); const dots = dice.querySelectorAll('.dot'); function rollDice() { dice.classList.add('rolling'); setTimeout(() => { dice.classList.remove('rolling'); const num = Math.floor(Math.random() * 6) + 1; for (let i = ; i < dots.length; i++) { dots[i].classList.remove('active'); } switch (num) { case 1: dots[2].classList.add('active'); break; case 2: dots[].classList.add('active'); dots[4].classList.add('active'); break; case 3: dots[].classList.add('active'); dots[2].classList.add('active'); dots[4].classList.add('active'); break; case 4: dots[].classList.add('active'); dots[1].classList.add('active'); dots[3].classList.add('active'); dots[4].classList.add('active'); break; case 5: dots[].classList.add('active'); dots[1].classList.add('active'); dots[2].classList.add('active'); dots[3].classList.add('active'); dots[4].classList.add('active'); break; case 6: dots[].classList.add('active'); dots[1].classList.add('active'); dots[2].classList.add('active'); dots[3].classList.add('active'); dots[4].classList.add('active'); dots[5].classList.add('active'); break; } }, 200); } dice.addEventListener('click', rollDice); ``` 这个骰子可以通过点击来掷骰子,每次掷骰子随机出现 1 到 6 的数字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值