CSS--3D正方体旋转
前言:正方体旋转这个效果是之前在逛其他博客的时候看到的,然后觉得好玩,就做出来看看。
代码:
1 <!DOCTYPE html> 2 <head> 3 <meta charset="utf-8" /> 4 <title>正方体旋转</title> 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 </head> 7 <style> 8 body{ 9 margin: 0 0; 10 padding:0 0; 11 } 12 #cube img{ 13 width: 100%; 14 display: block; 15 } 16 #cube{ 17 transform-style: preserve-3d;/*构建3D立体图形必须设置preserve-3d*/ 18 /* perspective: 1000px; */ 19 /*Z轴视角*/ 20 /* perspective-origin: 400px 0px; */ 21 /*可设置X\Y方向的视角,Z方向由perspective()决定。*/ 22 width: 200px; 23 height: 200px; 24 margin: 150px auto; 25 animation: rotate3D 10s infinite; 26 animation-delay: 0s; 27 animation-timing-function: linear; 28 } 29 @keyframes rotate3D{ 30 from{ 31 transform: rotateX(0deg) rotateY(0deg); 32 } 33 to{ 34 transform: rotateX(360deg) rotateY(360deg); 35 } 36 } 37 #cube div{ 38 /* transform-origin:left top; */ 39 opacity:0.7; 40 position: absolute; 41 transition: all .4s; 42 } 43 .out_back{ 44 transform: translateZ(-100px); 45 } 46 .out_left{ 47 transform: rotateY(90deg) translateZ(100px); 48 } 49 .out_right{ 50 transform: rotateY(-90deg) translateZ(100px); 51 } 52 .out_bottom{ 53 transform:rotateX(-90deg) translateZ(100px); 54 } 55 .out_top{ 56 transform: rotateX(90deg) translateZ(100px); 57 } 58 .out_front{ 59 transform: translateZ(100px); 60 } 61 62 #cube span { 63 transition: all .4s; 64 opacity:0.7; 65 position: absolute; 66 width: 100px; 67 height: 100px; 68 top: 50px; 69 left: 50px; 70 } 71 .in_left { 72 transform: rotateY(90deg) translateZ(50px); 73 } 74 .in_right { 75 transform: rotateY(-90deg) translateZ(50px); 76 } 77 .in_bottom{ 78 transform:rotateX(-90deg) translateZ(50px); 79 } 80 .in_top{ 81 transform: rotateX(90deg) translateZ(50px); 82 } 83 .in_front{ 84 transform: translateZ(50px); 85 } 86 .in_back { 87 transform: translateZ(-50px); 88 } 89 90 #cube:hover .out_front { 91 transform: translateZ(200px); 92 } 93 #cube:hover .out_back { 94 transform: translateZ(-200px); 95 } 96 #cube:hover .out_left { 97 transform: rotateY(90deg) translateZ(200px); 98 } 99 #cube:hover .out_right { 100 transform: rotateY(-90deg) translateZ(200px); 101 } 102 #cube:hover .out_top { 103 transform: rotateX(90deg) translateZ(200px); 104 } 105 #cube:hover .out_bottom { 106 transform: rotateX(-90deg) translateZ(200px); 107 } 108 #cube:hover .in_front { 109 transform: translateZ(100px); 110 } 111 #cube:hover .in_back { 112 transform: translateZ(-100px); 113 } 114 #cube:hover .in_left { 115 transform: rotateY(90deg) translateZ(100px); 116 } 117 #cube:hover .in_right { 118 transform: rotateY(-90deg) translateZ(100px); 119 } 120 #cube:hover .in_top { 121 transform: rotateX(90deg) translateZ(100px); 122 } 123 #cube:hover .in_bottom { 124 transform: rotateX(-90deg) translateZ(100px); 125 } 126 </style> 127 128 129 130 <body> 131 <div id="cube"> 132 <div class="out_front"> 133 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="out_pic"> 134 </div> 135 <div class="out_back"> 136 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="out_pic"> 137 </div> 138 <div class="out_left"> 139 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="out_pic"> 140 </div> 141 <div class="out_right"> 142 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="out_pic"> 143 </div> 144 <div class="out_top"> 145 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="out_pic"> 146 </div> 147 <div class="out_bottom"> 148 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="out_pic"> 149 </div> 150 <span class="in_front"> 151 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="in_pic"> 152 </span> 153 <span class="in_back"> 154 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="in_pic"> 155 </span> 156 <span class="in_left"> 157 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="in_pic"> 158 </span> 159 <span class="in_right"> 160 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="in_pic"> 161 </span> 162 <span class="in_top"> 163 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="in_pic"> 164 </span> 165 <span class="in_bottom"> 166 <img src="https://images.cnblogs.com/cnblogs_com/71yishen/1812324/o_200723062933diShiNi-1.jpg" class="in_pic"> 167 </span> 168 </div> 169 </body> 170 </html>
知识点:
要构建正方体,一定要了解3D坐标体系、3D变形的原理,元素是怎么翻转的,哪边是正向哪边是负向,Z轴是怎么位移的等等。下面只能概述,具体的过程还是要自己想一想,不然很难了解透的。有了正方体,用animation实现旋转方式就好了。也可以用hover改变位移实现鼠标飘上去的动作效果,这里就比较容易了。
解析:
一 给出html,可以给六个面设置不同的背景色,这样比较突出,设置div大小:200px
1 <div id="cube"> 2 <div class="out_front"></div> 3 <div class="out_back"></div> 4 <div class="out_left"></div> 5 <div class="out_right"></div> 6 <div class="out_top"> </div> 7 <div class="out_bottom"></div> 8 </div>
#cube,#cube div{ width:200px; height:200px; } .out_back{background-color:#FF0000;} .out_left{background-color:#FF7D00; } .out_right{background-color:#FFFF00;} .out_bottom{background-color:#00FF00;} .out_top{ background-color:#0000FF;} .out_front{background-color:#00FFFF;}
二 构建3D立体图形,设置观看点,透视
1) 首先需要设置,构建3D立体图形构建3D立体图形,默认参数是flat,表2D
2) 设置perspective,是Z轴位置的显示距离,也就是视距。视距越大,立体效果越不明显。如果不设置perspective,Z轴上的点都会对应在X,Y轴上,所以从屏幕上就看不到透视效果,只会显示为2D。
3) perspective,是Z轴的视距,而perspective-origin,则代表XY轴观看点,不同的位置能够看到不一样的立体图形,X代表X轴方向的位置,Y代表Y轴方向的位置
上述的作用就是为了在屏幕上显示出3D效果,且都要设置在父div上,获得透视效果的是子元素,而不是元素本身,如上就都要写在div#cube里面。
就像这样perspective给元素添加了透视,显示的就不再是一个正方形。
上面描述的是已有正方体而得到的结果,主要是为了解释perspective的意义。实际上我们写到这里页面是没有任何效果的,这样只是为了在后面,我们搭建左侧面,右侧面等能看的比较清楚。因为就算不设置perspective,通过变形位移得到的正方形还是存在的,只是但从正面你是看不到的,这样只是为了保证变形的结果是正确的。
同样,最后我们还是要让元素旋转的,前面是保证得到的元素是正确的,之后就可以把perspective-origin,和perspective样式注释掉了,因为通过旋转,就能看到了正方体的各个面。
如果还保持着不同的观看点,那么得到的旋转图形就不是正方形了,不同角度看到的物体是不一样形状,同样看到的旋转图形也是。我们想要的是正方体旋转。
那如果不需要旋转动画,透视效果自然还是要有的,不然看到的就是一个正方形。
三 构建正方体,了解元素基点
前面3D环境已经构建好了
这里以左侧面为例:
父元素相对定位,子元素绝对定位
.out_left{ transform: rotateY(-90deg) translateZ(100px); }
X轴旋转-90°,即从右向左旋转到九十度垂直
然后设置Z轴向左位移100px,translateZ(100px)。
从旋转90则可以看到,旋转的中心轴,是以自身中间对称轴为准的,所以旋转过来是一半在前边一半在后面
这样有两个办法
①可以把back面向后位移100px
.out_back{ transform: translateZ(-100px); }
这样左侧面就完成了,或者不改变后面,左侧面再向X轴位移:translateX(100px)。都可以得到正方体的左侧面,这就是开头说的需要了解3D位移变形的原理,实现方法是多样的。
②了解transform-origin属性,前面perspective-origin是指观看点,而transform-origin就是元素基点,它默认是以自身所在的中心位置为原点的。
所以刚才旋转90°得到的图形是一半前一半后,第二种方法就是改变元素基点。
transform-origin默认值是center center,改为如下
transform-origin:left top;
这样正方体就会以左边线为轴心旋转90°,得到左侧面。
其他各个侧面:
.out_right{ transform: rotateY(90deg) translateZ(100px); } .out_bottom{ transform:rotateX(-90deg) translateZ(100px); } .out_top{ transform: rotateX(90deg) translateZ(100px); } .out_front{ transform: translateZ(100px); }
这样一个正方体显示出来了,例子中是在里面又嵌套了一个小正方体,只要原理明白,宽度,高度设为大正方体的一半,3D位移时也要减一半就得到小正方体。
四 animation动画,实现正方体旋转
#cube{ animation: rotate3D 10s infinite; /*动画名称 持续时间 无限次循环*/ animation-delay: 0s; /*延迟时间*/ animation-timing-function: linear; /*匀速播放*/ } @keyframes rotate3D{ from{ /*X,Y轴旋转360°*/ transform: rotateX(0deg) rotateY(0deg); } to{ transform: rotateX(360deg) rotateY(360deg); } }
如果正方体不是按自身旋转360°,那说明轴心不是正方体的中心位置,可以在父元素中设置:
transform-origin:center conter 100px; 第三值是Z轴位置,设为正方体边长的一半(改变元素基点)
或者通过正方体整体位移,也能达到改变元素基点的效果(元素基点没有改变,只是通过位移后元素基点变成了体心)。
总结:
1.transform-style构建3D立体,perspective视距,perspective-origin观看点
2.掌握transform变形,包括 rotate旋转和 translate位移。
3.使用animation,@keyframes关键帧