前言
今天和小伙伴们分享一下如何使用css实现正方体。文章会涉及到一些平时不常用到的css属性,分别是:perspective,perspective-origin,transform-style。
- perspective:指定了观察者与 z=0 平面的距离,使具有三维位置变换的元素产生透视效果。 z>0 的三维元素比正常大,而 z<0 时则比正常小。
- perspective-origin:指定了观察者的位置,用作 perspective属性的消失点。
- transform-style:设置元素的子元素是位于 3D 空间中还是平面中。
结构
<div class="container">
<div class="cube">
<div class="back">back</div>
<div class="down">down</div>
<div class="up">up</div>
<div class="right">right</div>
<div class="left">left</div>
<div class="front">front</div>
</div>
</div>
我采用的方法是利用定位将正方体6个面重叠。你也可以将dom结构设计成下图展示的11种正方体平面图的其中一种。
样式
* {
margin: 0;
padding: 0;
}
.container {
perspective: 800px;
perspective-origin: center -200px;
}
.cube {
position: relative;
width: 150px;
height: 150px;
margin: calc(50vh - 75px) auto;
/* 设置子元素位于3D空间中 */
transform-style: preserve-3d;
transform: rotateY(-45deg);
}
/* 重叠在一起 */
.cube div {
position: absolute;
top: 0;
left: 0;
width: 150px;
height: 150px;
line-height: 150px;
text-align: center;
font-size: 30px;
color: #FFF;
}
.front {
background: rgba(255, 0, 0, 0.5);
animation: front .5s ease .5s forwards;
}
.left {
background: rgba(255, 251, 0, 0.5);
animation: left .5s ease 1.5s forwards;
}
.right {
background: rgba(72, 255, 0, 0.5);
animation: right .5s ease 2s forwards;
}
.up {
background: rgba(0, 195, 255, 0.5);
animation: up .5s ease 2.5s forwards;
}
.down {
background: rgba(255, 0, 221, 0.5);
animation: down .5s ease 3s forwards;
}
.back {
background: rgba(255, 0, 221, 0.5);
animation: back .5s ease 1s forwards;
}
/* 分解动画 */
@keyframes front {
0% {
transform: translateZ(0);
}
100% {
transform: translateZ(75px);
}
}
@keyframes left {
0% {
transform: translateX(0) rotateY(0);
}
100% {
transform: translateX(-75px) rotateY(-90deg);
}
}
@keyframes right {
0% {
transform: translateX(0) rotateY(0);
}
100% {
transform: translateX(75px) rotateY(90deg);
}
}
@keyframes up {
0% {
transform: translateY(0) rotateX(0);
}
100% {
transform: translateY(-75px) rotateX(90deg);
}
}
@keyframes down {
0% {
transform: translateY(0) rotateX(0);
}
100% {
transform: translateY(75px) rotateX(-90deg);
}
}
@keyframes back {
0% {
transform: translateZ(0);
}
100% {
transform: translateZ(-75px);
}
}