CSS进阶4 | 青训营笔记

76 阅读6分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 5 天

2D转换transform

  1. 转换(transform):可以实现元素的位移(translate)、旋转(rotate)、缩放(scale)等效果
  2. 2D转换是改变标签在二维平面上的位置和形状的一种技术

移动translate

移动盒子的位置:定位、外边距(浮动是布局,还是得靠外边距)、2D转换

  1. translate(x,y)
  2. translateX(x)
  3. translateY(y)
div {
        width: 200px;
        height: 200px;
        background-color: pink;

/* 1. x就是x轴移动位置,y就是y轴移动位置(带单位) */
        /* transform: translate(x,y); */
        transform: translate(100px, 100px);

/* 2. 只动X轴(带单位) */
        /* transform: translateX(n); */
        transform: translateX(100px);

/* 3. 只动Y轴(带单位) */
        /* transform: translateY(n); */
        transform: translateY(100px);

}

重点:

  1. 最大的优点:不会影响到其他元素的位置
  2. 百分比单位相对于自身元素(盒子自身的宽度或高度来对比的)
  3. 对行内标签没有效果

旋转rotate

transform:rotate(度数)

  • rotate里面跟度数,单位deg,不可省略
  • 角度为正时顺时针,负为逆时针
  • 默认旋转的中心点是元素的中心点
<style>
      img {
        width: 300px;
        border-radius: 50%;
        border: 5px solid pink;
        /*和transition过渡一起结合使用 */
        transition: all 1s;
      }

      img:hover {
        transform: rotate(360deg);
      }
</style>

缩放scale

transform:scale(x,y);

  • 两个参数用逗号分隔,不带单位,是倍数的意思
  • transform:scale(1,1) 均放大一倍,相当于没有变化
  • transform:scale(2) 只写一个参数,那么第二个参数等于第一个参数(2,2)
  • transform:scale(0.5,0.5)缩小
  • 缩放最大的优势:可以设置转换中心点缩放,默认元素中心点

(直接设置宽高缩放,其中心点是元素的左上角,会影响其他盒子)

  • 不会影响其他盒子
div {
        width: 200px;
        height: 200px;
        background-color: pink;
        margin: 200px auto;
      }

      div:hover {
        transform: scale(2, 2);
}

设置转换的中心点transform-origin

transform-origin:x y;(同时适用于三个属性)

  • 两个参数用“空格”隔开
  • 默认的中心点是50% 50% 元素中心点
  • 可以给参数设置像素或者方位名词
div {
        width: 200px;
        height: 200px;
        background-color: pink;
        margin: 100px auto;
        transition: all 2s;

        /* transform-origin: left bottom; */
        transform-origin: 0px 200px;

}

      div:hover {
        transform: rotate(360deg);
}

综合性的写法transform:translate() rotate() scale();

  • 有顺序问题:当同时有位移和其他属性时,记得将唯一放在最前面
div:hover {

    /* 两种写法动画效果不一样,最好移动放前面 */
    /* transform: translate(150px, 150px) rotate(180deg); */

    transform: rotate(180deg) translate(150px, 150px);
}

动画animation

可通过设置多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果

相比于过渡:动画实现更多变化,更多控制,连续自动播放等效果

  1. 先用keyframes定义动画(类似定义类选择器)
 /* 页面一打开,一个盒子从左边走到右边 */

      /* 1.定义动画 */
      @keyframes move {
        0% {
          /* 动画开始的样式 */
          transform: translateX(0px);
        }
        100% {
          /* 动画结束的样式 */
          transform: translateX(1000px);
        }
      }
  1. 元素使用动画
div {
        width: 200px;
        height: 200px;
        background-color: pink;

        /* 2.元素使用动画 */
        /* 调用动画 */
        animation-name: move;
        /* 动画持续时间 */
        animation-duration: 3s;

}

动画序列

0%(from)是动画的开始,100%(to)是动画的完成 ---> 动画序列(多个状态的变化)

从一种样式逐渐变化为另一种样式的效果,期间可以改变任意多的样式任意多的次数

 @keyframes move {
        0% {
          transform: translate(0px, 0px);
        }
        25% {
          transform: translate(1000px, 0px);
        }
        50% {
          transform: translate(1000px, 500px);
        }
        75% {
          transform: translate(0px, 500px);
        }
        100% {
          transform: translate(0px, 0px);
        }
}

