二、transform(变形)属性

201 阅读6分钟

1. 变形:transform属性

实现元素的位移旋转缩放等效果

1.1 位移:translate属性值

  1. 实现元素位移效果.
  2. translate和margin的区别:
    • margin移动盒子会影响其与盒子,把其他盒子挤走。
    • 位移translate移动盒子不会影响其他盒子,不脱标。

1. 语法

translate()为一个值时默认表示x轴方向移动的距离.

  • 二维空间位移
/* 二维空间 */
transform: translate( x, y );
/* X轴正向为右,Y轴正向为下 */
  • 三维空间位移
/* 三维空间 */
transform: translate3d(x, y, z); 
transform: translateX(值); 
transform: translateY(值); 
transform: translateZ(值);
  • 取值正负均可)

    像素单位(px)

    百分比(参照物为盒子自身尺寸)

  • 应用: 实现元素水平和垂直居中的方式

     .father {
       position: relative;
       width: 500px;
       height: 500px;
       background: pink;
      }
 
 /* 1. 定位+边距(具体像素值) */
     .son {
       position: absolute;
       top: 50%;
       left: 50%;
       margin-top: -100px;
       margin-left: -100px;
       width: 200px;
       height: 200px;
       background-color: purple;
     }
 
 /* 2. 定位+边距(auto) */
     .son {
       position: absolute;
       top: 0;
       left: 0;
       right: 0;
       bottom: 0;
       /* 四周用边距撑开 */ 
       margin: auto;
       width: 200px;
       height: 200px;
       background-color: purple;
     }
 
 /* 3. 定位+位移translate */
     .son {
       position: absolute;
       top: 50%;
       left: 50%;
       /* 
      位移取值为百分比数值,参照盒子自身尺寸计算移动距离
       */
       transform: translate(-50%, -50%);
       width: 200px;
       height: 200px;
       background-color: purple;
     }
   <div class="father">
     <div class="son"></div>
   </div>

1.2 旋转:rotate属性值

实现元素旋转效果。 旋转角度单位是 deg .

1. 语法

  • 二维空间 : 以原点(50% , 50%)为旋转点
transform: rotate(-360deg); /* 逆时针转360度 */
/* 角度单位是deg */

正值顺时针旋转,取负值逆时针旋转.

  • 三维空间
 transform: rotateZ(值);
 transform: rotateX(值);
 transform: rotateY(值);

左手法则来判断旋转方向:

左手握住旋转轴, 拇指指向位移(x,y轴)正值方向, 手指弯曲方向为旋转正值方向。

旋转左手法则.jpg

2. 拓展

  • rotate3d(x, y, z, 角度度数) :用来设置自定义旋转轴的位置及旋转的角度

  • x,y,z 取值为0-1之间的数字

1.3 缩放:scale属性值

改变元素的尺寸,让元素放大缩小。

1. 语法

  • 二维空间
transform: scale(x轴缩放倍数, y轴缩放倍数);
  • 三维空间
transform: scaleX(倍数);
transform: scaleY(倍数);
transform: scaleZ(倍数);
transform: scale3d(x, y, z);
  • 技巧

    transform : scale( 缩放倍数 );

    一般情况下,只为scale设置一个值,表示x轴和y轴等比例缩放

    scale值大于1表示放大,scale值小于1表示缩小

1.4 ( 拓展)倾斜:skew属性值

让元素变倾斜 。

1. 语法

 transform: skew(30deg) ; /* 倾斜度数 */

正值往左倾斜,负值往右倾斜

2. 常见应用:移动的光条

  • 先给盒子背景渐变,左右透明,中间不透明,形成光条;
background-image: linear-gradient(to right, transparent,rgba(255,255,255,.7),transparent);

to + 方向 ,可以改变渐变方向,颜色由深变浅。

默认渐变方向是从上到下(形成的光条是横着的),而我们想要的是从左向右渐变,中间形成竖着的光条,所以用 to right 。

光条.jpg
  • 让光条盒子倾斜;
/* 盒子向右倾斜30度 */
transform: skew(-30deg);
倾斜光条.jpg
  • :hover , 让鼠标经过盒子时显示光条,且移动。
  • 核心代码:
a::before{
         content: '';
         position: absolute;
         top: 0;
         /*left:0; 覆盖在a盒子上*/
         left: -115%;
         width: 100%;
         height: 100%;
         // background-color: pink;
         //倾斜
         transform: skew(-30deg);
         //背景渐变
         background-image: linear-gradient(to right, transparent,rgba(255,255,255,.6),transparent);
     }
