纯css实现正多面体

正多面体css实现

这个正多面体是由很多个正方形div叠成的,虽然有很多窟窿,但是不影响整体效果。

代码

一个是html代码,一个是css代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="polyhedron.css">
</head>

<body>
<div class="polyhedron">
    <div class="rotateContainer">
        <div class="slide s0">
            <div class="slide s1">
                <div class="slide s11">
                    <div class="slide s12"></div>
                    <div class="slide s111"></div>
                </div>
            </div>
            <div class="slide s2">
                <div class="slide s21">
                    <div class="slide s22"></div>
                    <div class="slide s211"></div>
                </div>
            </div>
            <div class="slide s3">
                <div class="slide s31">
                    <div class="slide s32"></div>
                    <div class="slide s311"></div>
                </div>
            </div>
            <div class="slide s4">
                <div class="slide s41">
                    <div class="slide s42"></div>
                    <div class="slide s411"></div>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
<script>
    let polyhedron = document.querySelector(".polyhedron");
    let rotateBase = polyhedron.querySelector(".rotateContainer");
    window.addEventListener("mousemove", (e) => {
        console.log(e.pageX);
        console.log(e.pageY);
        let k = 300;
        rotateBase.style.transform = `rotateX(${k * e.pageY / 1080}deg) rotateZ(${-k * e.pageX / 1920}deg)`;
    });
</script>
</html>

css代码:

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
.polyhedron {
  width: 100px;
  height: 100px;
  position: relative;
  margin: 600px auto;
  perspective: 800px;
  outline: solid 1px red;
}
.polyhedron .rotateContainer {
  width: 200px;
  height: 200px;
  position: absolute;
  left: 50%;
  top: 50%;
  margin-left: -100px;
  margin-top: -100px;
  transform-style: preserve-3d;
  transform-origin: 50% 50% 120.7px;
  outline: solid 1px green;
}
.polyhedron .rotateContainer .slide {
  outline: solid 1px;
  width: 100px;
  height: 100px;
  position: absolute;
  background-color: rgba(0, 0, 0, 0.2);
  transform-style: preserve-3d;
  transition: all 0.2s;
}
.polyhedron .rotateContainer .slide:hover {
  background-color: rgba(0, 0, 0, 0.6);
  box-shadow: 0 0 20px yellow;
  width: 120px;
  height: 120px;
  cursor: pointer;
}
.polyhedron .rotateContainer .slide:active {
  background-color: rgba(0, 0, 0, 0.6);
  box-shadow: 0 0 20px orange;
  width: 80px;
  height: 80px;
}
.polyhedron .rotateContainer .s0 {
  left: 50%;
  top: 50%;
  margin-left: -50px;
  margin-top: -50px;
}
.polyhedron .rotateContainer .s0 .s1 {
  right: -100%;
}
.polyhedron .rotateContainer .s0 .s1 .s11 {
  right: -100%;
}
.polyhedron .rotateContainer .s0 .s1 .s11 .s12 {
  top: -100%;
  transform-origin: bottom center;
  transform: rotateX(-45deg);
}
.polyhedron .rotateContainer .s0 .s1 .s11 .s111 {
  right: -100%;
}
.polyhedron .rotateContainer .s0 .s1,
.polyhedron .rotateContainer .s0 .s11,
.polyhedron .rotateContainer .s0 .s111 {
  transform-origin: left center;
  transform: rotateY(-45deg);
}
.polyhedron .rotateContainer .s0 .s2 {
  top: -100%;
}
.polyhedron .rotateContainer .s0 .s2 .s21 {
  top: -100%;
}
.polyhedron .rotateContainer .s0 .s2 .s21 .s22 {
  left: -100%;
  transform-origin: right center;
  transform: rotateY(45deg);
}
.polyhedron .rotateContainer .s0 .s2 .s21 .s211 {
  top: -100%;
}
.polyhedron .rotateContainer .s0 .s2,
.polyhedron .rotateContainer .s0 .s21,
.polyhedron .rotateContainer .s0 .s211 {
  transform-origin: bottom center;
  transform: rotateX(-45deg);
}
.polyhedron .rotateContainer .s0 .s3 {
  left: -100%;
}
.polyhedron .rotateContainer .s0 .s3 .s31 {
  left: -100%;
}
.polyhedron .rotateContainer .s0 .s3 .s31 .s32 {
  bottom: -100%;
  transform-origin: top center;
  transform: rotateX(45deg);
}
.polyhedron .rotateContainer .s0 .s3 .s31 .s311 {
  left: -100%;
}
.polyhedron .rotateContainer .s0 .s3,
.polyhedron .rotateContainer .s0 .s31,
.polyhedron .rotateContainer .s0 .s311 {
  transform-origin: right center;
  transform: rotateY(45deg);
}
.polyhedron .rotateContainer .s0 .s4 {
  bottom: -100%;
}
.polyhedron .rotateContainer .s0 .s4 .s41 {
  bottom: -100%;
}
.polyhedron .rotateContainer .s0 .s4 .s41 .s42 {
  right: -100%;
  transform-origin: left center;
  transform: rotateY(-45deg);
}
.polyhedron .rotateContainer .s0 .s4 .s41 .s411 {
  bottom: -100%;
}
.polyhedron .rotateContainer .s0 .s4,
.polyhedron .rotateContainer .s0 .s41,
.polyhedron .rotateContainer .s0 .s411 {
  transform-origin: top center;
  transform: rotateX(45deg);
}
/*# sourceMappingURL=polyhedron.css.map */

