【问题标题】:Fixing animation loop in CSS loader修复 CSS 加载器中的动画循环
【发布时间】:2016-08-01 08:17:51
【问题描述】:

我在 CSS 中有一个加载器动画。它以圆形方式旋转 4 个 div。我遇到的问题是第 4 个 div(红色)最初显示时没有淡入淡出干扰动画的流程(您可能需要刷新才能看到)。

解决此问题以改善动画循环的最佳方法是什么?

守则 (https://jsfiddle.net/bduaxvmp/):

.loader {
  position: relative;
  height: 50px;
  width: 50%;
  left: 45.5%
}
.loader .bullet {
  position: absolute;
  padding: 5px;
  background: green;
  animation: animIn 1s ease-in-out 0s infinite;
}
.loader .bullet:nth-child(1) {
  animation-delay: 0.0s;
}
.loader .bullet:nth-child(2) {
  animation-delay: 0.15s;
}
.loader .bullet:nth-child(3) {
  animation-delay: 0.3s;
}
.loader .bullet:nth-child(4) {
  animation-delay: 0.45s;
  background: red;
}
@-webkit-keyframes animIn {
  0% {
    transform: translateX(-100px);
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
  100% {
    transform: translateX(100px);
    opacity: 0;
  }
}
<div class="loader">
  <div class="bullet"></div>
  <div class="bullet"></div>
  <div class="bullet"></div>
  <div class="bullet"></div>
</div>

【问题讨论】:

    标签: html css animation css-animations


    【解决方案1】:

    解决方案:

    将动画的animation-fill-mode 设置为backwards。为填充模式使用此选项将使元素在animation-delay 期间处于0% 帧的状态,因此所有元素都将是透明的并处于其平移位置,直到动画真正开始。

    .loader .bullet {
        position: absolute;
        padding: 5px;
        background: green;
        animation: animIn 1s ease-in-out 0s infinite backwards;
    }
    

    .loader {
      position: relative;
      height: 50px;
      width: 50%;
      left: 45.5%
    }
    .loader .bullet {
      position: absolute;
      padding: 5px;
      background: green;
      animation: animIn 1s ease-in-out 0s infinite backwards;
    }
    .loader .bullet:nth-child(1) {
      animation-delay: 0.0s;
    }
    .loader .bullet:nth-child(2) {
      animation-delay: 0.15s;
    }
    .loader .bullet:nth-child(3) {
      animation-delay: 0.3s;
    }
    .loader .bullet:nth-child(4) {
      animation-delay: 0.45s;
      background: red;
    }
    @-webkit-keyframes animIn {
      0% {
        transform: translateX(-100px);
        opacity: 0;
      }
      50% {
        opacity: 1;
      }
      100% {
        transform: translateX(100px);
        opacity: 0;
      }
    }
    @keyframes animIn {
      0% {
        transform: translateX(-100px);
        opacity: 0;
      }
      50% {
        opacity: 1;
      }
      100% {
        transform: translateX(100px);
        opacity: 0;
      }
    }
    <div class="loader">
      <div class="bullet"></div>
      <div class="bullet"></div>
      <div class="bullet"></div>
      <div class="bullet"></div>
    </div>

    或者,您也可以将与0% 框架相同的属性设置为元素的默认状态,并避免将animation-fill-mode 设置为backwards,但我认为在这种情况下可以避免重复。


    原因:

    我遇到的问题是第 4 个 div(红色)最初显示时没有淡入淡出

    请注意,问题不仅仅是第 4 个 div。实际上问题在于所有具有动画延迟的div 元素。从视觉上看,只有第 4 个div 出现了问题,因为所有这些都是绝对定位的,第 4 个div 出现在其余部分之上,因为它在 DOM 中较晚。

    如果您为第三个或第二个div 设置不同的背景颜色和更高的 z-index,您会发现它们也会出现同样的问题。

    .loader {
      position: relative;
      height: 50px;
      width: 50%;
      left: 45.5%
    }
    .loader .bullet {
      position: absolute;
      padding: 5px;
      background: green;
      animation: animIn 1s ease-in-out 1s infinite;
    }
    .loader .bullet:nth-child(1) {
      animation-delay: 0.0s;
    }
    .loader .bullet:nth-child(2) {
      animation-delay: 0.15s;
      /*background: blue;
        z-index: 4 */
    }
    .loader .bullet:nth-child(3) {
      animation-delay: 0.3s;
      background: yellow;
      z-index: 2;
    }
    .loader .bullet:nth-child(4) {
      animation-delay: 0.45s;
      /*background: red;*/
    }
    @-webkit-keyframes animIn {
      0% {
        transform: translateX(-100px);
        opacity: 0;
      }
      50% {
        opacity: 1;
      }
      100% {
        transform: translateX(100px);
        opacity: 0;
      }
    }
    @keyframes animIn {
      0% {
        transform: translateX(-100px);
        opacity: 0;
      }
      50% {
        opacity: 1;
      }
      100% {
        transform: translateX(100px);
        opacity: 0;
      }
    }
    <div class="loader">
      <div class="bullet"></div>
      <div class="bullet"></div>
      <div class="bullet"></div>
      <div class="bullet"></div>
    </div>

    出现此问题的原因是动画的工作方式。任何动画都将继续保持其默认状态(在动画之外指定),直到延迟计时器到期。将animation-fill-mode 设置为backwards 使动画即使在延迟期间也将状态作为第一个适用帧的状态,从而避免了该问题。

    来自MDN

    向后

    动画将在应用到目标后立即应用第一个相关关键帧中定义的值,并在动画延迟期间保留此值。

    【讨论】:

    • 谢谢哈利!对正在发生的事情非常有用的解释。
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2014-07-22
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多