a:hover::before{
         transition: all .2s;
         /*鼠标经过a盒子,光条由原来的左边-115%移动到右边115%的位置,完成移动效果*/
         left: 115%;
     }

光条应用.jpg

2. transform-origin属性

改变转换原点,即改变原点的位置.

1. 语法

transform-origin: 原点水平位置(x) 原点垂直位置(y);
/* 默认原点是盒子的中心点 */
transform-origin: 50% 50%;

2. 取值

方位名词:left、top、right、bottom、center.

像素单位(px)

百分比(参照盒子自身尺寸计算)

3. transform复合属性

实现多重转换的效果.

1. 语法

transform: translate() rotate();

2. 多重转换原理 :(先移动,后旋转)

旋转会改变网页元素的坐标轴向, 因此如果先写旋转,则后面的转换效果的轴向以旋转后的轴向为准,会影响转换结果.

4. 三维空间(3D)中的其他属性

4.1 透视: perspective 属性

1. 语法

perspective:  像素值 ;   /* 给父元素添加 */

像素单位数值, 数值一般在 800px – 1200px。

2. 作用

  • 空间转换时,为元素添加近大远小、近实远虚的视觉效果;

  • 视距离也称为视距,所谓的视距就是人的眼睛到屏幕的距离。

  • Z轴是视线方向,移动效果应该是距离的远或近 。

4.2 立体呈现

呈现立体图形

1. 语法

transform-style: preserve-3d ;  /*给盒子父元素添加*/

2. 实现

  • 给盒子父元素添加 transform-style : preserve-3d ;

  • 使子元素处于真正的3d空间 , 默认值flat, 表示子元素处于2D平面内呈现

  • 按需求设置子盒子的位置(位移或旋转)

3. 注意

  • 使用perspective透视属性不能呈现立体图形,perspective只增加近大远小、近实远虚的视觉效果。
  • 空间内,转换元素都有自已独立的坐标轴,互不干扰。

4.3 3D导航

使用立体呈现技巧实现3D导航效果

3D导航.jpg

摆放红绿盒子步骤:

  1. 搭建立方体

    • 绿色盒子是立方体的前面
    • 橙色盒子是立方体的上面
    • 添加hover状态旋转切换效果
  2. 绿色和橙色部分共需要3个标签

    • 1个父级标签
    • 绿色和橙色共2个标签(子级)
  3. 思路

    • li标签
    • 添加立体呈现属性transform-style: preserve-3d;
    • 添加旋转属性(为了便于观察效果,案例完成后删除即可)
    • a标签定位(子绝父相)
      • 英文部分添加旋转和位移样式
      • 中文部分添加位移样
    • 过渡
      • 鼠标滑过li, 添加空间旋转样式
      • li添加过渡属性
  4. :案例完成后,删除li的旋转样式。

实现代码:

css代码:

* {
     margin: 0;
     padding: 0;
     box-sizing: border-box;
   }

   li {
     list-style: none;
   }

   .nav {
     margin: 100px;
   }

   .nav li {
     perspective: 200px;
     float: left;
     width: 150px;
     height: 50px;
     background-color: pink;
     margin: 0 20px;
   }

   .nav li a {
     position: relative;
     display: block;
     width: 100%;
     height: 100%;
     text-decoration: none;
     color: #fff;
     font-size: 18px;
     transition: all 0.3s;
     /* 让子盒子立体空间展示 */
     transform-style: preserve-3d;
   }

   .nav li a span {
     position: absolute;
     left: 0;
     top: 0;
     width: 100%;
     height: 100%;
     text-align: center;
     line-height: 50px;
   }

   .nav li span:nth-child(1) {
     background-color: orange;
     /* 上面盒子  沿着x轴旋转90度, 往上走 y 25px 负值*/
     transform: translateY(-25px) rotateX(90deg);
   }

   .nav li span:nth-child(2) {
     background-color: green;
     /* 往我们面前移动 25px, z轴   正值*/
     transform: translateZ(25px);
   }

   .nav li a:hover {
     transform: rotateX(-90deg);
   }

html代码:

<div class="nav">
   <ul>
     <li>
       <a href="">
         <span>index</span>
         <span>首页</span>
       </a>
     </li>
     <li>
       <a href="">
         <span>index</span>
         <span>首页</span>
       </a>
     </li>
     <li>
       <a href="">
         <span>index</span>
         <span>首页</span>
       </a>
     </li>
     <li>
       <a href="">
         <span>index</span>
         <span>首页</span>
       </a>
     </li>
   </ul>
 </div>