【问题标题】:CSS + SVG Infinite animation with a delay between each iterationCSS + SVG 无限动画,每次迭代之间都有延迟
【发布时间】:2016-05-17 20:09:45
【问题描述】:

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

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

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

CSS 看起来像这样:

@import "bourbon";

$color--green: #7ac142;
$curve: cubic-bezier(0.650, 0.000, 0.450, 1.000);

.checkmark__circle {
  stroke-dasharray: 166;
  stroke-dashoffset: 166;
  stroke-width: 2;
  stroke-miterlimit: 10;
  stroke: $color--green;
  fill: none;
  animation: stroke .6s $curve forwards;
}

.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 $color--green;
  animation: fill .4s ease-in-out .4s forwards, scale .3s ease-in-out .9s both;
}

.checkmark__check {
  transform-origin: 50% 50%;
  stroke-dasharray: 48;
  stroke-dashoffset: 48;
  animation: stroke .3s $curve .8s forwards;
}

@keyframes stroke {
  100% {
    stroke-dashoffset: 0;
  }
}

@keyframes scale {
  0%, 100% {
    transform: none;
  }
  50% {
    transform: scale3d(1.1, 1.1, 1);
  }
}

@keyframes fill {
  100% {
    box-shadow: inset 0px 0px 0px 30px $color--green;
  }
}

HTML 看起来像这样:

<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>

【问题讨论】:

  • 使动画无限很容易,您只需将迭代次数设置为无限。每 2 秒重复一次需要对关键帧进行一些更改,如提到的 here。
  • 对于您的情况,它比这要复杂一些,因为您有 3 个动画,并且每个动画都必须进行调整,以便在开始下一个循环之前让其他动画完成。

标签: css svg css-animations


【解决方案1】:

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

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

该答案解释了如何在每次迭代之间添加延迟,因此我不会对此进行详细说明。但是您的情况有点复杂,因为有四个动画链接在一起以产生效果,因此需要对它们进行修改才能使其正常工作。

以下是您需要做的事情,以使其每 2 秒无限重复:

  • 将animation-iteration-count: infinite 添加到所有4 个动画(或)只需将infinite 关键字添加到所有animation 速记属性。
  • 首先计算整个动画(全部 4 个)运行的总时间。在你原来的 sn-p 中它运行了 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多