正多面体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 {
}
}
}
}