黑马程序员技术交流社区

标题: 值得你拥有 [打印本页]

作者: 黑马111111    时间: 2019-10-10 08:34
标题: 值得你拥有
day02 - 移动web开发_H5C31. 学习目标
2. 3D转换(变换)
3d转换是改变标签在3坐标系上的位置和形状的一种技术
我们生活的环境是3D的,照片就是3D物体在2D平面呈现的例子。
3D特点:
2.1 3维坐标系
3维坐标系其实就是指立体空间,立体空间是由3个轴共同组成的  

z轴理解
2.2 3d移动 translate3d
3d移动在2d移动的基础上多加了一个可以移动的方向,就是z轴方向
语法:
代码
    <style>
        
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            /* transform: translateX(100px);
            transform: translateY(100px); */
            /* transform: translateX(100px) translateY(100px) translateZ(100px); */
            /* 1. translateZ 沿着Z轴移动 */
            /* 2. translateZ 后面的单位我们一般跟px */
            /* 3. translateZ(100px) 向外移动100px (向我们的眼睛来移动的) */
            /* 4. 3D移动有简写的方法 */
            /* transform: translate3d(x,y,z); */
            /* transform: translate3d(100px, 100px, 100px); */
            /* 5. xyz是不能省略的,如果没有就写0 */
            transform: translate3d(400px, 100px, 100px);
        }
    </style>
</head>

<body>
    <div></div>
</body>
注意:
因为z轴是垂直屏幕,由里指向外面,所以 默认是看不到元素在z轴的方向上移动,想要看到,可以使用下面的 视距 属性设置

2.3. 视距 perspertive 了解2.3.1 介绍
上图总结
d:视距,眼睛到屏幕的距离,视距与物体大小的关系成反比。   (近大远小  : 视距变小,眼睛离屏幕越来越近,物体离眼睛越来越近,物体变大----近大 )
z:translateZ,物体距离屏幕的距离,z轴距离与物体大小的关系成正比。  (近大远小:translateZ变大,物体离眼睛越近,物体变大 ----- 近大)
z,并不是z轴,其实是translateZ。视距和translateZ其实都是在Z轴上的距离。  
perspective ,透视,理解为视距。 (也可以理解为3D眼睛,给元素添加3D效果,并且想看到,必须带上3D眼睛,给父亲添加perspective )
问题
z轴,是物体距离屏幕的距离,难道物体还能脱离屏幕跑出来么?如上图图1。
物体并不会脱离屏幕,上图中的物体其实是 虚线圆圈,我们真是看到的其实是屏幕上的实线圆圈。
真实情况就是物体与屏幕是没有距离的,但是你要把屏幕里的世界理解为3D世界,那么物体与屏幕就有距离了。那么CSS3就是利用了translateZ来表示物体与屏幕的距离,通过translateZ这个属性让物体变大变小。
网络理解
例子
如 我们想要看到 物体 在z轴上的移动  的 远大近小 效果时  
    /* 父元素 */
    body {
      /* 视距 */
      perspective: 1000px;
    }

    /* 目标 */
    div {
      width: 200px;
      height: 200px;
      background-color: aqua;
      margin: 100px auto;
      /* z轴的移动 */
      transform: translateZ(0px);
    }
注意: 这个效果很像放大效果,但其实是不一样的。
2.3.2. perspertive与translateZ
d:视距,眼睛到屏幕的距离,视距与物体大小的关系成反比。
z:translateZ,物体距离屏幕的距离,轴距离与物体大小的关系成正比。
从上述结果中发现,perspective与translateZ都可以调整物体的大小。那么我们要使用哪个呢?
perspective是给父元素添加的,而translateZ是给自己添加的。
我们可能会碰到这样的情况,一个父盒子中有多个子盒子。我们给父盒子设置一个固定的视距perspective,然后子盒子设置不同的translateZ,这样子盒子就会有一个相同视距下的不同的大小。
而且,物体想实现3D效果,必须添加透视perspective。
如何使用
父元素添加一个固定的perspective,子元素再添加translateZ,才会有3D效果。
必须配合使用。
虽然两个都可以让盒子大小改变,但是必须配合使用才行。
让盒子变大变小,一般不会改变perspective,而是是调整translateZ来改变。

2.3.2. 小结
2.4. 3d旋转 rotate3d2.4.1 介绍
3d旋转指可以让元素在3维平面内沿着 x轴,y轴,z轴或者自定义轴进行旋转  
语法:
transform:rotateX(45deg):沿着x轴正方向旋转 45度
transform:rotateY(45deg) :沿着y轴正方向旋转 45deg
transform:rotateZ(45deg) :沿着Z轴正方向旋转 45deg
transform:rotate3d(x,y,z,deg): 沿着自定义轴旋转 deg为角度(了解即可)
效果如图:
2.4.2 rotateX
效果图:
1. X旋转示例:   <style>
        body {
            perspective: 300px;
        }
        
        img {
            display: block;
            margin: 100px auto;
            transition: all 1s;
        }
        
        img:hover {
            transform: rotateX(45deg); /* 图片向后倒,向屏幕内部倒 */
            transform: rotateX(-45deg); /* 图片向前倾,向屏幕外部倒  */
        }
    </style>