动画属性

  1. @keyframes :定义动画
  2. animation :所有动画的复合属性,除了animation-play-state
  3. animation-name :动画名称
  4. animation-duration :动画持续时间,默认0
  5. animation-timing-function :动画的速度曲线,默认ease
  6. animation-delay :动画何时开始,默认0
  7. animation-iteration-count :动画被播放的次数,默认1,还有infinite
  8. animation-direction :规定动画是否在下一周期逆向播放,默认normal,alternate逆播放
  9. animation-play-state :动画是否正在运行(running)或暂停(pause),默认running
  10. animation-fill-mode :动画结束后状态,保持forwards,回到起始backwards
div {
        width: 200px;
        height: 200px;
        background-color: pink;

        /* 2.元素使用动画 */
        /* 调用动画 */
        animation-name: move;
        /* 动画持续时间 */
        animation-duration: 10s;
        /* 动画的速度曲线 */
        animation-timing-function: ease;
        /* 动画何时开始 */
        animation-delay: 2s;
        /* 动画播放次数 */
        animation-iteration-count: 3;
        /* 动画在下一周期是否反向播放 */
        animation-direction: alternate;
        /* 动画结束后状态 */
        animation-fill-mode: forwards;

/* 复合简写属性:前两个必须写 不能省略 */
        animation: move 3s linear 0s 3 normal forwards;
}

复合属性的简写形式

animation:动画名称 持续时间 运动曲线 何时开始 播放次数 是否反方向 动画结束状态


3D转换

  • 近大远小
  • 物体后面遮挡不可见

三维坐标系

  • x轴:水平向右
  • y轴:垂直向下
  • z轴:垂直屏幕往外(往外面是正值,往里面是负值)

3D移动translate3d

  • translateX(x):仅仅在x轴移动
  • translateY(y):仅仅在y轴移动
  • translateZ(z):仅仅在z轴移动(一般用px为单位)结合透视才能看到效果
  • translate3d(x,y,z)
 body {
        perspective: 200px;
} 

div {
        width: 300px;
        height: 300px;
        background-color: pink;

        transform: translateX(100px) translateY(100px) translateZ(100px);

/* 复合属性  translate3d */
        transform: translate3d(100px,100px,100px);
}

/* z轴值:100px     d视距值:200px*/

透视perspective

  • 在2D平面产生近大远小的视觉立体效果
  • 透视也称视距(d):人眼睛到屏幕的距离(d越大,物体越小,d越小,物体越大)
  • 距离视觉点越近的在电脑平面成像越大,越远成像越小
  • 透视的单位是像素

透视写在被观察元素的父盒子上面的

当d视距值<=Z值时,物体会消失

body {
        animation: perspective 2s infinite alternate linear;
}

      div {
        width: 100px;
        height: 100px;
        background-color: pink;
        margin: 100px auto;
        /* transform: translateX(100px) translateY(100px) translateZ(100px); */
        transform: translateZ(100px);
      }

      @keyframes perspective {
        0% {
          perspective: 200px;
        }
        100% {
          perspective: 500px;
        }

}

3D旋转rotate3d

3D旋转可以让元素在三维平面内沿着x轴、y轴、z轴或者自定义轴进行旋转

  • rotateX(xdeg)
  • rotateY(ydeg)
  • rotateZ(zdeg)
  • rotate3d(x,y,z,deg)自定义轴

正负值方向-左手准则(大拇指指向轴正向,四指为正值方向)

绕哪个轴旋转,那么该轴上坐标不动,另外两个轴取对应值

img:hover {
        /* transform: rotateZ(180deg); */
        /* transform: rotateX(180deg); */
        /* transform: rotateY(180deg); */
        transform: rotate3d(1, 1, 0, 180deg);
}

3D呈现transform-style

  • 控制子元素是否开启三维立体环境(preserve-3d开启,flat不开启默认)
  • 代码写在父级,但影响的是子盒子
      .box {
        position: relative;
        width: 200px;
        height: 200px;
        margin: 100px auto;
        perspective: 500px;
        transition: all 1s;

        /* 让子元素保持3d效果 */
        transform-style: preserve-3d;
      }

浏览器私有前缀

是为了兼容老版本的写法,比较新版本的浏览器无需添加

  • -moz- :代表火狐firefox浏览器的私有属性
  • -ms- :代表ie浏览器的私有属性
  • -webkit- :代表safari、chrome浏览器的私有属性
  • -o- :代表Opera浏览器的私有属性
 /* 正常写法 */
        border-radius: 10px;
        /* 兼容写法 */
        -moz-border-radius: 10px;
        -webkit-border-radius: 10px;
        -o-border-radius: 10px;