009-CSS 动画有哪些

前言

css 实现动画的方式有如下几种:

  • transition 实现渐变动画
  • transform 过渡动画
  • animation 实现自定义动画

transition

  • property:需要赋予过渡动画的属性,如 width、height 等。
  • duration:过渡动画所需的时间。
  • timing-function:过渡效果。
  • delay:过渡效果开始作用之前需要等待的时间。

timing-function 的值如下表格:

描述
linear匀速进行(等同 cubic-bezier(0, 0, 1, 1)
ease由慢到快再到慢(等同 cubic-bezier(.25, .1, .25, 1)
ease-in由慢到快(等同 cubic-bezier(.42, 0, 1, 1)
ease-in-out由快到慢(等同 cubic-bezier(.42, 0, .58, 1)
ease-out越来越慢(等同 cubic-bezier(0, 0, .58, 1)
cubic-beziercubic-bezier 函数中定义自己的值,可能的值是 0 至 1 之间的数值

鼠标移动上去发生过渡动画效果,举个例子:

<div class="box"></div>
.box {
  width: 50px;
  height: 10px;
  cursor: pointer;
  background-color: #0ff;
  transition: width .2s ease;

  &:hover {
    width: 200px;
  }
}

transform

常用的功能如下:

  • translate:平移
  • rotate:旋转
  • scale:缩放
  • skew:倾斜

它常和 transition 配合使用,下面举个例子:

<div class="box"></div>
.box {
  width: 50px;
  height: 50px;
  cursor: pointer;
  background-color: #0ff;
  transition: all .2s ease;

  &:hover {
    transform: scale(.8, 1.5) translate(150px, 10px) rotate(90deg) skew(10deg);
  }
}

运行上面代码的结果是盒子放大、平移、旋转、倾斜。

animation

它的属性如下表格:

属性名描述属性值
animation-name指定 @keyframes 动画的名称
animation-duration指定一个动画周期的时长,默认值为 0s,表示无动画
animation-timing-function指定动画计时函数,即动画的速度曲线,默认是 easelinear、ease、ease-in、ease-out、ease-in-out
animation-delay定义动画于何时开始,默认是 0
animation-iteration-count定义动画在结束前运行的次数 可以是 1 次 无限循环infinite(无限次)
animation-direction指示动画是否反向播放normal、reverse、alternate、alternate-reverse
animation-fill-mode设置 CSS 动画在执行之前和之后如何将样式应用于其目标forwards、backwards、both
animation-play-state指定动画播放状态,正在运行或暂停。默认是 runningrunning、pauser

通过 @keyframes 来定义关键帧,例如让一个元素旋转一周,如下:

<div class="box">6</div>
.box {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 50px;
  height: 50px;
  background-color: red;
  border-radius: 50%;
  animation: my-animation 2s;
}

// 方法一
@keyframes my-animation {
  0% {
    transform: rotate(0deg);
  }
  50% {
    transform: rotate(180deg);
  }
  100% {
    transform: rotate(360deg);
  }
}

// 方法二
// @keyframes my-animation {
//   from {
//     transform: rotate(0deg);
//   }
//   to {
//     transform: rotate(360deg);
//   }
// }

上面两种方法均可达到旋转一周的效果,其中 from 表示最开始的那一帧,to 表示结束时的那一帧。

部分答案整理自网络资源