用 CSS 打造 3D 摇骰子:从 0 到 1 的立体视觉魔法

🌌 引子:骰子的 3D 幻想

上周和朋友吃饭的时候,想玩摇骰子,发现店里没有骰盅,于是就想看看有没有现成的电子摇骰子,发现确实有,但是手机摇骰子小程序广告满天飞。突发奇想:不如用 CSS 实现一个「无广告版」3D 骰子?毕竟前端的魔法,就是让 2D 屏幕绽放 3D 魅力 ------ 今天就带你揭开这个视觉魔术的面纱。微信小程序「骰友局」可以在线体验摇骰子的效果

功能实现

🔍 3D 世界的入场券

CSS 的transform-style: preserve-3d是关键代码,它告诉浏览器:子元素在3D 空间中展开即在应用3D变换时,确保元素及其子元素在三维空间中正确渲染,我们先搭建3D舞台:

🧭 3D 坐标系初体验

再来理解一下,怎么在2d平面实现3d的立体效果呢?首先我们先来看看3d的坐标体系图。

想象你的屏幕是 XY 平面(途中蓝色的网格面),Z 轴垂直指向你。每个面需要通过translateZ(前后移动)和旋转(绕轴翻转)归位:

旋转方式 移动距离 视觉效果
无旋转 translateZ(50px) 正对观众
无旋转 translateZ(-50px) rotateY(180deg) 藏在后方(文字转正)
rotateY(-90deg) translateX(-50px) 左侧面转向观众
rotateY(90deg) translateX(50px) 右侧面转向观众
rotateX(-90deg) translateY(-50px) 顶面朝下
rotateX(90deg) translateY(50px) 底面朝上

💡 关键点 :所有面的基准点(transform-origin)默认在中心,旋转时会绕中心点转动。

我们来实现一个正方体,首先需要一个父类设置子类3d效果,然后通过相对定位实现六个面。

🧩 第一幕:构建 3D 舞台

html 复制代码
<div class="dice">
  <!-- 六个面:前/后/左/右/上/下 -->
  <div class="face front">1</div>
  <div class="face back">2</div>
  <div class="face left">3</div>
  <div class="face right">4</div>
  <div class="face top">5</div>
  <div class="face bottom">6</div>
</div>

<style>
.dice {
  width: 100px;
  height: 100px;
  position: relative;
  transform-style: preserve-3d; /* 开启3D空间 */
  perspective: 600px; /* 模拟人眼距离,值越小立体感越强 */
  margin: 50px auto;
}
</style>

🎨 第二幕:六个面的立体雕刻

盒子实现了,我们来一个个面来实现,以50px大小为准实现

首先是front面,这个就没有什么特别的了,就是正常的一个矩形效果,我们来看看back面,同样也是一个矩形,只需要沿着Z轴往后平移transform: translateZ(-50px);

明明往后移了,为什么重叠了?难道理论知识不对?其实这是因为人的视角是水平直视前方的,所以我们只需要给盒子(box)旋转个角度看看

transform: rotateX(-45deg) rotateY(45deg);

可以看到效果实现了!那么我们照着理论知识接着实现其他面。

接着先实现left面 ,它则需要以y轴为基准线进行旋转90度。

transform: rotateY(90deg);

同理right面也是一样旋转,只需要调整一下x轴的位置即可

最后来实现top面 ,它则需要以X轴为基准线进行旋转90度。

transform: rotateX(90deg)

同理也可得出bottom面

下面是一个正方体的完整例子

骰子

正方体实现了 那么只需要给每个面加上点不就可以实现骰子了?

比如1点

js 复制代码
<div class="front">
    <div class="dot"></div>
</div>

.dot {
  position: absolute;
  top: 17px;
  left: 17px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: red;
}

原理都是一样 以此类推。最终实现效果如下

🌟 总结:从代码到游戏的蜕变

通过这篇教程,我们不仅实现了 3D 骰子,更掌握了 CSS 3D 变换的核心原理。最终我将这个效果扩展成微信小程序「骰友局」,支持多人对战 ------ 这就是前端的魅力:用代码创造真实的互动体验。

相关推荐
9172 分钟前
无缝轮播图实现:从原理到实践
前端
我爱鸿蒙开发11 分钟前
🥇聊聊鸿蒙的一端开发,多端部署。
前端·开源·harmonyos
前端付杰12 分钟前
深入理解 IndexedDB:索引与游标查询的高效应用
前端·javascript·indexeddb
best66612 分钟前
前端项目SVG展示方案总结,以Vue3+TS为例
前端
啊花是条龙12 分钟前
Angular 开发指南:组件、数据绑定、指令、服务、HTTP、路由和表单
前端·angular.js
小桥风满袖14 分钟前
Three.js-硬要自学系列12 (各种贴图的综合应用)
前端·css·three.js
火星思想15 分钟前
前端自适应方案全面解析:打造多端适配的现代网页
css
溪饱鱼15 分钟前
秒杀传统数据库!Cloudflare D1 + Drizzle组合拳,高并发高可用,让我们的成本爆降10倍 - D1
前端·后端
Dgua16 分钟前
小程序开发background-image不显示的问题
前端·抖音小程序
作曲家种太阳17 分钟前
第二章节 响应式原理介绍-【手摸手带你实现一个vue3】
前端