animation-range

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

animation-range 是一个 CSS 简写属性,用于设置动画在其时间轴上的附着范围的起点和终点,即动画在时间轴上的哪个位置开始和结束。

构成属性

此属性是以下 CSS 属性的简写:

语法

css
/* single keyword or length percentage value */
animation-range: normal; /* Equivalent to normal normal */
animation-range: 20%; /* Equivalent to 20% normal */
animation-range: 100px; /* Equivalent to 100px normal */

/* single named timeline range value */
animation-range: cover; /* Equivalent to cover 0% cover 100% */
animation-range: contain; /* Equivalent to contain 0% contain 100% */
animation-range: cover 20%; /* Equivalent to cover 20% cover 100% */
animation-range: contain 100px; /* Equivalent to contain 100px cover 100% */

/* two values for range start and end */
animation-range: normal 25%;
animation-range: 25% normal;
animation-range: 25% 50%;
animation-range: entry exit; /* Equivalent to entry 0% exit 100% */
animation-range: cover cover 200px; /* Equivalent to cover 0% cover 200px */
animation-range: entry 10% exit; /* Equivalent to entry 10% exit 100% */
animation-range: 10% exit 90%;
animation-range: entry 10% 90%;

animation-range 简写属性可以应用于容器元素,作为 <animation-range-start><animation-range-end> 值的组合。如果两个值都指定了,它们将按 <animation-range-start> 然后 <animation-range-end> 的顺序解释。

如上面的语法块中的注释所示,如果只提供一个值,有几种可能的解释:

  • 如果该值是 <length-percentage>normal,则 <animation-range-start> 将取该值,而 <animation-range-end> 将等于 normal
  • 如果该值是一个已命名的时间轴范围,且后面没有 <length-percentage>,则范围将是该已命名时间轴范围的 0% 到 100%。
  • 如果该值是一个已命名的时间轴范围,且后面跟着一个 <length-percentage>,则范围将从该已命名时间轴范围和指定的百分比开始,到该已命名时间轴范围的 100% 结束。

一个或两个值,表示 animation-range-start 和/或 animation-range-end。这些值可以是以下之一:

normal

对于 animation-range-start,表示时间轴的开始;对于 animation-range-end,表示时间轴的结束。这是默认值。

<length-percentage>

从时间轴开始处计算的长度或百分比值。

<timeline-range-name>

整个时间轴内的一个特定的已命名时间轴范围。可能的值有:

cover

表示一个*已命名视图进度时间轴*(更多细节见 CSS 滚动驱动动画)的完整范围,从主体元素首次开始进入滚动端口的视图进度可见范围(0% 进度)到它完全离开该范围(100% 进度)的点。

contain

表示一个*已命名视图进度时间轴*的范围,在此范围内,主体元素被滚动端口的视图进度可见范围完全包含,或完全包含该范围。

  • 如果主体元素小于滚动端口,则范围从主体元素首次被滚动端口完全包含(0% 进度)的点,到它不再被滚动端口完全包含(100% 进度)的点。
  • 如果主体元素大于滚动端口,则范围从主体元素首次完全覆盖滚动端口(0% 进度)的点,到它不再完全覆盖滚动端口(100% 进度)的点。
entry

表示一个*已命名视图进度时间轴*的范围,从主体元素首次开始进入滚动端口(0% 进度),到它完全进入滚动端口(100%)的点。

exit

表示一个*已命名视图进度时间轴*的范围,从主体元素首次开始退出滚动端口(0% 进度),到它完全退出滚动端口(100%)的点。

entry-crossing

表示一个*已命名视图进度时间轴*的范围,从主体元素首次开始穿过滚动端口的起始边缘(0% 进度),到它完全穿过滚动端口的起始边缘(100%)的点。

exit-crossing

表示一个*已命名视图进度时间轴*的范围,从主体元素首次开始穿过滚动端口的结束边缘(0% 进度),到它完全穿过滚动端口的结束边缘(100%)的点。

对于不包含 <length-percentage><timeline-range-name> 值,如果它是 animation-range-start 值,则百分比默认为 0%;如果它是 animation-range-end 值,则默认为 100%

备注: 仅从上述描述很难想象这些值具体意味着什么。幸运的是,视图时间轴范围可视化工具以简单直观的方式准确地展示了它们的含义。

<timeline-range-name> <length-percentage>

一个组合值,等于指定的已命名时间轴范围中从该时间轴范围起点算起的指定百分比或距离。

备注: 滚动端口(更多细节见滚动容器)中被称为视图进度可见范围的区域,是指*已命名视图进度时间轴*动画的主体元素被视为可见的区域。默认情况下,这是滚动端口的整个范围,但可以使用 view-timeline-inset 属性进行调整。

