CSS @keyframes详解
引言
CSS @keyframes 是一种用于创建动画的常用技术。它允许我们对元素的属性进行逐帧的控制,从而实现各种各样的动画效果。本文将详细介绍 @keyframes 的用法和相关属性,帮助读者理解和运用这一强大的特性。
什么是@keyframes
@keyframes 是 CSS 中用于定义动画的关键帧规则。关键帧是动画过程中特定时间点的状态,而关键帧规则则定义了这些时间点的属性值。通过在 @keyframes 中指定关键帧的百分比和目标属性值,CSS 引擎可以逐渐改变元素的样式,从而实现平滑的动画效果。
基本语法
@keyframes 规则由关键帧选择器和一系列的 CSS 规则组成。关键帧选择器用于指定动画效果在何时何处执行。下面是一个典型的 @keyframes 规则的格式:
@keyframes animationName {
from {
/* 初始状态 */
property: value;
}
to {
/* 终止状态 */
property: value;
}
/* 或者使用百分比指定关键帧 */
50% {
/* 中间状态 */
property: value;
}
/* 可以指定多个关键帧 */
75% {
/* 中间状态 */
property: value;
}
}
在上述示例中,animationName
是动画的名称,可以根据需求自行命名。由于 @keyframes 中定义了多个状态,我们可以根据百分比或关键帧选择器来设置不同时间点的属性值。关键帧选择器可以是百分比,也可以是关键字如 from
和 to
。在动画执行过程中,CSS 引擎会根据关键帧选择器指定的时间点计算出相应的属性值。
关键帧选择器
百分比
在 @keyframes 中,我们可以使用百分比来指定关键帧选择器。百分比值表示动画执行的时间进度,可以从 0% 到 100% 进行设置。我们可以根据需求选择多个百分比值,CSS 引擎会在这些时间点上进行插值计算,从而产生平滑的过渡效果。
以下是一个示例,展示了一个简单的闪烁动画效果:
@keyframes blink {
0%, 50% {
opacity: 1;
}
25%, 75% {
opacity: 0;
}
100% {
opacity: 1;
}
}
在上述示例中,blink
是动画的名称。我们定义了四个关键帧选择器:0%、50%、25%、75% 和 100%。属性 opacity
在这些关键帧选择器上有不同的取值,CSS 引擎会根据这些关键帧选择器的时间点计算 opacity
的过渡值。
关键字 from 和 to
除了百分比,我们还可以使用两个关键字 from
和 to
,来指定初始状态和终止状态的关键帧选择器。
@keyframes fadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
在上例中,fadeOut
是动画的名称。我们使用了关键字 from
(相当于 0%)和 to
(相当于 100%)来定义了两个关键帧选择器。属性 opacity
在这两个关键帧选择器上有不同的取值,CSS 引擎会根据动画的执行时间计算逐渐改变的 opacity
值。
动画属性
animation-name
animation-name
属性用于指定要应用的动画名称。它接受一个或多个动画名称,多个名称使用逗号分隔。如果要在一个元素上同时应用多个动画,可以分别定义不同的 @keyframes 规则,并将动画名称组合在 animation-name
中。
animation-duration
animation-duration
属性用于指定动画的持续时间。它接受一个时间值,单位可以是秒(s)或毫秒(ms)。默认值是 0,意味着动画没有持续时间。
animation-timing-function
animation-timing-function
属性控制动画的时间进度。它接受一个或多个关键字或自定义的贝塞尔函数。常用的关键字有:linear
(线性)、ease
(缓入缓出)、ease-in
(缓入) 、ease-out
(缓出)和 ease-in-out
(缓入缓出)。如果需要更细致的时间曲线,可以使用贝塞尔函数来定义。
下面是一个示例,展示了不同 animation-timing-function
值对动画效果的影响:
@keyframes move {
from {
transform: translateX(0);
}
to {
transform: translateX(100%);
}
}
#box1 {
animation-name: move;
animation-duration: 2s;
animation-timing-function: linear;
}
#box2 {
animation-name: move;
animation-duration: 2s;
animation-timing-function: ease-in-out;
}
#box3 {
animation-name: move;
animation-duration: 2s;
animation-timing-function: cubic-bezier(0.5, 0.25, 0.75, 0.9);
}
在上述示例中,我们定义了一个移动动画 move
,将一个元素从左侧移动到右侧。然后我们分别将三个元素 #box1
、#box2
和 #box3
应用了这个动画,但使用了不同的 animation-timing-function
值。
#box1
使用了 linear
,它使得动画在整个过程中保持匀速。
#box2
使用了 ease-in-out
,它使得动画在开始和结束时变慢,中间时变快。
#box3
使用了自定义贝塞尔函数cubic-bezier(0.5, 0.25, 0.75, 0.9)
,它控制了动画时间进度的细节。
animation-delay
animation-delay
属性用于指定动画的延迟时间。它接受一个时间值,单位可以是秒(s)或毫秒(ms)。默认值是 0,意味着动画将立即开始。
animation-iteration-count
animation-iteration-count
属性用于指定动画的循环次数。它接受一个整数值或关键字值 infinite
。默认值是 1
,表示动画只执行一次。如果将值设为 infinite
,动画将无限循环直到被停止。
animation-direction
animation-direction
属性用于指定动画的播放方向。它接受一些预定义的关键字,如 normal
(正常播放)、reverse
(反向播放)和 alternate
(交替播放)。默认值是 normal
。可以通过组合多个关键字来实现更复杂的播放方式,例如 alternate-reverse
(交替反向播放)。
animation-fill-mode
animation-fill-mode
属性用于指定动画的填充模式。当动画不在播放时,指定如何显示元素的样式。它接受一些预定义的关键字,如 none
(无填充) 、forwards
(保留最后一个关键帧的样式) 、backwards
(保留第一个关键帧的样式) 和 both
(同时保留第一个和最后一个关键帧的样式)。默认值是 none
。
animation-play-state
animation-play-state
属性用于控制动画的播放状态。它接受一些预定义的关键字,如 running
(播放中)和 paused
(暂停)。通过改变值,可以动态控制动画的播放和暂停。
animation属性的缩写
为了简化代码,CSS 提供了一个 animation
属性,用于同时设置所有与动画相关的属性。它的语法如下:
animation: name duration timing-function delay iteration-count direction fill-mode play-state;
以下是一个示例:
#box {
animation: move 2s ease-in-out 0s infinite alternate backwards running;
}
在上述示例中,#box
元素应用了一个名为 move
的动画,动画持续时间为 2 秒,使用了缓入缓出的时间函数,没有延迟,无限循环,交替播放,保留第一个关键帧的样式,并且处于播放状态。
使用@keyframes创建动画
使用 @keyframes 和相关的动画属性,我们可以创建各种炫酷的动画效果。下面是一个示例,展示了一个简单的平移和旋转动画:
@keyframes slideAndRotate {
0% {
transform: translateX(0);
}
50% {
transform: translateX(200px) rotate(180deg);
}
100% {
transform: translateX(400px) rotate(360deg);
}
}
#box {
animation-name: slideAndRotate;
animation-duration: 4s;
animation-timing-function: ease-in-out;
animation-delay: 1s;
animation-iteration-count: infinite;
animation-direction: alternate;
}
在上述示例中,我们定义了一个名为 slideAndRotate
的动画,它会使元素进行平移和旋转。#box
元素应用了这个动画,持续时间为 4 秒,使用了缓入缓出的时间函数,延迟 1 秒开始,无限循环,交替播放。
总结
CSS @keyframes 是一种用于创建动画的重要技术。通过定义关键帧选择器和属性值,我们可以控制元素在动画过程中的状态和变化。动画属性可以进一步调整动画的持续时间、时间函数、延迟、循环次数等。通过灵活运用 @keyframes 和相关属性,我们可以创造出各种令人惊艳的动画效果。