阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 动画的填充模式

动画的填充模式

作者:陈川 阅读数:27360人阅读 分类: CSS

动画的填充模式

CSS动画的填充模式(animation-fill-mode)决定了动画在执行前后如何将样式应用于目标元素。它控制动画是否在延迟期间、执行完毕后保留关键帧中的样式,或恢复到原始状态。填充模式对动画的流畅性和视觉效果至关重要。

填充模式的取值

animation-fill-mode有四个可选值:

  1. none(默认值):动画在执行前后不会应用任何样式到元素。动画开始前,元素保持原有样式;动画结束后,元素立即恢复到原有样式。
  2. forwards:动画结束后,元素将保留最后一帧的样式。
  3. backwards:动画开始前(包括延迟期间),元素将应用第一帧的样式。
  4. both:同时应用forwardsbackwards的效果。

填充模式的实际应用

使用none的示例

.box {
  width: 100px;
  height: 100px;
  background: red;
  animation: move 2s;
  animation-fill-mode: none;
}

@keyframes move {
  from { transform: translateX(0); }
  to { transform: translateX(100px); }
}

在这个例子中,动画开始前,.box保持红色且未平移;动画结束后,.box立即回到原始位置。

使用forwards的示例

.box {
  width: 100px;
  height: 100px;
  background: red;
  animation: move 2s;
  animation-fill-mode: forwards;
}

@keyframes move {
  from { transform: translateX(0); }
  to { transform: translateX(100px); background: blue; }
}

动画结束后,.box会停留在translateX(100px)的位置,并保持蓝色背景。

使用backwards的示例

.box {
  width: 100px;
  height: 100px;
  background: red;
  animation: move 2s 1s;
  animation-fill-mode: backwards;
}

@keyframes move {
  from { transform: translateX(0); opacity: 0; }
  to { transform: translateX(100px); opacity: 1; }
}

在1秒的延迟期间,.box会立即应用第一帧的样式(opacity: 0),然后开始动画。

使用both的示例

.box {
  width: 100px;
  height: 100px;
  background: red;
  animation: move 2s 1s;
  animation-fill-mode: both;
}

@keyframes move {
  from { transform: translateX(0); opacity: 0; }
  to { transform: translateX(100px); opacity: 1; background: blue; }
}

延迟期间,.box会应用第一帧的样式(opacity: 0);动画结束后,保留最后一帧的样式(translateX(100px)opacity: 1和蓝色背景)。

填充模式与动画生命周期的关系

填充模式直接影响动画的三个阶段:

  1. 动画延迟阶段backwardsboth会使元素立即应用第一帧样式。
  2. 动画执行阶段:所有填充模式的表现相同。
  3. 动画结束阶段forwardsboth会使元素保留最后一帧样式。

实际开发中的注意事项

  1. animation-iteration-count的交互:当动画迭代次数为无限(infinite)时,forwardsboth不会产生效果,因为动画永远不会结束。

    /* 无限循环动画中,forwards无效 */
    .box {
      animation: move 2s infinite;
      animation-fill-mode: forwards;
    }
    
  2. 与JavaScript动画控制的配合:当使用JavaScript动态控制动画时,填充模式会影响animationend事件触发后的元素状态。

    document.querySelector('.box').addEventListener('animationend', function() {
      // 如果fill-mode为forwards或both,此时元素会保持动画结束状态
    });
    
  3. 性能考量:某些填充模式可能导致浏览器需要额外维护元素状态,但在现代浏览器中这种性能差异通常可以忽略。

复杂场景下的填充模式应用

多动画串联

当多个动画按顺序作用于同一元素时,填充模式可以确保平滑过渡:

.box {
  animation: 
    fadeIn 0.5s forwards,
    move 1s 0.5s forwards;
}

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes move {
  from { transform: translateX(0); }
  to { transform: translateX(200px); }
}

这里,第一个动画的forwards确保元素在第二个动画开始时保持opacity: 1

与变换原点的配合

填充模式可以保持变换原点等属性:

.box {
  transform-origin: left center;
  animation: rotate 2s forwards;
}

@keyframes rotate {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

动画结束后,元素会保持旋转360度的状态,且变换原点仍然是左侧中心。

浏览器兼容性与降级方案

所有现代浏览器都支持animation-fill-mode,包括:

  • Chrome 43+
  • Firefox 16+
  • Safari 9+
  • Edge 12+
  • Opera 30+

对于不支持CSS动画的老旧浏览器,可以考虑使用JavaScript动画库作为回退方案,或者确保关键功能不依赖动画的最终状态。

调试填充模式问题

当填充模式表现不符合预期时,可以检查:

  1. 动画是否正确定义了关键帧
  2. 动画持续时间或延迟时间是否设置正确
  3. 是否有更高特异性的CSS规则覆盖了动画样式
  4. 浏览器开发者工具中的"Animations"面板可以可视化动画时间线和填充模式效果
/* 可能覆盖动画样式的例子 */
.box {
  animation: move 2s forwards;
  transform: translateX(0); /* 这条规则会覆盖forwards的效果 */
}

高级应用:与CSS变量的结合

填充模式可以与CSS变量结合,创建更动态的效果:

.box {
  --end-position: 100px;
  animation: move 2s forwards;
}

@keyframes move {
  to { transform: translateX(var(--end-position)); }
}

JavaScript可以动态改变--end-position,而forwards会确保元素保持在修改后的结束位置。

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