动画

试试看

组成属性

语法

css
/* @keyframes duration | easing-function | delay |
iteration-count | direction | fill-mode | play-state | name */
animation: 3s ease-in 1s 2 reverse both paused slidein;

/* @keyframes duration | easing-function | delay | name */
animation: 3s linear 1s slidein;

/* two animations */
animation:
  3s linear slidein,
  3s ease-out 5s slideout;

animation 属性指定为一个或多个单个动画,用逗号分隔。

每个单独的动画指定为

注意:animation-timelineanimation-range-startanimation-range-end 目前未包含在此列表中,因为当前的实现仅重置。这意味着包含 animation 会将先前声明的 animation-timeline 值重置为 auto,并将先前声明的 animation-range-startanimation-range-end 值重置为 normal,但无法通过 animation 设置这些属性。在创建 CSS 滚动驱动的动画 时,需要在声明任何 animation 简写之后声明这些属性,才能使其生效。

<single-easing-function>

确定过渡的类型。该值必须是 <easing-function> 中提供的其中一个。

<single-animation-iteration-count>

动画播放的次数。该值必须是 animation-iteration-count 中提供的其中一个。

<single-animation-direction>

动画播放的方向。该值必须是 animation-direction 中提供的其中一个。

<single-animation-fill-mode>

确定在动画执行之前和之后如何将样式应用于动画的目标。该值必须是animation-fill-mode中提供的其中一个。

<single-animation-play-state>

确定动画是否正在播放。该值必须是animation-play-state中提供的其中一个。

描述

每个动画定义中时间值的顺序很重要:第一个可以解析为<time>的值被分配给animation-duration,第二个值被分配给animation-delay

每个动画定义中其他值的顺序对于区分animation-name值与其他值也很重要。如果animation简写中的某个值可以解析为除animation-name之外的动画属性的值,则该值将首先应用于该属性,而不是应用于animation-name。因此,建议的做法是在使用animation简写时将animation-name的值指定为值列表中的最后一个值;即使使用animation简写指定多个用逗号分隔的动画,此规则也适用。

虽然必须设置动画名称才能应用动画,但animation简写的全部值都是可选的,并且默认为每个长格式animation组件的初始值。animation-name的初始值为none,这意味着如果在animation简写属性中未声明animation-name值,则不会在任何属性上应用动画。

当从animation简写属性中省略animation-duration值时,此属性的值默认为0s。在这种情况下,动画仍将发生(将触发animationStartanimationEnd事件),但不会显示任何动画。

animation-fill-mode forwards值的情况下,动画属性的行为就像包含在will-change属性值的集合中一样。如果在动画期间创建了新的堆叠上下文,则目标元素在动画完成后将保留堆叠上下文。

无障碍访问

闪烁和闪动的动画对于患有认知障碍(如注意力缺陷多动障碍 (ADHD))的人来说可能存在问题。此外,某些类型的运动可能是前庭障碍、癫痫、偏头痛和暗视症的诱因。

考虑提供暂停或禁用动画的机制,以及使用减少运动媒体查询为表示希望减少动画体验的用户创建补充体验。

正式定义

初始值作为简写的每个属性
应用于所有元素
继承
计算值作为简写的每个属性
动画类型不可动画

正式语法

animation = 
<single-animation>#

<single-animation> =
<time [0s,∞]> ||
<easing-function> ||
<time> ||
<single-animation-iteration-count> ||
<single-animation-direction> ||
<single-animation-fill-mode> ||
<single-animation-play-state> ||
[ none | <keyframes-name> ]

<easing-function> =
linear |
<linear-easing-function> |
<cubic-bezier-easing-function> |
<step-easing-function>

<single-animation-iteration-count> =
infinite |
<number [0,∞]>

<single-animation-direction> =
normal |
reverse |
alternate |
alternate-reverse

<single-animation-fill-mode> =
none |
forwards |
backwards |
both

<single-animation-play-state> =
running |
paused

<keyframes-name> =
<custom-ident> |
<string>

<linear-easing-function> =
linear( <linear-stop-list> )

<cubic-bezier-easing-function> =
ease |
ease-in |
ease-out |
ease-in-out |
cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )

<step-easing-function> =
step-start |
step-end |
steps( <integer> , <step-position>? )

