用css制作魔方
使用CSS制作3D魔方
通过CSS的3D变换和动画特性可以创建一个动态的魔方效果。以下是实现步骤:
HTML结构

<div class="cube">
<div class="face front">1</div>
<div class="face back">2</div>
<div class="face right">3</div>
<div class="face left">4</div>
<div class="face top">5</div>
<div class="face bottom">6</div>
</div>
CSS样式
body {
perspective: 1000px;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: #f0f0f0;
}
.cube {
position: relative;
width: 200px;
height: 200px;
transform-style: preserve-3d;
animation: rotate 10s infinite linear;
}
.face {
position: absolute;
width: 100%;
height: 100%;
border: 2px solid #000;
display: flex;
justify-content: center;
align-items: center;
font-size: 40px;
font-weight: bold;
opacity: 0.8;
}
.front {
background: red;
transform: translateZ(100px);
}
.back {
background: orange;
transform: translateZ(-100px) rotateY(180deg);
}
.right {
background: green;
transform: translateX(100px) rotateY(90deg);
}
.left {
background: blue;
transform: translateX(-100px) rotateY(-90deg);
}
.top {
background: yellow;
transform: translateY(-100px) rotateX(90deg);
}
.bottom {
background: white;
transform: translateY(100px) rotateX(-90deg);
}
@keyframes rotate {
from { transform: rotateX(0) rotateY(0); }
to { transform: rotateX(360deg) rotateY(360deg); }
}
制作多阶魔方
要创建3x3x3魔方,需要扩展HTML结构为27个小立方体:

<div class="rubik-cube">
<!-- 第一层 -->
<div class="layer">
<!-- 第一行 -->
<div class="row">
<div class="cubie front-top-left"></div>
<div class="cubie front-top-center"></div>
<div class="cubie front-top-right"></div>
</div>
<!-- 共9个div组成一层,三层共27个 -->
</div>
</div>
CSS关键点
- 使用
transform-style: preserve-3d保持3D空间 - 为每个小立方体设置正确的3D位置
- 通过
translate3d精确控制每个面的位置 - 添加悬停或点击交互效果
添加交互控制
通过JavaScript可以添加鼠标控制旋转效果:
let cube = document.querySelector('.cube');
let isDragging = false;
let startX, startY;
cube.addEventListener('mousedown', (e) => {
isDragging = true;
startX = e.clientX;
startY = e.clientY;
});
document.addEventListener('mousemove', (e) => {
if (!isDragging) return;
const diffX = e.clientX - startX;
const diffY = e.clientY - startY;
cube.style.transform = `rotateX(${-diffY}deg) rotateY(${diffX}deg)`;
});
document.addEventListener('mouseup', () => {
isDragging = false;
});
性能优化建议
- 减少不必要的重绘和回流
- 使用
will-change: transform提升动画性能 - 考虑使用CSS变量管理颜色
- 对于复杂魔方,可以使用WebGL或Three.js实现更高效渲染
完整实现可能需要组合多个CSS3D变换和精心计算的位置参数,上述代码提供了基础框架,可以根据需要扩展更多细节和功能。






