如何循环具有多个关键帧定义的 CSS 动画?

Posted

技术标签:

【中文标题】如何循环具有多个关键帧定义的 CSS 动画?【英文标题】:How do I loop a css animation with multiple keyframe definitions? 【发布时间】:2014-10-12 14:33:29 【问题描述】:

问题

我有两个在单个元素上运行的 css 关键帧动画:

.fade-bg 
  animation-name: fade-bg-1, fade-bg-2;
  animation-delay: 0, 6s;
  animation-iteration-count: infinite;
  animation-direction: alternate;

动画是这样定义的:

@keyframes fade-bg-1 

  from 
      opacity: 0;
      background-image: url(image-1.jpg);
  

  50% 
      opacity: 1;
      background-image: url(image-1.jpg);
  

  to 
      opacity: 0;
      background-image: url(image-1.jpg);
  



@keyframes fade-bg-2  /* Same as fade-bg-1 only with image-2.jpg  */ 

上面的方法有效,但是当它到达第二个动画时,它只会重复那个动画并且不会循环回到fade-bg-1

我尝试了animation-direction 的许多不同组合,但无济于事。

问题

如何使动画返回fade-bg-1 并重复播放?

示例

EXAMPLE

【问题讨论】:

我为此添加了a bug for the CSS animation spec。 LMAO 你的问题是我的解决方案 XD,好吧,我想要一些东西淡入然后在循环动画 2 时留在屏幕上,但我想它应该能够做到这一点。谢谢:) 【参考方案1】:

我不确定仅使用 css 是否可行,但如果您巧妙地在 JS 中设置了 setInterval 方法,您可能可以通过将类拆分为两个来模拟相同的事情。

var index = 1;

function switchBackground() 
   if (index == 1) 
      //this switches to  the first background
      var div = document.getElementById("yourDiv");
      div.className = "fade-bg-1";
      index = 0;
   
   else 
      //this switches to  the second background
      var div = document.getElementById("yourDiv");
      div.className = "fade-bg-2";
      index = 1;
   


setInterval(switchBackground(), 6000);

.fade-bg-1 和 .fade-bg-2 是两个动画类。

如果你想玩,这里有一个jsfiddle。

【讨论】:

我应该指出我不想为此使用 javascript。谢谢。 啊,好吧。好吧,我很确定这是不可能的,但我们会看看其他人是否能想出办法。【参考方案2】:

如果没有 javascript,我认为你做不到。但是,您可以使用单个关键帧动画来实现相同的效果。

.fade-bg 
  animation-name: fade-bg;
  animation-delay: 0;
  animation-iteration-count: infinite;
  animation-direction: forward;



@keyframes fade-bg 
    0% 
        opacity: 0;
        background-image: url('image-1.jpg');
    

    25% 
        opacity: 1;
        background-image: url('image-1.jpg');
    

    50% 
        opacity: 0;
        background-image: url('image-1.jpg');
    

    51% 
        opacity: 0;
        background-image: url('image-2.jpg');
    

    75% 
        opacity: 1;
        background-image: url('image-2.jpg');
    

    100% 
        opacity: 0;
        background-image: url('image-2.jpg');
    

EXAMPLE

【讨论】:

太棒了!为什么它不能按预期使用多个动画? 这并不能真正回答问题,但只要没有其他人提供更好的 CSS 唯一答案,我就会接受你的。谢谢!【参考方案3】:

大约 6 年前我问过这个问题,发生了很大变化,但没有真正的纯 css 解决方案。

我能想到的最接近的方法是使用伪元素来应用第二个动画。

可能的解决方案:

使用::after 之类的伪元素并对其应用第二个动画。

代码:

.animation--fade-bg, .animation--fade-bg::after 
  width: 500px;
  height: 500px;
  background-size: cover;
  background-position: 50%;
  background-repeat: no-repeat;
  
  animation-iteration-count: infinite;
  animation-duration: 3s;


 .animation--fade-bg::after 
  content: "";
  display: block;

  animation-direction: reverse;


.animation--fade-bg-1 
  animation-name: fade-bg-1;



.animation--fade-bg::after 
  animation-name: fade-bg-2;



@keyframes fade-bg-1 
  from 
    opacity: 0;
    background-image: url('http://i.imgur.com/sRnvs0K.jpg');
  
    
  50% 
    opacity: 1;
    background-image: url('http://i.imgur.com/sRnvs0K.jpg');
     
     
  to 
    opacity: 0;
    background-image: url('http://i.imgur.com/sRnvs0K.jpg');
  


@keyframes fade-bg-2 
  from 
    opacity: 0;
    background-image: url('http://i.imgur.com/wL4RT1w.jpg');
  

  50% 
    opacity: 1;
    background-image: url('http://i.imgur.com/wL4RT1w.jpg');
  

  to 
    opacity: 0;
    background-image: url('http://i.imgur.com/wL4RT1w.jpg');
  
<div class="animation--fade-bg animation--fade-bg-1"></div>

【讨论】:

以上是关于如何循环具有多个关键帧定义的 CSS 动画?的主要内容,如果未能解决你的问题,请参考以下文章

多个关键帧动画在 Safari 中不起作用

unity路径途径有几个关键帧

如何使用 javascript 创建自定义关键帧 css 动画

css 多个关键帧变形如何衔接

第1433期CSS3动画实战之多关键帧实现无限循环动效的时间间隔

为啥 CSS 关键帧动画在具有范围样式的 Vue 组件中被破坏?