<linear-stop-list> =
[ <linear-stop> ]#

<step-position> =
jump-start |
jump-end |
jump-none |
jump-both |
start |
end

<linear-stop> =
<number> &&
<linear-stop-length>?

<linear-stop-length> =
<percentage>{1,2}

示例

注意:不建议对CSS 盒模型属性进行动画处理。对任何盒模型属性进行动画处理本质上都是 CPU 密集型的;请考虑对transform属性进行动画处理。

日出

这里我们在浅蓝色天空上为一个黄色的太阳制作动画。太阳升到视口的中心,然后消失。

html
<div class="sun"></div>
css
:root {
  overflow: hidden; /* hides any part of the sun below the horizon */
  background-color: lightblue;
  display: flex;
  justify-content: center; /* centers the sun in the background */
}

.sun {
  background-color: yellow;
  border-radius: 50%; /* creates a circular background */
  height: 100vh; /* makes the sun the size of the viewport */
  aspect-ratio: 1 / 1;
  animation: 4s linear 0s infinite alternate sun-rise;
}

@keyframes sun-rise {
  from {
    /* pushes the sun down past the viewport */
    transform: translateY(110vh);
  }
  to {
    /* returns the sun to its default position */
    transform: translateY(0);
  }
}

多个属性的动画

在前面的示例中,我们对太阳动画进行了补充,添加了第二个动画,在太阳升起和落下时改变太阳的颜色。太阳在地平线以下时开始为深红色,并在到达顶部时变为亮橙色。

html
<div class="sun"></div>
css
:root {
  overflow: hidden;
  background-color: lightblue;
  display: flex;
  justify-content: center;
}

.sun {
  background-color: yellow;
  border-radius: 50%;
  height: 100vh;
  aspect-ratio: 1 / 1;
  animation: 4s linear 0s infinite alternate animating-multiple-properties;
}

/* it is possible to animate multiple properties in a single animation */
@keyframes animating-multiple-properties {
  from {
    transform: translateY(110vh);
    background-color: red;
    filter: brightness(75%);
  }
  to {
    transform: translateY(0);
    background-color: orange;
    /* unset properties i.e. 'filter' will revert to default values */
  }
}

应用多个动画

这里有一个在浅蓝色背景上升起和落下的太阳。太阳逐渐旋转成彩虹的颜色。太阳的位置和颜色的时间是独立的。

html
<div class="sun"></div>
css
:root {
  overflow: hidden;
  background-color: lightblue;
  display: flex;
  justify-content: center;
}

.sun {
  background-color: yellow;
  border-radius: 50%;
  height: 100vh;
  aspect-ratio: 1 / 1;
  /* multiple animations are separated by commas, each animation's parameters are set independently */
  animation:
    4s linear 0s infinite alternate rise,
    24s linear 0s infinite psychedelic;
}

@keyframes rise {
  from {
    transform: translateY(110vh);
  }
  to {
    transform: translateY(0);
  }
}

@keyframes psychedelic {
  from {
    filter: hue-rotate(0deg);
  }
  to {
    filter: hue-rotate(360deg);
  }
}

级联多个动画

这里有一个浅蓝色背景上的黄色太阳。太阳在视口左右两侧之间弹跳。即使定义了上升动画,太阳也保留在视口中。上升动画的 transform 属性被弹跳动画“覆盖”。

html
<div class="sun"></div>
css
:root {
  overflow: hidden;
  background-color: lightblue;
  display: flex;
  justify-content: center;
}

.sun {
  background-color: yellow;
  border-radius: 50%;
  height: 100vh;
  aspect-ratio: 1 / 1;
  /*
    animations declared later in the cascade will override the
    properties of previously declared animations
  */
  /* bounce 'overwrites' the transform set by rise, hence the sun only moves horizontally */
  animation:
    4s linear 0s infinite alternate rise,
    4s linear 0s infinite alternate bounce;
}

@keyframes rise {
  from {
    transform: translateY(110vh);
  }
  to {
    transform: translateY(0);
  }
}

@keyframes bounce {
  from {
    transform: translateX(-50vw);
  }
  to {
    transform: translateX(50vw);
  }
}

有关其他示例,请参阅使用 CSS 动画

规范

规范
CSS 动画级别 1
# 动画

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