CSS3打造3D导航
2016-04-12 00:24
543 查看
效果预览
分析:可以看出
hover的时候是有前后两个面的翻转,并且有一个凸出效果。
HTML分析
代码如下:<ul class="block-menu"> <li> <a href="#" class="three-d"> Home <span class="three-d-box"> <span class="front">Home</span> <span class="back">Home</span> </span> </a> </li> <li> <a href="#" class="three-d"> Demo <span class="three-d-box"> <span class="front">Demo</span> <span class="back">Demo</span> </span> </a> </li> <li> <a href="#" class="three-d"> Deal <span class="three-d-box"> <span class="front">Deal</span> <span class="back">Deal</span> </span> </a> </li> <li> <a href="#" class="three-d"> About <span class="three-d-box"> <span class="front">About</span> <span class="back">About</span> </span> </a> </li></ul>
<a>标签里包裹一个
<span>盒子里包裹两个
<span>,为效果的前后面做准备。
CSS分析
1.外观、定位
代码如下:*{ box-sizing:border-box;} .block-menu{background:black;} .block-menu li{display:inline-block;} .block-menu li a{ color:#fff; text-decoration:none; text-transform:uppercase; font-size:24px; line-height:20px; font-weight:bold; font-family: Arial, sans-serif; display:block; padding:15px 10px; } .three-d{ position:relative; } .three-d-box,.front,.back{ width:100%; height:100%; position:absolute; top:0; left:0; padding:15px 10px; background:black; }
2.3D效果
首先创造3D环境,保留3D空间:.three-d{perspective:200px;}.three-d-box{transform-style:preserve-3d;}
1.在
three-d:hover的时候,我们让
.three-d-box旋转,正面面对我们的元素向上翻转,下面有元素翻转上来,并且在翻转时有一个凸出来的效果。
2.关于这个凸出的效果,大家可以进行测试,如果一个元素是以自己的中心为中心点进行翻转时,是不会有凸出的效果。所以如果要制造一个凸出的效果,那么元素翻转的中心就一定不是自己的中心。
3.同时我们看到,在翻转的同时,元素贴回了
ul所在的平面的,因此应该是在Z轴上有一定负的位移。
根据以上3点,我们可以设置3D变换:
.three-d:hover .three-d-box{ transform:translateZ(-50px) rotateX(90deg);}
在这里,我先设置
translateZ而不是
rotateX,是因为
rotateX之后坐标轴会变换,如果先
roatetX后
translateZ的话,Z轴的位移就不是垂直于
ul平面(面对我们)的位移了。
由于变换时,
.three-d-box有Z轴上的负位移,如果不给
.front,
.back设置Z轴上的位移的话,这两个平面最后不会贴回
ul的平面,而是在
ul平面的后面。因此,我们给
.front,
.back设置Z轴正方向且等于变化时的位移的距离,如此,变化时,这两个元素就会完美贴合
ul所在的平面了。
.front,.back{transform:translateZ(50px);}
变换时,
.back是从下面上来的,理应有一个
rotateX(-90deg)的旋转。如果先
translateZ再
rotateX的话,
.back所在的Y轴上的高度是
<a>的一半,动画时并没有从下面上来的效果,因此,应该先
rotateX变化坐标后再
translateZ,这样
.back就在ul的“下方”了。
.front{transform:rotateX(0deg) translateZ(50px);}.back{transform:rotateX(-90deg) translateZ(50px);}
在没有
hover的情况下,由于给
.front,
.back设置了
translateZ,
.front,
.back看起来比正常的
<a>大。为了在没有
hover的情况下,
.front能贴合
<a>,我给
.three-d设置
translateZ(-50px),这样
.front虽然先跟随
.three-d在Z轴上有-50px的负位移,但随后
translateZ(50px)又让它在Z轴上有50px的正位移,如此,便贴合了
<a>.
.three-d-box{transform:translateZ(-50px);}
最后,我们为这个变化添加一个过渡的效果:
.three-d-box{transition:all .3s;}
3.注意
为了让效果明显,Z轴上的位移设置的较大值50px;在了解原理后,大家可以设置小一点的位移值,这样下方的.back就不会如此明显的看到了。
hover的时候,
.three-d-box旋转,它的子元素旋转的中心点是
.three-d-box的中心点而不是子元素自己的中心点哦~这样你才能看到有凸出的效果。
hover的时候是会覆盖原来的样式,所以
hover时,原始状态是
.three-d-box在Z轴的位移是0,
.front,
.back在Z轴的位移是50px;
hover的时候以此为起点进行变换。
最终3D相关代码如下:
.three-d{perspective:200px;}.three-d-box{ transform-style:preserve-3d; transform:translateZ(-25px); transition: all .3s ; }.front{transform:rotateX(0deg) translateZ(25px);}.back{transform:rotateX(-90deg) translateZ(25px);}.three-d:hover .three-d-box{ transform: translateZ(-25px) rotateX(90deg);}
总结
这个例子很好的说明了,一定要注意变换的中心点。父元素变换时,子元素是以父元素的中心点为中心点变换的,而不是自己。
相关文章推荐
- TextView中各个部分的文本来设置字体,大小,颜色,样式
- CSS中LI圆点样式li {list-style-type:符号名称}
- CSS文字在div中竖排显示
- CSS学习笔记(四):文本、颜色和背景
- css3百叶窗轮播图效果
- css实现居中的五中方法
- CSS3实战之background篇
- CSS深入理解之vertical-align
- CSS3之设计背景图片(多背景,背景尺寸,背景原点,背景裁剪,遮罩)
- 【H5学习】二、CSS选择器
- Sublime Text 快速折叠CSS代码到一行
- CSS3实战之box-shadow篇
- 纯CSS多级导航栏
- div css float浮动用法(left right)
- css div自适应高度height
- css3 改变默认选中文本背景色和文本颜色
- 用CSS3变形创建半圆形导航
- css3 画半圆和1/4圆
- 解剖css3的background-size属性
- css3 画三角形