CSS + SVG每次迭代之间有延迟的无限动画

时间:2016-02-08 08:15:22

标签: css css3 svg css-animations

我的代码在这里显示了复选标记的动画。

它可以工作,但问题在于,它不会循环。它只动画了一次。我想要的是每2秒制作一次动画。

Codepen链接:http://codepen.io/haniotis/pen/KwvYLO

CSS看起来像这样:

<svg class="checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
  <circle class="checkmark__circle" cx="26" cy="26" r="25" fill="none" />
  <path class="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8" />
</svg>

HTML看起来像这样:

CREATE UNIQUE INDEX main_category_unique ON items_categories (item_id)
    WHERE main = TRUE;

1 个答案:

答案 0 :(得分:3)

  

注意:虽然这个问题与我在评论中链接的问题部分类似,但由于存在需要链接在一起的多个动画,所以它有点复杂因此我正在添加一个单独的答案来解释它。

让任何CSS3动画无限次运行非常简单。只需将animation-iteration-count设置为infinite即可实现这一目标。但是每隔[x]秒重复一次动画要复杂得多,因为正如我的回答here中所解释的那样,animation-delay属性仅在动画的第一次迭代之前而不是在每次迭代之前添加延迟。每一次迭代。

该答案解释了如何在每次迭代之间添加延迟,因此我不会详细介绍。但是你的情况有点复杂,因为有四个动画链接在一起产生效果,因此所有这些动画都需要修改才能使它工作。

以下是你需要做的事情,让它每2秒无限重复一次:

  • animation-iteration-count: infinite添加到所有4个动画(或),只需将infinite个关键字添加到所有animation速记属性中。
  • 首先计算整个动画(全部4个放在一起)运行的总时间。在原始代码段中,它运行了1.2秒,你需要延迟2秒,因此动画的总持续时间是3.2秒。 此3.2s应该是所有4个动画的持续时间
  • .checkmark__circle上的动画应该为.6s运行并且没有延迟。 .6s约为3.2s的18.75%,因此动画的关键帧应该更改,以便整个动画以18.75%的分数完成,并保持这种状态直到100%标记。
  • .checkmark__check上的动画应该延迟.8s,这是3.2s持续时间的25%。所以它应该从25%开始,持续时间是.3s,大约是3.2s的9.37%。因此,这个动画应该以25%的标记开始,并在达到34.37%标记时完成。从那里到100%标记,它必须保持该状态。由于关键帧现在与圆圈动画不同,我们需要添加两个不同的@keyframes规则。
  • .checkmark上的填充动画的持续时间为.4s且延迟相同。因此,它应该以12.5%的标记开始,以25%的分数完成并保持这种状态直到100%的标记。
  • .checkmark上的缩放动画的持续时间为.3s,延迟时间为.9s。因此,这必须从28.125%开始,并以37.5%的标记完成。这意味着中点(transform: scale3d(1.1, 1.1, 1);应该是32.8125%。

完成所有这些更改后,动画将无限运行,每次循环之间的延迟为2秒。下面是使用编译的CSS的演示。 SCSS版本可用here

.checkmark__circle {
  stroke-dasharray: 166;
  stroke-dashoffset: 166;
  stroke-width: 2;
  stroke-miterlimit: 10;
  stroke: #7ac142;
  fill: none;
  animation: stroke 3.2s cubic-bezier(0.65, 0, 0.45, 1) forwards infinite;
}
.checkmark {
  width: 56px;
  height: 56px;
  border-radius: 50%;
  display: block;
  stroke-width: 2;
  stroke: #fff;
  stroke-miterlimit: 10;
  margin: 10% auto;
  box-shadow: inset 0px 0px 0px #7ac142;
  animation: fill 3.2s ease-in-out forwards infinite, scale 3.2s ease-in-out both infinite;
}
.checkmark__check {
  transform-origin: 50% 50%;
  stroke-dasharray: 48;
  stroke-dashoffset: 48;
  animation: stroke-check 3.2s cubic-bezier(0.65, 0, 0.45, 1) forwards infinite;
}
@keyframes stroke {
  18.75%, 100% {
    stroke-dashoffset: 0;
  }
}
@keyframes stroke-check {
  25% {
    stroke-dashoffset: 48;
  }
  34.37%,
  100% {
    stroke-dashoffset: 0;
  }
}
@keyframes scale {
  0%, 28.125%, 37.5%, 100% {
    transform: none;
  }
  32.8125% {
    transform: scale3d(1.1, 1.1, 1);
  }
}
@keyframes fill {
  12.5% {
    box-shadow: inset 0px 0px 0px #7ac142;
  }
  25%,
  100% {
    box-shadow: inset 0px 0px 0px 30px #7ac142;
  }
}
<svg class="checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
  <circle class="checkmark__circle" cx="26" cy="26" r="25" fill="none" />
  <path class="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8" />
</svg>