机箱存在于一个自然的空间,但在二维的web世界里,我们要展现机箱,需要给他一个“舞台”,这个舞台就是父元素,由它来定位机箱在浏览器视界中的位置,还对机箱的元素进行归拢,并负责渲染一些效果。所以,我们先给机箱做一个场景:
.stage {
margin: 50px auto 0;
width: 250px;
height: 250px;
transform-style: preserve-3d;
perspective: 1000px;
}
这个场景,我们设定了3d渲染样式以及景深,毕竟我们要制作的机箱是立体的。它之下,将由若干个子元素去构建机箱实体,这些子元素会有共同的属性,所以,让我们先写好这些子元素的共性设置:
.stage div {
position: absolute;
font: 1.5em / 2em Arial;
text-align: center;
border: 1px solid #aaa;
background: rgba(0,0,0,.6);
}
以上,设定了定位、边框和背景色,以及文本相关的项目(我们会给机箱的各个面写上标识,所以字体方面需要设定一下)。
现在可以开始绘制机箱了。假如机箱就在我们的左前方,我们其实看到的只有机箱的三个面:正面、顶部和机箱的一个侧面。让我们先来画机箱的正面:
.stage div:nth-child(1) {
width: 110px;
height: 250px;
left: 0;
top: 50px;
}
它很简单,尺寸、定位的设置。top值为什么是50px?这与机箱顶部的高度有关,我们来看机箱的第二个面,顶部的设定:
.stage div:nth-child(2) {
width: 110px;
height: 50px;
left: 25px;
top: 0;
transform: skewX(-45deg);
}
瞧,机箱的顶部高度50px,正面自然要对应下移50px,这样才能衔接。顶部的CSS盒子,我们用了transform的变形函数 skewX(角度),让它向右边扭曲拉伸,以便配合第三块面板的出场(实际上是要留出3d空间给下一个面板):
.stage div:nth-child(3) {
width: 50px;
height: 250px;
left: 110px;
top: 25px;
transform: skewY(-45deg);
}
侧面的面板用的扭曲函数与顶部的 skewX(角度) 不同,是 skewY(角度),因为它不是水平放置的,它的扭曲轴当然不能是X轴,而是Y轴。
回头看看各个面板的尺寸,它们的尺寸不尽相同,它们的定位也不一样,但所有这些数值上的变化其实是有规律的,是根据不同位置而做的精准设定,与正面面板的原始尺寸和顶部面板的高度都建立着倍数关系。
新知识点:
transform: skew(deg1, deg2)
倾斜函数,也称扭曲函数。作用是令对象倾斜,需要xy坐标系的两个参数,单位为deg。仅需某个方向倾斜,可用 skewX 和 skewY,也可写成 skew(15deg,0)和skew(0,15deg)。