我还是从前那个少年

  • 3D变形(CSS3) transform
    • rotateX()
    • rotateY()
    • rotateZ()
    • 透视(perspective)
    • translateX(x)
    • translateY(y)
    • translateZ(z) ( 多做测试理解 )
    • translate3d(x,y,z)
    • backface-visibility
  • 案例1:旋转的轮播图
  • 案例2:开门大吉
  • 案例3:导航栏旋转

3D变形(CSS3) transform

2d x y
3d x y z

左手坐标系

伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方。这样我们就建立了一个左手坐标系,拇指、食指和中指分别代表X、Y、Z轴的正方向。如下图

CSS3中的3D坐标系与上述的3D坐标系是有一定区别的,相当于其绕着X轴旋转了180度,如下图

简单记住他们的坐标:

x左边是负的,右边是正的

y 上面是负的, 下面是正的

z 里面是负的, 外面是正的

rotateX()

就是沿着 x 立体旋转.

img {
  transition:all 0.5s ease 0s;
}
img:hove {

  transform:rotateX(180deg);
}

rotateY()

沿着y轴进行旋转

img {
  transition:all 0.5s ease 0s;
}
img:hove {

  transform:rotateX(180deg);
}

rotateZ()

沿着z轴进行旋转

img {
  transition:all .25s ease-in 0s;
}
img:hover {
  /* transform:rotateX(180deg); */
  /* transform:rotateY(180deg); */
  /* transform:rotateZ(180deg); */
  /* transform:rotateX(45deg) rotateY(180deg) rotateZ(90deg) skew(0,10deg); */
}

透视(perspective)

电脑显示屏是一个2D平面,图像之所以具有立体感(3D效果),其实只是一种视觉呈现,通过透视可以实现此目的。

透视可以将一个2D平面,在转换的过程当中,呈现3D效果。

  • 透视原理: 近大远小 。
  • 浏览器透视:把近大远小的所有图像,透视在屏幕上。
  • perspective:视距,表示视点距离屏幕的长短。视点,用于模拟透视效果时人眼的位置

注:并非任何情况下需要透视效果,根据开发需要进行设置。

perspective 一般作为一个属性,设置给父元素,作用于所有3D转换的子元素

理解透视距离原理:

translateX(x)

仅水平方向移动(X轴移动)

主要目的实现移动效果

translateY(y)

仅垂直方向移动(Y轴移动)

translateZ(z) ( 多做测试理解 )

transformZ的直观表现形式就是大小变化,实质是XY平面相对于视点的远近变化(说远近就一定会说到离什么参照物远或近,在这里参照物就是perspective属性)。比如设置了perspective为200px;那么transformZ的值越接近200,就是离的越近,看上去也就越大,超过200就看不到了,因为相当于跑到后脑勺去了,我相信你正常情况下,是看不到自己的后脑勺的。

translate3d(x,y,z)

其中,x和y可以是长度值,也可以是百分比,百分比是相对于其本身元素水平方向的宽度和垂直方向的高度和;z只能设置长度值

backface-visibility

backface-visibility 属性定义当元素不面向屏幕时是否可见。

案例1:旋转的轮播图

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <style> body { perspective: 1000px; } section { width: 300px; height: 200px; margin: 100px auto; background: url(../3D/images/1.jpg) no-repeat; background-size: cover; position: relative; transform-style: preserve-3d; /* 让父盒子里面的子盒子以3d效果显示 */ transition: 5s linear; /* 匀速 all 是可以省略的, 省略默认的all*/ } section:hover { transform: rotateY(360deg); } section div { width: 100%; height: 100%; background: url(../3D/images/2.jpg) no-repeat; background-size: cover; position: absolute; top: 0; left: 0; } section div:nth-child(1) { transform: rotateY(0deg) translateZ(400px); } section div:nth-child(2) { transform: rotateY(60deg) translateZ(400px); } section div:nth-child(3) { transform: rotateY(120deg) translateZ(400px); } section div:nth-child(4) { transform: rotateY(180deg) translateZ(400px); } section div:nth-child(5) { transform: rotateY(240deg) translateZ(400px); } section div:nth-child(6) { transform: rotateY(300deg) translateZ(400px); } </style>
    </head>
    <body>
	<section>
		<div></div>
		<div></div>
		<div></div>
		<div></div>
		<div></div>
		<div></div>
	</section>
    </body>
</html>

案例2:开门大吉

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style> section { width: 450px; height: 300px; border: 1px solid #000; margin: 100px auto; background: url(images/1.jpg) no-repeat; position: relative; perspective: 1000px; /*给父盒子添加透视效果*/ } .door-l, .door-r { position: absolute; top: 0; width: 50%; height: 100%; background-color: pink; transition: all 1s; /*两个门都做过渡效果*/ background: url(images/bg.png); } .door-l { left: 0; border-right: 1px solid #000; transform-origin: left;/* 左侧盒子按照左边翻转*/ } .door-r { right: 0; left: 1px solid #000; transform-origin: right;/* 右侧盒子按照右边翻转*/ } .door-l::before, .door-r::before { /*伪元素 就是插入一个元素标签*/ content: ''; position: absolute; top: 50%; width: 20px; height: 20px; border: 1px solid #000; border-radius: 50%; /*圆角*/ transform:translateY(-50%); /*translate 如果是百分比, 就是走自己高度的一半*/ } .door-l::before { right: 5px; } .door-r::before { left: 5px; } /*鼠标经过section 盒子 两个门盒子 翻转 rotateY*/ section:hover .door-l { transform: rotateY(-130deg); /*因为往左边翻转,所以是负值*/ } section:hover .door-r { transform: rotateY(130deg); } </style>
</head>
<body>
<section>
    <div class="door-l"></div>
    <div class="door-r"></div>
</section>
</body>
</html>

案例3:导航栏旋转

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>3d导航</title>
  <style type="text/css"> * { margin: 0; padding: 0; } ul { /*取消ul的默认样式*/ list-style: none; margin: 90px auto; width: 800px; } ul li { width: 160px; height: 50px; float: left; position: relative; /*设置子元素显示方式为3d*/ transform-style:preserve-3d; /*设置旋转的过渡效果*/ transition: transform 1s; } li a { position: absolute; /*设置了相对定位的元素,默认具有块元素的特点*/ /*取消a链接的默认下划线*/ text-decoration: none; text-align: center; line-height: 50px; color: #fff; text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.8); top: 0; left: 0; width: 100%; height: 100%; } li a:first-child { transform: translateZ(25px); background-color: #ff5544; } li a:last-child { background-color: skyblue; transform: rotateX(-90deg) translateZ( 25px ); } li:hover { transform: rotateX(90deg); } </style>
</head>
<body>
  <ul>
    <li>
     <a href="#">信息科学与工程学院</a>
     <a href="#">Javaweb专业</a>
    </li>
    <li>
     <a href="#">信息科学与工程学院</a>
     <a href="#">Javaweb专业</a>
    </li><li>
     <a href="#">信息科学与工程学院</a>
     <a href="#">Javaweb专业</a>
    </li><li>
     <a href="#">信息科学与工程学院</a>
     <a href="#">Javaweb专业</a>
    </li><li>
     <a href="#">信息科学与工程学院</a>
     <a href="#">Javaweb专业</a>
    </li>
  </ul>
</body>
</html>

本文地址:https://blog.csdn.net/weixin_45525272/article/details/107355772