纯CSS实现旋转的3D陀螺

1,072 阅读2分钟

我正在参加 码上掘金体验活动,详情:show出你的创意代码块

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

前言

此次灵感来源于前面的旋转相册,既然多个正方形可以做成正方体,那么锥体也就是多个三角形合成的咯,只需要算好每个三角形所占的角度,再调整好位置就行,最后加上动画,一个炫酷的旋转陀螺就完成了。

码上掘金

效果如下,还挺漂亮的。

代码实现

HTML 代码

<div class="romb-container">
  <div class="romb-wrap">
    <div class="romb">
      <div class="romb-top">
        <div class="romb-top-face"></div>
        <div class="romb-top-face"></div>
        <div class="romb-top-face"></div>
        <div class="romb-top-face"></div>
        <div class="romb-top-face"></div>
        <div class="romb-top-face"></div>
      </div>

      <div class="romb-bottom">
        <div class="romb-bottom-face"></div>
        <div class="romb-bottom-face"></div>
        <div class="romb-bottom-face"></div>
        <div class="romb-bottom-face"></div>
        <div class="romb-bottom-face"></div>
        <div class="romb-bottom-face"></div>
      </div>
    </div>
  </div>
</div>

CSS 代码

        .romb-container {
            width: 600px;
            height: 350px;
            text-align: center;
            position: absolute;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            margin: auto;
        }

        .romb-wrap {
            font-size: 12px;
            display: inline-block;
            width: 68px;
            height: 182px;
        }

        .romb {
            width: 100%;
            height: 100%;
            transform-style: preserve-3d;
            animation: spin .5s linear forwards infinite;
        }

        .romb-top,
        .romb-bottom {
            position: absolute;
            width: 100%;
            height: 50%;
            transform-style: preserve-3d;
        }

        .romb-bottom {
            top: 50%;
        }

        .romb-top-face,
        .romb-bottom-face {
            width: 0;
            height: 0;
            border-style: solid;
            border-color: transparent;
            position: absolute;
            backface-visibility: hidden;
        }

        .romb-top-face {
            border-width: 0 34px 95px;
            margin-top: 9px;
        }

        .romb-bottom-face {
            border-width: 95px 34px 0;
            margin-top: -9px;
        }

        .romb-top-face:nth-of-type(1) {
            border-bottom-color: deeppink;
            transform: rotateY(0deg) translateZ(30px) rotateX(40deg);
        }

        .romb-bottom-face:nth-of-type(1) {
            border-top-color: #28f156;
            transform: rotateY(0deg) translateZ(30px) rotateX(-40deg);
        }

        .romb-top-face:nth-of-type(2) {
            border-bottom-color: #28f156;
            transform: rotateY(60deg) translateZ(30px) rotateX(40deg);
        }

        .romb-bottom-face:nth-of-type(2) {
            border-top-color: deeppink;
            transform: rotateY(60deg) translateZ(30px) rotateX(-40deg);
        }

        .romb-top-face:nth-of-type(3) {
            border-bottom-color: deeppink;
            transform: rotateY(120deg) translateZ(30px) rotateX(40deg);
        }

        .romb-bottom-face:nth-of-type(3) {
            border-top-color: #28f156;
            transform: rotateY(120deg) translateZ(30px) rotateX(-40deg);
        }

        .romb-top-face:nth-of-type(4) {
            border-bottom-color: #28f156;
            transform: rotateY(180deg) translateZ(30px) rotateX(40deg);
        }

        .romb-bottom-face:nth-of-type(4) {
            border-top-color: deeppink;
            transform: rotateY(180deg) translateZ(30px) rotateX(-40deg);
        }

        .romb-top-face:nth-of-type(5) {
            border-bottom-color: deeppink;
            transform: rotateY(240deg) translateZ(30px) rotateX(40deg);
        }

        .romb-bottom-face:nth-of-type(5) {
            border-top-color: #28f156;
            transform: rotateY(240deg) translateZ(30px) rotateX(-40deg);
        }

        .romb-top-face:nth-of-type(6) {
            border-bottom-color: #28f156;
            transform: rotateY(300deg) translateZ(30px) rotateX(40deg);
        }

        .romb-bottom-face:nth-of-type(6) {
            border-top-color: deeppink;
            transform: rotateY(300deg) translateZ(30px) rotateX(-40deg);
        }

        @keyframes spin {
            0% {
                transform: rotateY(0deg) rotateX(0deg);
            }

            50% {
                transform: rotateY(-180deg) rotateX(18deg);
            }

            100% {
                transform: rotateY(-360deg) rotateX(0deg);
            }
        } 

总结

按照这种方式,我们是不是可以搞出更多的3D图形,不妨可以试试哦。