怎样实现一个旋转的彩色3D方块呢,可以根据css的空间转换特性,利用transform实现元素在空间中的平移、旋转、缩放,再为盒子添加transform-style: preserve-3d属性后可以将盒子里的内容立体呈现,最后加上动画效果让其循环旋转,这样就制作成功了。
基础知识
空间:是从坐标轴角度定义的。x轴与y轴构成了平面,再加上z轴就构成了3D立体空间
这里的各轴的正值朝向分别为:x轴向右,y轴向下,z轴向前
空间位移:使用translate实现元素在空间中的位移
div {
/* X轴位移 */
transform: translateX(100px);
/* Y轴位移 */
transform: translateY(100px);
/* Z轴位移 */
transform: translateZ(100px);
/* 多重位移 */
transform: translate3d(100px, 100px, 100px);
}
空间旋转:使用rotate实现元素在空间中的旋转
div {
/* X轴旋转 */
transform: rotateX(45deg);
/* Y轴旋转 */
transform: rotateY(45deg);
/* Z轴旋转 */
transform: rotateZ(45deg);
/* 自定义旋转轴向,这里的是x、y轴对角线旋转 */
transform: rotate3d(1, 1, 0, 45deg);
}
判断旋转方向: 左手握住旋转轴, 拇指指向正值方向, 手指弯曲方向为旋转正值方向
透视(视距):使用perspective属性实现透视效果
body {
/* 因为浏览器是一个平面,所以无法直观的展示Z轴的位移,加上视距(透视)perspective后,
可以有近大远小的效果,perspective的取值一般在800px-1200px */
perspective: 800px;
}
立体呈现:使用transform-style: preserve-3d呈现立体图形
div {
width: 200px;
height: 200px;
transform-style: preserve-3d;
}
动画效果:先用@keyframes定义动画,再在要使用动画效果的元素里用animation调用以定义的动画。
基础思路
先构造方块的六个面,分别命名为xRight,xLeft,yBottom,yTop,zBefore,zAfter,把它们定位到同一个位置;首先操作x轴上的两个面,让它们分别向x轴的两边移动到与中间的面接壤,然后再对两个面进行翻转,让其垂直于x轴;y轴上的两个面与x轴的同理,先向上下移动到接壤位置,再翻转到垂直于y轴;z轴则是向前后移动,不用进行翻转。
好的,现在理论存在,开始实践!
步骤
第一步:构造出方块的六个面,并把它们全都定位到初始位置,再为body设置黑色的背景,这样会让我们的盒子看着更好看一些。
<body>
<div class="box">
<div class="xRight"></div>
<div class="xLeft"></div>
<div class="yBottom"></div>
<div class="yTop"></div>
<div class="zBefore"></div>
<div class="zAfter"></div>
</div>
</body>
<style>
body {
perspective: 1200px;
background-color: #000;
}
.box {
position: relative;
width: 200px;
height: 200px;
margin: 150px auto;
background-color: #fff;
transform-style: preserve-3d;
animation: move 5s linear infinite;
}
.box > div {
position: absolute;
top: 0;
left: 0;
width: 200px;
height: 200px;
}
</style>
第二步:操作x轴上的两个面,先给它们设置不同的背景颜色,并让背景色有一定的透明度(这也是为了方便观察我们旋转的方块),先对这两个面沿x轴进行移动,需要移动本身宽度的一半,因为进行翻转时是以当前面的中心来翻转的,所以当前面的中心与原位置面的左右边齐平就行;再让两个面沿着y轴进行旋转。
.xRight {
transform: translateX(100px) rotateY(90deg);
background-color: rgba(255, 192, 203, 0.5);
}
.xLeft {
transform: translateX(-100px) rotateY(90deg);
background-color: rgba(238, 130, 238, 0.5);
}
第三步:操作y轴上的两个面,先给它们设置不同的背景颜色,并让背景色有一定的透明度(同上),先对这两个面沿y轴进行移动,同样需要移动本身高度的一半,因为进行翻转时是以当前面的中心来翻转的,所以当前面的中心与原位置面的上下边齐平就行;再让两个面沿着x轴进行旋转。
.yBottom {
transform: translateY(100px) rotateX(90deg);
background-color: rgba(135, 207, 235, 0.5);
}
.yTop {
transform: translateY(-100px) rotateX(90deg);
background-color: rgba(47, 47, 187, 0.5);
}
第四步:操作z轴上的两个面,同样先给它们设置不同的背景颜色,并让背景色有一定的透明度(同上),然后对这两个面沿z轴进行移动,同样需要移动本身宽度的一半即可,这两个面就是正对我们的,就不用进行旋转了;当这一步完成后,一个完整的3D方块就呈现在我们面前了。
.zBefore {
transform: translateZ(100px);
background-color: rgba(144, 238, 144, 0.5);
}
.zAfter {
transform: translateZ(-100px);
background-color: rgba(0, 100, 0, 0.5);
}
对了,要记得把原本方便观察的白色背景去掉啊。
第五步:这时一个彩色的3D方块已经出现在我们的屏幕上了,要让它旋转起来,只需要最后给它加一个动画效果就好啦。
定义一个动画效果:
@keyframes move {
0% {
transform: rotate3d(0, 0, 0, 0);
}
100% {
transform: rotate3d(1, 1, 0, 360deg);
}
}
在父盒子里调用定义的动画,设置动画一次的完成时间为5s,旋转速度为匀速,并让其无限循环:
.box {
position: relative;
width: 200px;
height: 200px;
margin: 150px auto;
transform-style: preserve-3d;
animation: move 5s linear infinite;
}
完整代码
最后来看一下完整代码吧:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
body {
perspective: 1200px;
background-color: #000;
}
.box {
position: relative;
width: 200px;
height: 200px;
margin: 150px auto;
transform-style: preserve-3d;
animation: move 5s linear infinite;
}
.box > div {
position: absolute;
top: 0;
left: 0;
width: 200px;
height: 200px;
}
.xRight {
transform: translateX(100px) rotateY(90deg);
background-color: rgba(255, 192, 203, 0.5);
}
.xLeft {
transform: translateX(-100px) rotateY(90deg);
background-color: rgba(238, 130, 238, 0.5);
}
.yBottom {
transform: translateY(100px) rotateX(90deg);
background-color: rgba(135, 207, 235, 0.5);
}
.yTop {
transform: translateY(-100px) rotateX(90deg);
background-color: rgba(47, 47, 187, 0.5);
}
.zBefore {
transform: translateZ(100px);
background-color: rgba(144, 238, 144, 0.5);
}
.zAfter {
transform: translateZ(-100px);
background-color: rgba(0, 100, 0, 0.5);
}
@keyframes move {
0% {
transform: rotate3d(0, 0, 0, 0);
}
100% {
transform: rotate3d(1, 1, 0, 360deg);
}
}
</style>
</head>
<body>
<div class="box">
<div class="xRight"></div>
<div class="xLeft"></div>
<div class="yBottom"></div>
<div class="yTop"></div>
<div class="zBefore"></div>
<div class="zAfter"></div>
</div>
</body>
</html>
结语
学习完一个知识点后掌握它最好的办法就是实践,画出这个旋转方块后我对新知识的掌握程度又多了很多啦。