谁懂啊!做小程序或 App 时,想加个抽奖、桌游类互动功能,一个酷炫的 3D 骰子真的能拉满氛围感✨。今天就给大家分享一个我珍藏的 Uniapp 骰子组件,不仅能直接用,还能随心定制样式,新手也能轻松拿捏。咱们不搞晦涩术语,就像拆玩具一样,一步步摸清它的构造!
一、先看效果
先放个“成品预告”,让大家有直观感受:



不管是做节日抽奖、线上桌游,还是给小程序加个趣味互动模块,这个组件都能直接“拎包入住”。
二、组件结构分析
一个能跑的骰子组件,核心就三部分:“骨架”(模板)、“大脑”(脚本)、“皮肤”(样式)。咱们逐个拆解,新手也能看明白。
1、模板
骰子是正方体,有 6 个面,模板的作用就是把这 6 个面“拼”起来,再留好接口让样式和数据能联动。
1 | <template> |
这里有个小细节:用 v-for 循环生成 6 个面,而不是写 6 遍重复代码,既简洁又方便后续修改。就像做玩具时用模具批量做零件,比手工一个个画省事多了
2、脚本
脚本是骰子的“大脑”,负责控制它什么时候滚、滚多少圈、最后显示哪个面。咱们挑最关键的功能讲,避开复杂逻辑。完整脚本代码:
1 | <script> |
①、自定义参数
组件开头的 props 就是“自定义开关”,想改骰子样式,改这里的参数就行,不用动核心代码
1 | props: { |
举个例子:想做一个抽奖骰子,只需把 faces 改成 [‘一等奖’, ‘二等奖’, ‘谢谢参与’, ‘三等奖’, ‘谢谢参与’, ‘谢谢参与’],瞬间变身抽奖工具,是不是超方便?
②、滚动核心:startRolling 方法
这是让骰子滚动的“核心指令”,逻辑很像玩真骰子:先晃几圈,再随机停在一个面。关键步骤拆解:
- 防重复滚动:用
isRolling标记状态,避免手快连续点,导致骰子“卡壳”; - 随机定结果:用
getRandomResult随机选一个面(0-5 对应 6 个面),相当于骰子落地后的结果; - 加滚动动画:让骰子绕 X/Y/Z 轴转 3-5 圈(随机圈数,避免呆板),最后精准停在目标面;
- 结果同步:动画结束后,通过
$emit把结果传给父组件,比如弹窗显示“恭喜中一等奖”。
这里还有个小优化:滚动结束后会加轻微抖动,就像骰子落地时的惯性晃动,细节拉满!
3、样式
光有骨架和大脑还不够,样式能让扁平的代码变成立体骰子,核心就两个 CSS 属性。完整代码如下:
1 | <style> |
简单说:perspective 让我们看骰子时有“远近感”,transform-style: preserve-3d 让 6 个面各自待在自己的 3D 位置,不会扁平重叠。少了这两个属性,骰子就会变成“一张贴在一起的纸片”,毫无立体感。
三、使用示例
讲完原理,最实用的部分来了!把组件引入项目,3 步就能用:
第一步:引入组件
把骰子组件文件(比如 dice.vue)放在项目的 components 文件夹里,在父组件中引入并注册:
1 |
|
第二步:页面中使用
像用普通标签一样写在模板里,还能自定义参数:
1 |
|
第三步:写触发和结果逻辑
1 |
|
搞定!点击按钮,红色的抽奖骰子就会翻滚起来,结束后弹窗显示结果,成就感直接拉满 🎉。
扩展:进阶玩法
3个实用扩展玩法
- 加音效:滚动开始时播放“摇晃声”,结束时播放“叮”的提示音,沉浸感翻倍;
- 结果记录:用组件里的
history数组,记录每次滚动结果,做个“抽奖记录”面板; - 控制滚动时长:把
duration改成 props 参数,想让骰子滚得久一点就调大数值(比如 3000 就是 3 秒)。
四、最后
一个效果生动的 3D 骰子,能让抽奖、游戏等互动场景的体验感大幅提升。上面拆解的所有逻辑,都整合在各自的结构开头的源码里了。大家可以直接复制源码到项目中,根据自己的需求改一改 faces、颜色、大小,就能快速实现一个酷炫的 3D 骰子。
如果你喜欢这个组件,或者有更好的实现思路,欢迎在评论区分享你的想法~
我超好奇大家会用这个组件做什么场景~ 是做节日抽奖小程序,还是搭线上桌游局?或者有更脑洞大开的玩法?快来评论区晒出你的需求和创意!
如果实操中遇到样式错乱、滚动异常等问题,也欢迎随时留言提问,我会逐一回复帮你排查;觉得有用的话,别忘了点赞收藏,后续还会分享更多实用组件,咱们评论区见~ ✨