最终效果以下bash
首先要给3D的元素准备一个“舞台”,由于页面自己是平面的,并不能展现出3D的效果。markdown
经过设置透视距离,就至关于把这个区域变成了一个能表现出近大远小的“3D舞台”,在其内部就能够去作3D效果了。动画
<div class="container"> </div>复制代码
.container { height: 500px; background: #eee; perspective: 500px; /* 设置透视距离 */ }复制代码
舞台搭好,演员上场,在container中加入一个盒子用来作正方体。设置宽高并定位到舞台中央,添加一个边框方便看到位置,设置transform-style属性,他的做用是容许box这个盒子的子元素进行3d变换spa
<div class="container"> <div class="box"> </div> </div>复制代码
.box { width: 200px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); border: 1px solid #000; transform-style: preserve-3d; }复制代码
正方体有六面,在box中添加六个div用来作他的六个面。3d
将六个面两两一组分为a, b , c三组方便描述:a1为离咱们最近的‘前面’,a2就是与a1相对离咱们最远的‘背面‘,b1为左侧的面,b2为右侧面,c1为顶部,c2为底部(参考文章顶部效果图)code
<div class="container"> <div class="box"> <div class="a1">a1</div> <!-- 前 --> <div class="a2">a2</div> <!-- 后 --> <div class="b1">b1</div> <!-- 左 --> <div class="b2">b2</div> <!-- 右 --> <div class="c1">c1</div> <!-- 上 --> <div class="c2">c2</div> <!-- 下 --> </div> </div>复制代码
将六个面都定位到box的正中心,设置宽高,并把文本居中orm
.box div {
width: 200px;
height: 200px;
position: absolute;
text-align: center;
line-height: 200px;
font-size: 30px;
}复制代码
此时的六个面至关因而重叠在x轴为0,y轴为0,z轴也为0的地方(x和y轴在屏幕上分别表现为左右和上下,z轴表示视觉上与咱们的距离远近)animation
上面咱们将每一个面的宽高都设置为200px,也就是相对的两个面之间的距离应该是200px。it
先来设置a1面,沿z轴向前移动100px,也就是向咱们靠近100px,同时给每一个面都加上一个透明的颜色方便看效果io
.a1 {
background: rgba(0, 0, 255, 0.5);
transform: translateZ(100px);
}复制代码
而后将a2面沿z轴向后移动100px,也就是相对咱们变远100px
.a2 {
background: rgba(0, 0, 255, 0.5);
transform: translateZ(-100px);
}复制代码
这样原本重叠的两个面,一个靠近100px,一个变远100px,两个面之间恰好200px距离
另外还应该将a2沿y轴旋转180度,也就是翻个面,将有字的这一面对着外面
.a2 {
background: rgba(0, 0, 255, 0.5);
transform: translateZ(-100px) rotateY(180deg);
}复制代码
此时已经看出3d效果生效了,由于近大远小的原理,虽然都是200px的长宽,离咱们更近的a1面比box的边框要大出一圈,而较远的a2则要小一圈
再来设置b1,b1是左侧的面,沿x轴左移100px, 而后沿y轴旋转-90度,将写字的正面朝向左侧
.b1 {
background: rgba(0, 255, 0, 0.5);
transform: translateX(-100px) rotateY(-90deg);
}复制代码
相对的,b2就是右移100px,旋转正90度
.b2 {
background: rgba(0, 255, 0, 0.5);
transform: translateX(100px) rotateY(90deg);
}复制代码
继续设置c1,c1是顶部的面,因此沿y轴上移100px,而后沿x轴旋转90度
.c1 {
background: rgba(255, 0, 0, 0.5);
transform: translateY(-100px) rotateX(90deg);
}复制代码
相对的,c2为底部,沿y轴下移100px,而后沿x轴旋转-90度
.c2 {
background: rgba(255, 0, 0, 0.5);
transform: translateY(100px) rotateX(-90deg);
}复制代码
此时这个3D的立方体已经完成了,为了能看出更明显的立体效果,再加一些变化
回到.box的样式,将边框去除,而后增长一点角度的倾斜
.box { width: 200px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg); /* border: 1px solid #000; */ transform-style: preserve-3d; }复制代码
最后添加一个旋转的动画
.box { width: 200px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg); /* border: 1px solid #000; */ transform-style: preserve-3d; animation: run 5s linear; animation-iteration-count: infinite; } @keyframes run { 0% { transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg) rotateY(0); } 50% { transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg) rotateY(180deg); } 100% { transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg) rotateY(360deg); } }复制代码