CSS 利用3D写一个魔方模型

1,705 阅读2分钟

CSS 利用3D写一个魔方模型

css可以模拟3d效果,需要配合透视使用,利用一些平面通过平移和旋转可以得到我们想要的3d效果。不过在平面的基础上需要添加立体呈现。

1. 构建html骨架

  • 魔方一共有6个面
  • 魔方6个面需要大盒子包裹,方便立体呈现和透视
  <body>
            <div class="box">
                <div class="space1"></div>
                <div class="space2"></div>
                <div class="space3"></div>
                <div class="space4"></div>
                <div class="space5"></div>
                <div class="space6"></div>
            </div>
        </body>

2. 给大盒子和6个面添加背景颜色、大小等样式

  • 代码将之后需要的动画等效果都写上了
  • 有些代码是调试用的
.box {
            width: 490px;
            height: 490px;
            margin: 150px auto;
            background: pink;
            transform-origin: center center -245px;
            /* 开启上帝视角 调试用 */
            /* transform: rotateY(60deg) rotateZ(30deg); */
            /* 立体呈现 */
            transform-style: preserve-3d;
            /* 调用动画 */
            animation: test 5s infinite linear;
        }
        /* 使用属性选择器:选中类名以space的类 */
        [class^='space'] {
            position: absolute;
            width: 490px;
            height: 490px;
            background: #000;
            padding-left: 10px;
            padding-top: 10px;
        }

3. 给6个面分别给三阶魔方的格子并配上颜色

html:

  • 代码与上面的会有一些层叠
 <div class="box">
        <div class="space1">
            <ul>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>

        <div class="space2">
            <ul>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>

        <div class="space3">
            <ul>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>

        <div class="space4">
            <ul>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>

        <div class="space5">
            <ul>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>

        <div class="space6">
            <ul>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>

css:

.box li {
            float: left;
            width: 150px;
            height: 150px;
            border-radius: 10px;
            background: blue;
            margin-right: 10px;
            margin-bottom: 10px;
        }

        .space2 li {
            background: #fff;
        }

        .space3 li {
            background: yellow;
        }

        .space4 li {
            background: green;
        }

        .space5 li {
            background: orange;
        }

        .space6 li {
            background: red;
        }

image.png

4. 利用偏移和旋转对6个面进行位置调整

  • 调整之前开启“上帝视角”,方便观察 transform: rotateY(60deg) rotateZ(30deg)
  • 6个面的父元素也就是box开启立体呈现,不然没有效果 transform-style: preserve-3d;
  • 为了更加真实,需要在box的父元素上添加透视
body {
    background: #f7f7f8;
    padding: 12px 12px 79px;
}
  • 偏移的时候要理性分析,调整方案不限 代码:
.space2 {
            transform: translateZ(-490px);
        }

        .space3 {
            transform: translateZ(-245px) translateX(245px) rotateY(90deg);
        }

        .space4 {
            transform: translateZ(-245px) translateX(-245px) rotateY(90deg);
        }

        .space5 {
            transform: translateZ(-245px) translateY(245px) rotateX(90deg);
        }

        .space6 {
            transform: translateZ(-245px) translateY(-245px) rotateX(90deg);
        }

5. 添加动画效果

  • 定义动画
  /* 定义动画 */
        @keyframes test {
            from {
                transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg);
            }

            to {
                transform: rotateX(360deg) rotateY(360deg);
            }
        }

        .box:hover {
            animation-play-state: paused;
        }
  • 使用动画(代码上面写过)
.box {
        /* 调用动画 */
       animation: test 5s infinite linear;
 }

最后效果:

image.png

  • 代码写完后魔方在旋转,可以根据自己的偏好调整角度,代码在动画部分
  • 写旋转原点的时候非常关键,写不好回出现很诡异的效果
  • 存在的不足欢迎指出评论!