</head>

<body>
    <img src="media/pig.jpg" alt="">
</body>
发现旋转的度数有正负,正负值往哪边旋转,这个是有规律的。我们看左手准则:
2. 左手准则:
对于元素旋转的方向的判断 我们需要先学习一个左手准则
比如要判断某元素沿着x轴是怎么旋转的
总结:rotateX( 正值 ),旋转方向是向后倒,向屏幕里旋转。
2.4.3 rotateY
效果图:
1. Y旋转示例:    <style>
        body {
            perspective: 500px;
        }
        
        img {
            display: block;
            margin: 100px auto;
            transition: all 1s;
        }
        
        img:hover {
            transform: rotateY(45deg); /* 右边向里旋转*/
            transform: rotateY(-45deg); /* 左边向里旋转*/
        }
    </style>
</head>

<body>
    <img src="media/pig.jpg" alt="">
</body>
Y轴方向旋转的正负值,也是影响了旋转的方向,方向如何区分?依然看左手准则:
2. 左手准则:2.4.4 rotateZ
效果图:
1. Z旋转示例:    <style>
        body {
            perspective: 500px;
        }
        
        img {
            display: block;
            margin: 100px auto;
            transition: all 1s;
        }
        
        img:hover {
            transform: rotateZ(180deg); /* 顺时针旋转*/
            transform: rotateZ(-180deg); /* 逆时针旋转*/
        }
    </style>
</head>

<body>
    <img src="media/pig.jpg" alt="">
</body>
2. 左手准则
z轴正方向是屏幕到眼睛的方向,四指的方向是顺时针方向(反之逆时针)
2.4.5 rotate3d-自定义轴 (了解)
语法
transform:rotate3d(x,y,z,deg): 沿着自定义轴旋转 deg为角度(了解即可)
理解
矢量(vector)是一种既有大小又有方向的量,又称为向量。
xyz是矢量,x指定1说明沿着x轴旋转。0说明不沿着x轴旋转。(0,1有大小,又代表x或y或z,也有方向)
代码分析图
2.5 3D呈现 transform-style 2.5.1 介绍
上图效果不佳,看下图:

完整代码
    <style>
        body {
            perspective: 500px; /* 让子盒子有3D效果,其实也可以添加给.box */
        }
        
        .box {
            position: relative;
            width: 200px;
            height: 200px;
            margin: 100px auto;
            transition: all 2s;  /* 悬浮旋转添加过渡效果 */
            /* 让子元素保持3d立体空间环境 */
            transform-style: preserve-3d;
        }
        
        .box:hover { /* 悬浮在外层盒子上,进行y轴旋转 */
            transform: rotateY(60deg);
        }
        
        .box div {  /* 子绝父相,通过定位让俩div与box位置重叠  */
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: pink;
        }
        
        .box div:last-child {/* 第二个div,x轴旋转,向后倒 */
            background-color: purple;
            transform: rotateX(60deg);
        }
    </style>
</head>

<body>
    <div class="box">
        <div></div>
        <div></div>
    </div>