正式定义

初始值作为简写中的每个属性
应用于所有元素
继承性
百分比如果指定了已命名时间轴范围,则相对于该范围;否则相对于整个时间轴。
计算值作为简写中的每个属性
  • animation-range-start:一个列表,其中每个项目可以是“normal”、一个长度百分比,或者一个时间轴范围名称和一个长度百分比。
  • animation-range-end:一个列表,其中每个项目可以是“normal”、一个长度百分比,或者一个时间轴范围名称和一个长度百分比。
动画类型作为简写中的每个属性

正式语法

animation-range = 
[ <'animation-range-start'> <'animation-range-end'>? ]#

<animation-range-start> =
[ normal | <length-percentage> | <timeline-range-name> <length-percentage>? ]#

<animation-range-end> =
[ normal | <length-percentage> | <timeline-range-name> <length-percentage>? ]#

<length-percentage> =
<length> |
<percentage>

示例

视图时间轴范围可视化工具

请参阅视图时间轴范围可视化工具,以获取关于所有值类型含义的简单直观解释。

创建一个带范围的已命名视图进度时间轴

在类名为 animation 的主体元素上,使用 view-timeline 属性定义了一个名为 --subject-reveal 的视图进度时间轴。然后使用 animation-timeline: --subject-reveal; 将其设置为同一元素的时间轴。结果是,当文档被滚动时,主体元素在向上移动的过程中会播放动画。

还设置了一个 animation-range 声明,使动画比预期晚开始,并提前结束。

HTML

示例的 HTML 如下所示。

html
<div class="content">
  <h1>Content</h1>

  <p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Risus quis varius quam
    quisque id. Et ligula ullamcorper malesuada proin libero nunc consequat
    interdum varius. Elit ullamcorper dignissim cras tincidunt lobortis feugiat
    vivamus at augue.
  </p>

  <p>
    Dolor sed viverra ipsum nunc aliquet. Sed sed risus pretium quam vulputate
    dignissim. Tortor aliquam nulla facilisi cras. A erat nam at lectus urna
    duis convallis convallis. Nibh ipsum consequat nisl vel pretium lectus.
    Sagittis aliquam malesuada bibendum arcu vitae elementum. Malesuada bibendum
    arcu vitae elementum curabitur vitae nunc sed velit.
  </p>

  <div class="subject animation"></div>

  <p>
    Adipiscing enim eu turpis egestas pretium aenean pharetra magna ac. Arcu
    cursus vitae congue mauris rhoncus aenean vel. Sit amet cursus sit amet
    dictum. Augue neque gravida in fermentum et. Gravida rutrum quisque non
    tellus orci ac auctor augue mauris. Risus quis varius quam quisque id diam
    vel quam elementum. Nibh praesent tristique magna sit amet purus gravida
    quis. Duis ultricies lacus sed turpis tincidunt id aliquet. In egestas erat
    imperdiet sed euismod nisi. Eget egestas purus viverra accumsan in nisl nisi
    scelerisque. Netus et malesuada fames ac.
  </p>
</div>

CSS

subject 元素及其包含的 content 元素仅应用了最少的样式,文本内容则设置了一些基本的字体样式。

css
.subject {
  width: 300px;
  height: 200px;
  margin: 0 auto;
  background-color: deeppink;
}

.content {
  width: 75%;
  max-width: 800px;
  margin: 0 auto;
}

p,
h1 {
  font-family: "Helvetica", "Arial", sans-serif;
}

h1 {
  font-size: 3rem;
}

p {
  font-size: 1.5rem;
  line-height: 1.5;
}

类名为 subject<div> 也被赋予了 animation 类——这里设置了 view-timeline 来定义一个已命名视图进度时间轴。它还被赋予了同名的 animation-timeline,以声明它将是随着视图进度时间轴推进而播放动画的元素。我们还为它设置了一个 animation-range 声明,使动画比预期晚开始,并提前结束。

最后,在元素上指定了一个动画,该动画使其不透明度和缩放发生变化,从而在它向上移动滚动条时淡入并变大。

css
.animation {
  view-timeline: --subject-reveal block;
  animation-timeline: --subject-reveal;

  animation-name: appear;
  animation-range: entry 10% contain 25%;
  animation-fill-mode: both;
  animation-duration: 1ms; /* Firefox requires this to apply the animation */
}

@keyframes appear {
  from {
    opacity: 0;
    transform: scaleX(0);
  }

  to {
    opacity: 1;
    transform: scaleX(1);
  }
}

结果

滚动以查看主体元素的动画效果。

规范

规范
滚动驱动动画
# animation-range

浏览器兼容性

另见