吃饭用的前端

html5和css3新特性之图形变换

2019-03-18  本文已影响0人  CNLISIYIII

    今日学习内容:2D转换之位移、旋转(包括旋转原点的设置)、缩放、倾斜;3D转换之位移、旋转、缩放、倾斜。

    总结如下要点:


(一)2D转换

    (若想看到变换效果,要给图形的盒子设置过渡 transition: 3s

1.位移

语法 => transform: translate(x,y);

    其中x表示水平方向的位移(即左右),y表示垂直方向的位移(即上下)。

    括号内最多只能有2个值,当只有1个值的时候表示水平位移。

    值的大小可以为正数,也可以为负数。当值为负数的时候向反方向移动。

    值的单位可以为像素(如100px,-100px),也可以为百分比(如50%,-50%)。当值用百分比来表示的时候,参照的是元素translate所在盒子的大小。

    translate属性不脱标!

2.旋转

语法 => transform:rotate();

    括号内表示旋转的角度,必须使用单位deg。

    当括号内的值为正数时,表示顺时针旋转;为负数时,表示逆时针旋转。

3.旋转原点的设置

语法 => transform-origin: x y;

    其中x表示水平方向,值可以设置为方位值left,center,right;或者像素px;或者百分数%。

    y表示垂直方向,值可以设置为方位值top,center,bottom;或者像素px;或者百分数%。

    当x或y的值为负数时,旋转原点在盒子之外。

    默认旋转原点为所在盒子的中心点:center center。(x和y之间用空格隔开。)

代码举栗:

<!-- 当鼠标进入path盒子时,风火轮自动向右转动;鼠标移出时风火轮复原 -->

<body>

     <div class="path"> 

        <div class="wheel"> 风火轮 </div> 

    </div>

</body>

<style>

/* 此处省略path及风火轮样式,设置鼠标进入盒子时的样式 */

    .path:hover .wheel {

        /* translate()中只有一个值,表示水平移动,上下不动 */

        /* rotate()中设置为3600度表示转动十圈 */

        transform: translate(1000px) rotate(3600deg);

    }

    如上所示。如果既要发生位移又要发生旋转,必须在同一个transform内同时设置多个属性,用空格隔开,不能分开写成两个transform,因为分开写成两个后会使样式发生重叠,展示最后定义的transform。

4.缩放

语法 => transform: scale(x,y);

    其中x表示水平方向(改变图形的宽度),y表示垂直方向(改变图形的高度)。当括号内只有一个值的时候,图形的宽和高同步变换。

    括号里的值为数字:(值的正负不会影响图形变换)

    1)值=0时,图形消失;

    2)0<值<1时,图形缩小为原来的几倍;

    3)值=1时,图形不变;

    4)值>1时,图形放大为原来的几倍;

5.倾斜

 语法 => transform: skew(x,y);

    其中x表示左右倾斜(左边和右边),上下两条边保持水平(常用)。y表示上下倾斜(上边和下边),左右两条边保持垂直。只有一个值的时候默认为左右倾斜。

    值的单位为deg,表示倾斜度数。如60deg。

    如果想要盒子内部的某些内容不倾斜,需要单独设置:给字内容加标签,然后设置transform: skew()内的值为负的父标签的值。(如果给字内容加的标签为行内元素如span,需要用display: blockdisplay: inline-block转换成块级元素或行内块元素。)

代码举栗:

<!-- 用图形倾斜代替添加背景图片可以加快加载速度 -->

<body>

     <ul>

         <li> <a href="#"> <span>首页</span> </a> </li> <li>

        <!-- 此处省略7个 li>a>span -->

    </ul>

</body>

<style>

    /* 省略ul和a标签的css样式设置 */

    li {

        float: left;

        background: black;

        margin-right: 20px;

        transform: skew(-20deg);

    }

    li a span { 

        display: block; 

        transform: skew(20deg); 

    }

</style>

6.盒子居中的方法总结

    盒子居中要用到“子绝父相”。即子元素设置 position: absolute; 父元素设置 position: relative; 然后设置left、top、margin等值:

    1)left: 0;

          right: 0;

          top: 0;

          bottom: 0;

          margin: auto;

    2)lef: 50%;

          top: 50%;

          margin-left: -自身宽度一半;

          margin-top: -自身宽度一半;

    3)left: 50%;

          top: 50%;

          transform: translate(-50%, -50%);


(二)3D转换

3D坐标系

1.位移

语法 => transform: translateX() translateY() translateZ();

    增加了Z轴属性 transform: translateZ();

    括号内的值为正数时,表示离我越来越近,图形变大;值为负数时,表示离我越来越远,图形变小。简称近大远小

近大远小

    添加translateZ属性后,如果想要看到效果,需要给添加了transform: translateZ()属性的元素的上级元素(不一定就是父盒子)加透视 perspective: 600px; (perspective值一般为600px~1000px)。

    添加透视的目的是为了看到近大远小的效果。

2.旋转

语法 => transform:rotateX(20deg) rotateY(20deg) rotateZ(20deg);

    需要添加透视、过渡属性来看到效果。

3D旋转图解

    如图,箭头的指向即为要设置为正值的方向。

代码举栗:

    <!-- 简单的前后两面立方体旋转 -->

<body>

    <!-- 外层的盒子 -->

    <div class="box">

        <!-- 真正产生效果的盒子 -->

        <div>前</div>

        <div>后</div>

    </div>

</body>

<style>

    body {   

        perspective: 600px;       /* 给上级元素设置透视才能看到效果 */

    }

    /* 外层父盒子,代表完整的立体空间 */

    .box {

        width: 200px;

        height: 200px;

        /* border: 1px solid; */     /* 不想展示出旋转轴就把boder去掉 */

        margin: 200px auto;

        position: relative;

        transition: 3s;     /* 设置过渡 */

        transform-style: preserve-3d;    /* 设置3D空间 告诉浏览器3d还是2d*/

    }

    /* 前后两个盒子共同属性 */

    .box div {

        width: 200px;

        height: 200px;

        position: absolute;

    }

    /* 前红 */

    .box div:nth-child(1){

        background: red;

        z-index: 1;     /* 层叠级次低被blue覆盖,加z-index。默认为0 */

        transform: translateZ(100px);

    }

    /* 后蓝 */

    .box div:nth-child(2){

        background: blue;

        transform: translateZ(-100px) rotateY(180deg);

    }

    .box:hover {

        transform: rotateY(180deg);     /* 鼠标移入父盒子时父盒子转动 */

    }

    如上。3D立方体一定要有一个父盒子包裹起来才能使用(代码中的.box)

    只有给父盒子标记为3d盒子,添加 transform-style: preserve-3d;才能有效果。(代码第22行)

    translateZ()表示前后,前后在哪里与盒子当时的正面方向有关。

    如代码 transform: translateZ(-100px) rotateY(180deg); 中,先旋转再位移与先位移再旋转得到的效果不同,因为参照轴是不一样的。

3.缩放

语法 => transform: scaleX() 或 scaleY() 或 scaleZ();

scaleX()和scaleY()于2D变换一样。scaleZ()改变的是立方体的厚度(前后的距离),只在3D空间下才有效。

4.倾斜

语法 => transform: skewX(度数deg) 或 skewY(度数deg);

    skewX和skewY可以分成两个transform来写。

    3D变换中Z没有倾斜属性。

上一篇下一篇

猜你喜欢

热点阅读