</body>
2.5.2 区别  body {            /*perspective 有继承性 ,可以给父元素,爷爷辈的添加.... */            /* 这个案例,只能给body添加此属性,section和div都需要有近大远小的效果 */            /* 近大远小 */            perspective: 1000px;            /* transform-style 没有继承性,只能给要保持3D效果的元素的直接父元素添加 */            /* 我们现在希望每个div保持3D效果,只能给section添加此属性 */            /* 让子元素保持3D效果 */            /* transform-style: preserve-3d; */        }
2.6 案例案例1:两面翻转的盒子
效果
html结构
<div class="box">    <div class="front">黑马程序员</div>    <div class=“back">pink老师等你</div></div>// box父盒子里面包含前后两个子盒子// box 是翻转的盒子  front是前面盒子 back是后面盒子
css样式
<style>        body {            perspective: 400px;        }                .box {            position: relative;            width: 300px;            height: 300px;            margin: 100px auto;            transition: all .4s;            /* 让背面的紫色盒子保留立体空间 给父级添加的 */            transform-style: preserve-3d;        }                .box:hover {/* 鼠标悬浮,让box沿着Y轴翻转*/            transform: rotateY(180deg);        }                .front,        .back { /* 正反面需要通过定位与父亲box重叠 */            position: absolute;            top: 0;            left: 0;            width: 100%;            height: 100%;            border-radius: 50%;            font-size: 30px;            color: #fff;            text-align: center;            line-height: 300px;        }                .front {            background-color: pink;            z-index: 1; /* 正面需要显示在顶部 */        }                .back {            background-color: purple;            /* 默认back需要是背面显示,因为我们要鼠标悬浮让back翻转过来看到正面,            但是如果不让back默认就是背面显示,那么翻转过来看到的就是back的背面 */            transform: rotateY(180deg);        }    </style>
案例2:3D导航栏
效果
html结构
<ul>    <li>            <div class="box">                <div class="front">黑马程序员</div>                <div class="bottom">pink老师等你</div>            </div>    </li>    <li>            <div class="box">                <div class="front">黑马程序员</div>                <div class="bottom">pink老师等你</div>            </div>    </li>    .......剩下的省略</ul>// li  做导航栏//.box 是翻转的盒子  front是前面盒子 bottom是底下盒子
css样式
   <style>        * {            margin: 0;            padding: 0;        }                ul {            margin: 100px;        }                ul li {            float: left;            margin: 0 5px;            width: 120px;            height: 35px;            list-style: none;            /* 一会我们需要给box 旋转 也需要透视 干脆给li加 里面的子盒子都有透视效果 */            perspective: 500px;        }                .box { /*  让儿子开启3D空间,并且添加悬浮后沿着X旋转和过渡效果  */            position: relative;            width: 100%;            height: 100%;            transform-style: preserve-3d;            transition: all .4s;        }        /* 第三步: */       /* 鼠标悬浮,让盒子开始旋转 */        .box:hover {            transform: rotateX(90deg);        }                .front,        .bottom { /* 前边的盒子和下边的盒子 需要与  父亲box 重叠在一起(我们发现要想做3D效果,都需要有一个父亲,因为 transform-style: preserve-3d 需要给父亲添加,父亲让儿子开启3D空间)  */            position: absolute;            left: 0;            top: 0;            width: 100%;            height: 100%;        }                .front {            background-color: pink;            z-index: 1; /* 默认显示  */            /* 第二步: */            /* 前边的盒子向眼睛的方向走自身高度一半 */            transform: translateZ(17.5px);        }                .bottom {            background-color: purple;            /* 第一步: */            /* 需要让下边的盒子向屏幕外扑倒,所以x轴为负值*/            /* 并且向下走自身高度的一半35/2,y轴向下是正的,所以向下走是正值*/            /* 我们如果有移动 或者其他样式,必须先写我们的移动 */            transform: translateY(17.5px) rotateX(-90deg);        }    </style>
案例3:旋转木马
效果
html结构
<section>    <div></div>    <div></div>    <div></div>    <div></div>    <div></div>    <div></div></section>//里面的6个div 分别是 6个狗狗图片//注意最终旋转是section标签 ,section也有图片,就是那个猪
css样式
  <style>        body {            perspective: 1000px;        }                section { /*让section 旋转360度,一直旋转*/            position: relative;            width: 300px;            height: 200px;            margin: 150px auto;            /*2.2 所有图片都到自己位置之后,保留3D效果*/            transform-style: preserve-3d;            /* 3.2 section添加动画 */            animation: rotate 10s linear infinite;            background: url(media/pig.jpg) no-repeat;        }        section:hover {            /*3.3  鼠标放入section 停止动画 */            animation-play-state: paused;        }        /*第三步,开始处理动画                3.1 先定义动画,沿着Y轴旋转360度              */        @keyframes rotate {            0% {                transform: rotateY(0);            }            100% {                transform: rotateY(360deg);            }        }                section div {            position: absolute;            top: 0;            left: 0;            width: 100%;            height: 100%;            background: url(media/dog.jpg) no-repeat;        }        /* 第一步:让第一个盒子到自己的位置                      往眼睛方向走300px,不需要旋转              */        section div:nth-child(1) {            transform: rotateY(0) translateZ(300px);        }         /* 第二步:2.1 让第后边的五个盒子到自己的位置                      绕着Y旋转60度,朝着眼睛位移的距离一样,都是300px                   为啥是60度?因为有6张图片,需要形成一圈图片,所以每张图片绕着Y轴依次递增旋转60度              */        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);        }    </style>
问题:
为啥这里就需要先旋转再移动了呢?
因为我们需要他们先通过旋转改变了坐标轴的方向,然后再移动,这样才能形成四周散开的效果。
其实可以看一下,如果是先移动,在旋转是啥效果:
3. 浏览器私有前缀
浏览器私有前缀是为了兼容老版本的写法,比较新版本的浏览器无须添加。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2