css 实现正方体

2,403 阅读1分钟

前言

今天和小伙伴们分享一下如何使用css实现正方体。文章会涉及到一些平时不常用到的css属性,分别是:perspectiveperspective-origintransform-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种正方体平面图的其中一种。

image.png

样式

* {
    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);
    }
}

Demo:jsdemo.codeman.top/html/cube.h…