今天我们一起来学习一下如何用 css3 变换实现小时候玩的小魔方立方体。但是要提前复习一下 3D 变换的相关知识,你可以看一下 w3cplus博客 或者 w3school文档,由于目前 webkit 内核对 css3 属性兼容性比较好,为代码简洁,这里我们只考虑 chrome 浏览器,其他浏览器读者可自行加相应前缀来实现。
好了,准备就绪之后那我们就开始进入正题吧。首先,我们来看一道数学题:请想一下6个正方形如何摆放能拼成一个正方体呢?当然,方式有很多,这里只提出一种,如下:
正方体 前后
左右
上下
分别用 front
back
left
right
top
bottom
来表示。
实现方法
我们用自定义标签来实现,html 代码如下:
1 | <body> |
这里,给背景一个紫色到黑色的径向渐变,样式如下:
1 | html{ |
设置正方体在浏览器窗口正中间,若想看到变换后的 3D 效果,需要给 cube
声明 3D 变换 transform-style:preserve-3d;
,同时给 body
设置 视差
,样式如下:
1 | body{ |
注意:cube
是正方体的父标签,6个子元素构成正方体,我们以父元素为相对坐标,分别对6个正方形相对父元素设置绝对定位。
这时,6个正方形和父元素重合,接下来,分别对其定位到上边图片对应位置,即 back
left
right
top
bottom
分别相对 front
进行位移和旋转,这样就可以拼成正方体啦~~~ 样式如下:
1 | front{ |
注意:看到这里,大家可能不明白为什么上面的 transform
都要加一个 transform:translateZ(10em)
,这时因为接下来我们要给 cube
加旋转动画,cube
就会以自身中心为旋转点(对应正方体 front
这个面为旋转点),导致 正方体
不能以自身中心为旋转点进行旋转,故而我们把构成它的这6个面分别沿 Z轴
向正方向位移 10em
,就是正方形边长一半,这样 cube
中心点和 正方体
中心点 重合
。
到这里我们已经完成一半了,可是我们这个正方体并不是小时候玩的魔方那样,每个面还有 4x4=16
个小正方形,这里设置 8x8=64
个小正方形(20em/2.5em=8
)。css3 可以为我们的背景添加渐变,若想复习一下渐变知识,也可以看一下 w3cplus博客。样式如下:
1 | cube{ |
最后一步,为了正方体看上去不是呆板的,可以对 cube
加上一个动画,样式如下:
1 | cube{ |
不知道大家对上边动画 transform:translateZ(-10em)
是否理解,这是因为我们在努力为 cube
和 正方体
中心点重合时设置了 transform:translateZ(10em)
。
若想在正方体中添加文字,设置字体大小要注意一下,chrome 浏览器默认字体大小16px
,正方形宽度 16px*20em=320px
,故 line-height:320px
;同时给字体设置多重阴影 text-shadow
,可以达到立体效果,详细如下:
1 | <div>放飞梦想</div> |
1 | div{ |