其实上面的css代码是less编译生成的,我写的是less代码

less代码如下:

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

.polyhedron {
  @iconBoxL: 100px;
  width: @iconBoxL;
  height: @iconBoxL;

  position: relative;
  margin: 600px auto;
  perspective: 800px;
  outline: solid 1px red;

  .rotateContainer {
    @cubeL: 100px; // 正方体的边长
    @containerL: @cubeL * 2;
    width: @containerL;
    height: @containerL;
    // 与旋转中心同心对齐
    position: absolute;
    left: 50%;
    top: 50%;
    margin-left: -(@containerL / 2);
    margin-top: -(@containerL / 2);

    transform-style: preserve-3d;
    transform-origin: 50% 50% (@cubeL/2)+(1.414/2*@cubeL);

    //transform: rotateX(60deg) rotateZ(30deg);
    outline: solid 1px green;

    .slide {
      outline: solid 1px;

      width: @cubeL;
      height: @cubeL;
      position: absolute;
      //background: transparent;
      background-color: rgba(0, 0, 0, 0.2);
      transform-style: preserve-3d;
      transition: all 0.2s;

      &:hover {
        background-color: rgba(0, 0, 0, 0.6);
        box-shadow: 0 0 20px yellow;
        width: @cubeL+20;
        height: @cubeL+20;
        cursor: pointer;
      }

      &:active {
        background-color: rgba(0, 0, 0, 0.6);
        box-shadow: 0 0 20px orange;
        width: @cubeL - 20;
        height: @cubeL - 20;
      }
    }

    .s0 {
      // 和基础旋转底面重中心对齐
      left: 50%;
      top: 50%;
      margin-left: -(@cubeL / 2);
      margin-top: -(@cubeL / 2);

      .s1 {
        right: -100%;

        .s11 {
          right: -100%;

          .s12 {
            top: -100%;
            transform-origin: bottom center;
            transform: rotateX(-45deg);
          }

          .s111 {
            right: -100%;
          }
        }
      }

      .s1, .s11, .s111 {
        transform-origin: left center;
        transform: rotateY(-45deg);
      }

      .s2 {
        top: -100%;

        .s21 {
          top: -100%;

          .s22 {
            left: -100%;
            transform-origin: right center;
            transform: rotateY(45deg);
          }

          .s211 {
            top: -100%;
          }
        }
      }

      .s2, .s21, .s211 {
        transform-origin: bottom center;
        transform: rotateX(-45deg);
      }

      .s3 {
        left: -100%;

        .s31 {
          left: -100%;

          .s32 {
            bottom: -100%;
            transform-origin: top center;
            transform: rotateX(45deg);
          }

          .s311 {
            left: -100%;
          }
        }
      }

      .s3, .s31, .s311 {
        transform-origin: right center;
        transform: rotateY(45deg);
      }

      .s4 {
        bottom: -100%;

        .s41 {
          bottom: -100%;

          .s42 {
            right: -100%;
            transform-origin: left center;
            transform: rotateY(-45deg);
          }

          .s411 {
            bottom: -100%;
          }
        }
      }

      .s4, .s41, .s411 {
        transform-origin: top center;
        transform: rotateX(45deg);
      }

      .s12, .s22, .s34, .s42 {

      }
    }
  }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容