css 中的 animation、transition、transform详解

1,003 阅读5分钟

一、CSS Animation

CSS animation 是一个强大的属性,允许开发者创建基于关键帧的动画。在传统的 JavaScript 中,动画效果通常需要依赖定时器或者 requestAnimationFrame 来进行动画的更新,而 CSS animation 提供了更简洁的方式,通过定义关键帧让元素在一定时间内完成一系列的变换。

1.1 @keyframes 规则

在使用 CSS animation 时,首先需要定义一个 @keyframes 规则,来描述元素在动画过程中各个时间点的状态。关键帧通过 from(起始状态)和 to(结束状态)来定义,或者通过百分比来设定中间的状态。

@keyframes example {
  0% {
    transform: rotate(0deg);
    opacity: 1;
  }
  50% {
    transform: rotate(180deg);
    opacity: 0.5;
  }
  100% {
    transform: rotate(360deg);
    opacity: 1;
  }
}

.box {
  animation: example 4s infinite;
}

在上面的例子中,我们定义了一个旋转动画,元素从 0 度旋转到 360 度,并且在旋转过程中改变其透明度。

1.2 animation 属性

animation 属性用于控制动画的各种参数,包括动画名称、持续时间、延迟时间、次数等。它的语法如下:

element {
  animation: name duration timing-function delay iteration-count direction fill-mode;
}
属性作用示例
animation-name指定关键帧名称slide-in
animation-duration动画持续时间2s
animation-timing-function速度曲线ease-in-out
animation-delay动画延迟时间0.5s
animation-iteration-count播放次数infinite(无限循环)
animation-direction播放方向(正向/反向/交替)alternate
animation-fill-mode动画结束后的样式保留方式forwards

例如,下面的代码展示了一个 5 秒的动画,动画每次播放时会发生反向循环:

@keyframes bounce {
  0% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-30px);
  }
  100% {
    transform: translateY(0);
  }
}

.box {
  animation: bounce 5s ease-in-out infinite reverse;
}

1.3 关键帧的进阶应用

除了基本的 fromto,我们还可以在 @keyframes 中使用任意百分比值来精确控制动画的中间状态。例如,创建一个颜色渐变动画:

@keyframes colorChange {
  0% {
    background-color: red;
  }
  50% {
    background-color: yellow;
  }
  100% {
    background-color: blue;
  }
}

.box {
  animation: colorChange 4s infinite;
}

二、CSS Transition

CSS transition 是另一种实现动画效果的方式,它与 animation 相比更加简洁,适用于元素在状态变化时的平滑过渡。transition 适用于由用户行为触发的动态效果,例如鼠标悬停、焦点获取、点击事件等。

2.1 transition 属性

transition 属性定义了元素在不同状态之间过渡的时间、过渡效果等。其语法如下:

element {
  transition: property duration timing-function delay;
}
  • property: 需要过渡的属性,常见的如 allwidthopacity 等。
  • duration: 过渡的持续时间。
  • timing-function: 过渡的速率函数,类似于 animation 中的 timing-function
  • delay: 过渡的延迟时间。

例如,下面的代码展示了鼠标悬停时,按钮颜色平滑变化的效果:

.button {
  background-color: blue;
  transition: background-color 0.3s ease;
}

.button:hover {
  background-color: green;
}

2.2 多重过渡

我们可以在同一个元素上设置多个过渡效果,每个过渡效果针对不同的属性进行平滑过渡:

.box {
  width: 100px;
  height: 100px;
  background-color: red;
  transition: width 0.5s ease, height 0.5s ease, background-color 0.3s ease;
}

.box:hover {
  width: 150px;
  height: 150px;
  background-color: yellow;
}

2.3 transitionhover 的结合

CSS transition 经常与 hover 伪类结合使用,实现按钮、链接等元素的交互效果。利用 hover 实现的动态效果,能够增强用户的交互体验。

a {
  color: blue;
  text-decoration: none;
  transition: color 0.3s ease, text-decoration 0.3s ease;
}

a:hover {
  color: red;
  text-decoration: underline;
}

2.4 transition 和 JavaScript 结合

虽然 transition 本身是 CSS 驱动的,但也可以通过 JavaScript 动态修改 CSS 属性,触发 transition 动画。例如,当点击按钮时,触发元素的尺寸变化:

<button onclick="resizeBox()">Click Me</button>
<div class="box"></div>
<script>
  function resizeBox() {
    document.querySelector('.box').style.width = '200px';
    document.querySelector('.box').style.height = '200px';
  }
</script>
.box {
  width: 100px;
  height: 100px;
  background-color: red;
  transition: width 0.5s ease, height 0.5s ease;
}

三、CSS Transform

CSS transform 是对元素进行平移、旋转、缩放等变化的强大工具。与 animationtransition 配合使用时,transform 可以实现各种炫酷的效果,尤其是在用户交互时。

3.1 基本的 transform 属性

CSS transform 允许元素进行多种类型的变换,包括:

  • translate(x, y): 平移元素,xy 分别是沿 X 轴和 Y 轴的平移距离。
  • rotate(deg): 旋转元素,单位为度数。
  • scale(x, y): 缩放元素,xy 分别是水平和垂直方向的缩放因子。
  • skew(x, y): 倾斜元素,xy 是水平和垂直方向的倾斜角度。
  • matrix(a, b, c, d, e, f): 通过 2D 矩阵对元素进行任意的变换。

例如,以下代码将元素在鼠标悬停时放大并旋转:

.box {
  width: 100px;
  height: 100px;
  background-color: red;
  transition: transform 0.3s ease;
}

.box:hover {
  transform: scale(1.5) rotate(45deg);
}

3.2 组合 transform 操作

我们还可以将多种 transform 操作组合在一起,创造更加复杂的效果:

.box {
  width: 100px;
  height: 100px;
  background-color: red;
  transition: transform 0.5s ease;
}

.box:hover {
  transform: translateX(50px) rotate(30deg) scale(1.2);
}

3.3 transform 与 3D 效果

transform 不仅限于 2D 变换,还支持 3D 变换,通过 perspectiverotateXrotateY 等属性可以实现深度效果。

.container {
  perspective: 1000px;
}

.box {
  width: 100px;
  height: 100px;
  background-color: red;
  transform: rotateY(0);
  transition: transform 1s;
}

.box:hover {
  transform: rotateY(180deg);
}

四、总结

在 CSS 中,animationtransitiontransform 是实现动态效果和交互的重要工具。animation 提供了基于关键帧的动画效果,transition 用于元素状态变化时的平滑过渡,而 transform 则允许我们对元素进行各种空间变换。通过巧妙地组合和使用这些属性,可以在网页中创建丰富的用户体验,提升界面的交互性和吸引力。

  1. animation 适合用于复杂的、多步骤的动画效果,可以定义多个时间点的状态变化,适用于持续性或复杂的动画效果。
  2. transition 则是针对元素状态变化(如鼠标悬停)时的平滑过渡,适合用于简短、简洁的过渡效果。
  3. transform 提供了灵活的平移、旋转、缩放等变换操作,可以用来增强页面元素的动态表现。