3D位移
写法1:
transform: translate3d(x, y, z);
translate3d(x, y, z) 中的 x, y, z 分别代表 x轴, y轴, z轴 正方向位移量。x,y,z不可以省略,没有的话写0
默认情况下:
x轴正方向 》向右,
y轴正方向 》向下,
z轴正方向 》从电脑屏幕向眼睛方向,向外
向Z轴正方向移动,靠近眼镜,视觉效果物体变大,
向Z轴负方向移动,远离眼镜,视觉效果物体变小,
正值代表向正方向移动,复制代表向负方向移动
transform: translate3d(x, y, z);是简写方式,也可以这样写:
写法2:
transform: translateX(X) translateY(Y) translateZ(Z);每个中间空格隔开,或者每个单独写:
写法3:
transform: translateX();
transform: translateY();
transform: translateZ();
注意:translateX() translateY() 里面可以写像素PX、百分比,百分比是根据自身的宽高的百分比,常使用百分比位移来使盒子水平垂直居中,但是translateZ()里面单位只能是像素PX
3D旋转
transform: rotateX(deg);- - -根据X轴旋转
transform: rotateY(deg);- - -根据y轴旋转
transform: rotateZ(deg);- - -根据z轴旋转
transform: rotate3d(x, y, z,deg);- - -根据自由轴旋转,x,y,z不可以省略,deg代表旋转度数
透视和3D呈现
3D效果的呈现不仅要书写以上的3d位移和旋转属性,要加上透视和3D呈现属性才能生效
透视:perspective: *px; - - - 单位是px,加在要观察的元素的父级及以上盒子上,加多少像素可以自己调试
3D呈现:transform-style: preserve-3d; - - - 加在父盒子上,这样里面的子盒子也有3D效果
示例
示例1:
<!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>两面翻盒子</title>
<style>
body {
perspective: 400px;
}
.box {
position: relative;
width: 200px;
height: 200px;
margin: 100px auto;
transition: all 2s;
/* 给父级添加,让子盒子保留立体空间 */
transform-style: preserve-3d;
}
.box:hover {
transform: rotateY(180deg)
}
.box div {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
text-align: center;
line-height: 200px;
border-radius: 50%;
}
.box div:nth-child(1) {
background-color: pink;
z-index: 1;
}
.box div:nth-child(2) {
background-color: green;
transform: rotateY(180deg);
}
</style>
</head>
<body>
<div class="box">
<div>吃苹果?</div>
<div>吃榴莲?</div>
</div>
</body>
</html>
原理:
两个子盒子定位到父盒子里面同样位置,将第二个盒子进行围绕Y轴180度的旋转,和第一个盒子背靠背,第一个盒子的层级设为1,压住第二个盒子显示,鼠标移动到父盒子上时,整个父盒子围绕Y轴旋转
页面效果:
示例2:
<!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>3D导航栏</title>
<style>
* {
margin: 0;
padding: 0;
}
ul {
margin: 100px;
}
ul li {
float: left;
list-style: none;
width: 100px;
height: 35px;
margin: 0 5px;
perspective: 500px;
}
.box {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
transition: all 1s;
}
.box:hover {
transform: rotateX(90deg);
}
.box div {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
line-height: 35px;
text-align: center;
}
.box div:nth-child(1) {
transform: translateZ(17.5px);
z-index: 1;
background-color: pink;
}
.box div:nth-child(2) {
transform: translateY(17.5px) rotateX(-90deg);
background-color: green;
}
</style>
</head>
<body>
<ul>
<li>
<div class="box">
<div>春</div>
<div>种</div>
</div>
</li>
<li>
<div class="box">
<div>夏</div>
<div>长</div>
</div>
</li>
<li>
<div class="box">
<div>秋</div>
<div>收</div>
</div>
</li>
<li>
<div class="box">
<div>冬</div>
<div>藏</div>
</div>
</li>
</ul>
</body>
</html>
原理:
第二个盒子向Y轴正方向向下移动盒子一半的距离,然后围绕X轴向外翻转90度,使字朝下,第一个盒子向Z轴正方向移动,向外移动盒子一半的距离,这样父盒子围绕X轴旋转的中心线及时两个子盒子组成的盒子空间中心轴,然后设置鼠标移动到父盒子上时围绕X轴旋转
页面效果:
示例3:
<!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>旋转木马案例</title>
<style>
body {
perspective: 1200px;
}
section {
position: relative;
width: 300px;
height: 300px;
margin: 200px auto;
transform-style: preserve-3d;
/* 使用动画 */
animation: move 30s linear infinite;
}
/* 定义动画 */
@keyframes move {
0% {}
100% {
transform: rotateY(360deg)
}
}
section:hover {
animation-play-state: paused;
}
section div {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url(images/dog.jpg) no-repeat;
}
section div:nth-child(1) {
transform: translateZ(300px);
}
section div:nth-child(2) {
transform: rotateY(60deg) translateZ(300px);
}
section div:nth-child(3) {
transform: rotateY(120deg) translateZ(300px);
}
section div:nth-child(4) {
transform: rotateY(180deg) translateZ(300px);
}
section div:nth-child(5) {
transform: rotateY(240deg) translateZ(300px);
}
section div:nth-child(6) {
transform: rotateY(300deg) translateZ(300px);
}
section div:nth-child(7) {
width: 100%;
height: 100%;
background: url(images/cat1.jpg) no-repeat;
}
</style>
</head>
<body>
<section>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</section>
</body>
</html>
原理:
外层的6个图片,第一个向Z轴正方向向外移动一段距离,从第二个图片开始到户外层最后一个图片,都先围绕Y轴旋转一定度数,然后向Z轴正方向移动一段距离,外层图片向Z轴移动距离一致,围绕Y轴旋转的度数是360度 除以 图片的张数,我这里是6张图,所以依次旋转 60° 120° 180° 240° 300°
然后里面我也放了一张图,这张图不用做处理,
给父盒子设置动画,进行360的循环旋转,鼠标移动到父盒子上时停止旋转,鼠标移开后又继续旋转
页面效果:
旋转时度数的正负判断
使用左手法则,大拇指和其余4指呈直角状态,4手指向手掌心方向弯曲,手背朝向自己的脸部,大拇指指向要围绕旋转的轴的正方向,
如果旋转方向时跟4手指弯曲的方向一致,则是正值;反方向,则是负值