白龙网认为,空间转换,也叫3D转换,通过X/Y/Z轴三个方向改变盒子的位移、旋转、绽放等形态,Z轴与视频的方向相同,正值指向自己。属性亦然是transform。
(1)位移
位移有可以分3种(X/Y/Z)独立的写法,也可以以复合属性的形式去写。
A.存在已经知盒子,给盒子初值过度效果,然后在HOVER中添加水平、垂直、Z轴效果即可。
<style>
body {
perspective: 1000px;
}
div {
margin: 300px auto;
width: 200px;
height: 200px;
background-color:red;
transition: all 5s;
}
div:hover {
/* transform: translate3d(100px,200px,300px); */
/* transform: translateX(100px); */
/* transform: translateY(200px); */
transform: translateZ(300px);
transform: translateZ(-300px);
}
</style>
</head>
<body>
<div></div>
</body>
B.透视效果(近大远小)
要想实现Z轴近大无小透视的效果,必须给元素的父标签添加一个perspective属性,属性值建议800-1200px之间。
如果perspcetive的属性值透视距不在800-1200px之间,则透视效果可能会太大,或者变化不太大,与违生活常识,不合理。
(2)旋转
A.基本用法
旋转有两种写法,一是分别单独写X/Y/Z两个轴的旋转角度;二是复合复合属性值X,Y.Z写在一起,再加上角度即可,属性值的聚会满园是0~1之间。
有目标盒子,选中盒子分别给X/Y/Y轴旋转角度即可。不管哪个轴转,顺时针为正值,逆时针为负值。
<style>
body {
perspective: 1000px;
}
img {
width: 200px;
height: 200px;
transition: all 3s;
}
img:hover {
transform: rotateX(60deg);
transform: rotate(-60deg);
transform: rotateY(360deg);
transform: rotateY(-360deg);
transform: rotateZ(360deg);
transform: rotateZ(-360deg);
transform: rotate3d(1,1,0.5,360deg);
}
</style>
</head>
<body>
<img src="./rotate.jpg" alt="">
</body>
B.立体效果
transform-style: preserve-3d的作用上让子元素产生3D效果,因此该属性用在父元素当中;默认情况下flat是平面效果。
立体图形旋转的一般思路,布局好盒子之后,首先,要在父元素中打开3D开关(transform-style: preserve-3d;);然后给前面一个子元素一个沿着Z轴的位移(transform: translateZ(200px); 最后确保鼠标经过父元素时盒子有过度的旋转效果(transform: rotateY(360deg);),因此这个时候,需要再给父元素一个过度的属性。
a.案例1:背景图片切换
<style>
* {
margin: 0;
padding: 0;
}
.cube {
transform-style: preserve-3d;
margin: 0 auto;
width: 200px;
height: 200px;
position: relative;
transition: all 2s;
}
.cube div {
width: 200px;
height: 200px;
}
.front {
position: absolute;
left: 0;
top: 0;
background-color:orange;
transform: translateZ(200px);
}
.back {
background-color:green;
}
.cube:hover {
transform: rotateY(360deg);
}
</style>
</head>
<body>
<div class="cube">
<div class="front"></div>
<div class="back"></div>
</div>
</body>
b.案例2:立体导航菜单
立体导航的实现,宏观上说,布局盒子、构建立体图这两步即可实现。布局盒子,就是要弄清楚功能需要的几个标签与结构。构建立体图时,首先要把父元素上打开3D开关,设置过度效果,同时,添加一个沿X/Y轴轻微旋转的测试立体效果,让调试过程具有可见性;其次是对子元素旋转、位移的操作;最后给父元素一个鼠标经过的旋转效果即可模拟实现。
<style>
* {
margin: 0;
padding: 0;
}
ul,li {
list-style: none;
}
a {
text-decoration: none;
}
.nav {
margin: 0 auto;
width: 300px;
height: 40px;
}
.nav li {
float: left;
width: 100px;
height: 40px;
transform-style: preserve-3d;
transition: all 2s;
/* 测试旋转,方便查看3D效果 */
/* transform: rotateX(-20deg) rotateY(30deg); */
}
.nav li a {
display: block;
width: 100%;
height: 100%;
text-align: center;
line-height: 40px;
color: #fff;
}
.nav li a:first-child {
background-color:green;
transform: translateZ(20px);
}
.nav li a:last-child {
background-color:orange;
transform: rotateX(90deg) translateZ(40px);
}
.nav li:hover {
transform: rotateX(-90deg);
}
</style>
</head>
<body>
<div class="nav">
<ul>
<li>
<a href="">首页</a>
<a href="">Home</a>
</li>
<li>
<a href="">首页</a>
<a href="">Home</a>
</li>
<li>
<a href="" class="top">首页</a>
<a href="" class="front">Home</a>
</li>
</ul>
</div>
</body>
(3)缩放
绽放也有两种写法,一是单独写X/Y/Z轴的绽放比例,二是写一个复合属性,同时控制X,Y,Z三个方向的效果。
transform: scale3d(0.9,1.5,3);
transform: scaleX(2);
transform: scaleY(3);
transform: scaleZ(4);