【问题标题】:How to control the timing of CSS3 animation如何控制 CSS3 动画的时间
【发布时间】:2016-02-18 16:24:34
【问题描述】:

我正在制作如下所示的 SVG 线条绘制动画。

所以我要做的是使用stroke-dasharray 为耳朵设置动画,然后继续使用点。

我设法完成了耳朵的绘制,但我不知道如何控制点的时间。以下是我的动画步骤:

  1. 5s内画耳动画
  2. 5s 后,继续点动画(逐行动画)
  3. 完成点动画后,循环回到第一步

这是我的代码,但它会逐渐闪烁。如何调整时间?

.firstpath {
  stroke-dasharray: 1500;
  animation: firstanimate 5s linear forwards infinite;
}
@keyframes firstanimate {
  from {
    stroke-dashoffset: 1500;
  }
  to {
    stroke-dashoffset: 0;
  }
}
.secondpath {
  stroke-dasharray: 500;
  animation: secondanimate 5s linear forwards infinite;
}
@keyframes secondanimate {
  from {
    stroke-dashoffset: 500;
  }
  to {
    stroke-dashoffset: 0;
  }
}
.thirdpath {
  stroke-dasharray: 500;
  animation: thirdanimate 5s linear forwards infinite;
}
@keyframes thirdanimate {
  from {
    stroke-dashoffset: 500;
  }
  to {
    stroke-dashoffset: 0;
  }
}
.row1col1 {
  animation-delay: 1s;
  animation: blink 2s step-start 0s infinite;
  -webkit-animation: blink 2s step-start 0s infinite;
}
@keyframes blink {
  0% {
    opacity: 1.0;
  }
  50% {
    opacity: 0.0;
  }
  100% {
    opacity: 1.0;
  }
}
@-webkit-keyframes blink {
  0% {
    opacity: 1.0;
  }
  50% {
    opacity: 0.0;
  }
  100% {
    opacity: 1.0;
  }
}
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="841.89px" height="595.28px" viewBox="0 0 841.89 595.28" enable-background="new 0 0 841.89 595.28" xml:space="preserve">

  <g>
    <path class="firstpath" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
			M253.441,284.167c0,0-0.883-14.535,15.429-18.551c5.364-1.32,15.943-0.665,21.667,6.79c13.859,18.051-3.235,32.286-8.087,37.262
			c-4.853,4.979-7.713,21.027-17.543,20.528c-9.829-0.497-12.69-6.717-12.317-11.818" />

    <path class="secondpath" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
			M285.249,285.252c0,0,0.654-8.212-8.864-10.544c-9.519-2.334-16.796,8.211-10.825,17.449c2.613-1.12,5.226,0.652,5.599,2.52
			c0.373,1.866-1.213,4.199-3.826,4.199" />

    <path class="thirdpath" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
			M257.815,307.553c0,0-3.732,5.879,2.333,8.118c6.065,2.241,5.318-8.118,8.865-9.237c3.545-1.119,11.943-2.519,11.943-10.265
			c0-7.744-6.398-16.451-17.522-11.958" />
  </g>

  <line class="row1col1" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="319.41" y1="287.987" x2="324.156" y2="286.627" />

  <line fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="328.667" y1="285.335" x2="332.744" y2="284.167" />

  <line fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="338.25" y1="301.171" x2="343.41" y2="301.171" />

  <line fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="328.667" y1="301.171" x2="333.75" y2="301.171" />

  <line fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="319.41" y1="301.171" x2="324.156" y2="301.171" />

  <line fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="313.741" y1="314.625" x2="319.41" y2="315.987" />

  <line fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="323.741" y1="316.746" x2="329.667" y2="318.142" />

</svg>

【问题讨论】:

  • 我希望我的答案中更新的 sn-p 完全解决了您的问题。如果是,请考虑接受答案(单击答案旁边投票按钮下方的空心刻度线)。这通常是我们在此处将问题标记为已解决的方式。
  • 是的,你做到了。但我需要调整时间以使其更快。非常感谢您的回答。昨天投票。
  • 抱歉,误会了,我以为你说的是​​投票。我点击了它,因为您的回答解决了我的问题。 :)
  • 啊,我明白了。不用担心:)

标签: html css svg css-animations line-drawing


【解决方案1】:

形状各部分的形成方式,这将需要多个关键帧动画才能按照您的预期方式工作。

以下是你必须做的:

  • 耳朵动画虽然预计在5s 标记处完成,但在线条动画完成之前不应开始下一次迭代。也就是说,在线条完成动画所花费的时间内,耳朵应该保持空闲状态。因此,我们必须为耳朵设置animation-duration,使其涵盖线条完成动画所需的时间。在这里,每个线组件采用1s,因此所有元素(耳朵和线)的总animation-duration 将是12s
  • 耳朵动画应在5s 标记处完成(在12s 的总持续时间中),因此from - to 关键帧设置应替换为百分比。耳朵动画应该从0% 开始并在41% 完成(大致是5s 标记)。从那里,它应该保持其位置直到100% (12s) 标记(基本上直到线条完成动画)。
  • 每个线条组件应在其前一部分完成动画后开始,因此row1col1 应从41% 开始,此时耳朵完全可见(直到此时它应该保持不可见)。
  • row1col1 需要1s 来制作动画(大约是12s8%),因此row1col2 应该等到总持续时间的49% 开始其动画。同样row2col1 应该从57% 开始,row2col2 应该从66% 开始等等。
  • 如果线条需要慢慢淡入,则在41% 处以opacity: 0 开头并在49% 处获取opacity: 1(对于row1col1,其余的以此类推)。另一方面,如果您需要它们立即出现,请减少它获得opacity: 1 的百分比。在 sn-p 中,我已经使 row1col142% 本身达到 opacity: 1(类似于 0.12s)。

注意事项:

  • 我还修改了耳朵组件的stroke-dasharray 设置,以避免耳朵动画完成和线条动画开始之间最初存在的延迟。
  • 我还建议您寻求一些 SVG 专家的帮助来检查是否没有。零件的数量可以最小化,因为它会减少没有。所需的关键帧等。不幸的是,我的 SVG 知识有限,所以我帮不上什么忙。

.firstpath {
  stroke-dasharray: 150;
  animation: firstanimate 12s linear forwards infinite;
}
@keyframes firstanimate {
  0% {
    stroke-dashoffset: 150;
  }
  41% {
    stroke-dashoffset: 0;
  }
}
.secondpath {
  stroke-dasharray: 100;
  animation: secondanimate 12s linear forwards infinite;
}
@keyframes secondanimate {
  0% {
    stroke-dashoffset: 100;
  }
  41% {
    stroke-dashoffset: 0;
  }
}
.thirdpath {
  stroke-dasharray: 65;
  animation: thirdanimate 12s linear forwards infinite;
}
@keyframes thirdanimate {
  0% {
    stroke-dashoffset: 65;
  }
  41% {
    stroke-dashoffset: 0;
  }
}
line {
  opacity: 0;
}
.row1col1 {
  animation: blink 12s linear forwards infinite;
}
@keyframes blink {
  41% {
    opacity: 0;
  }
  42%, 100% {
    opacity: 1;
  }  

}
.row1col2 {
  animation: blink2 12s linear forwards infinite;
}
@keyframes blink2 {
  49% {
    opacity: 0;
  }
  50%, 100% {
    opacity: 1;
  }
}
.row2col1 {
  animation: blink3 12s linear forwards infinite;
}
@keyframes blink3 {
  57% {
    opacity: 0;
  }
  58%, 100% {
    opacity: 1;
  }
}
.row2col2 {
  animation: blink4 12s linear forwards infinite;
}
@keyframes blink4 {
  66% {
    opacity: 0;
  }
  67%, 100% {
    opacity: 1;
  }
}
.row2col3 {
  animation: blink5 12s linear forwards infinite;
}
@keyframes blink5 {
  75% {
    opacity: 0;
  }
  76%, 100% {
    opacity: 1;
  }
}
.row3col1 {
  animation: blink6 12s linear forwards infinite;
}
@keyframes blink6 {
  84% {
    opacity: 0;
  }
  85%, 100% {
    opacity: 1;
  }
}

.row3col2 {
  animation: blink7 12s linear forwards infinite;
}
@keyframes blink7 {
  92% {
    opacity: 0;
  }
  93%, 100% {
    opacity: 1;
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="841.89px" height="595.28px" viewBox="0 0 841.89 595.28" enable-background="new 0 0 841.89 595.28" xml:space="preserve">

  <g>
    <path class="firstpath" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
			M253.441,284.167c0,0-0.883-14.535,15.429-18.551c5.364-1.32,15.943-0.665,21.667,6.79c13.859,18.051-3.235,32.286-8.087,37.262
			c-4.853,4.979-7.713,21.027-17.543,20.528c-9.829-0.497-12.69-6.717-12.317-11.818" />

    <path class="secondpath" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
			M285.249,285.252c0,0,0.654-8.212-8.864-10.544c-9.519-2.334-16.796,8.211-10.825,17.449c2.613-1.12,5.226,0.652,5.599,2.52
			c0.373,1.866-1.213,4.199-3.826,4.199" />

    <path class="thirdpath" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
			M257.815,307.553c0,0-3.732,5.879,2.333,8.118c6.065,2.241,5.318-8.118,8.865-9.237c3.545-1.119,11.943-2.519,11.943-10.265
			c0-7.744-6.398-16.451-17.522-11.958" />
  </g>

  <line class="row1col1" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="319.41" y1="287.987" x2="324.156" y2="286.627" />

  <line class="row1col2" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="328.667" y1="285.335" x2="332.744" y2="284.167" />

  <line class="row2col3" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="338.25" y1="301.171" x2="343.41" y2="301.171" />

  <line class="row2col2" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="328.667" y1="301.171" x2="333.75" y2="301.171" />

  <line class="row2col1" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="319.41" y1="301.171" x2="324.156" y2="301.171" />

  <line class="row3col1" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="313.741" y1="314.625" x2="319.41" y2="315.987" />

  <line class="row3col2" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="323.741" y1="316.746" x2="329.667" y2="318.142" />

</svg>

【讨论】:

  • 哇,酷!这就是我要的。太感谢了!如何去除淡入淡出效果?
  • @Eelyn:对不起,没有得到你所指的淡入淡出效果。您希望线条立即出现而不是淡入吗?
  • 是的,这就是我的意思。抱歉,我没有解释清楚。
【解决方案2】:

您可以播放动画时间。延迟仅适用于第一个动画。 您还应该将非前缀属性移到前面。

我制作了一个动画,每 5 秒(共 5 秒)闪烁 2 秒。

.firstpath {
  stroke-dasharray: 1500;
  animation: firstanimate 5s linear forwards infinite;
}

@keyframes firstanimate {
  from { stroke-dashoffset: 1500; }
  to { stroke-dashoffset: 0; }
}

.secondpath {
  stroke-dasharray: 500;
  animation: secondanimate 5s linear forwards infinite;
}

@keyframes secondanimate {
  from { stroke-dashoffset: 500; }
  to { stroke-dashoffset: 0; }
}

.thirdpath {
  stroke-dasharray: 500;
  animation: thirdanimate 5s linear forwards infinite;
}

@keyframes thirdanimate {
  from { stroke-dashoffset: 500; }
  to { stroke-dashoffset: 0; }
}


.row1col1 {
  animation: blink1 5s step-start 0s infinite;
  -webkit-animation: blink1 5s step-start 0s infinite;
}
@-webkit-keyframes blink1 {
    0% {
    opacity: 1.0;
  }
  70% {
    opacity: 1.0;
  }
  
  80% {
    opacity: 0.0;
  }
  
  100% {
    opacity: 1.0;
  }
}

@keyframes blink1 {
  0% {
    opacity: 1.0;
  }
  70% {
    opacity: 1.0;
  }
  80% {
    opacity: 0.0;
  }
  
  100% {
    opacity: 1.0;
  }
}

.row1col2 {
  animation: blinkl2 5s step-start 0s infinite;
  -webkit-animation: blink2 5s step-start 0s infinite;
}
@-webkit-keyframes blink2 {
  0% {
    opacity: 1.0;
  }
  80% {
    opacity: 1.0;
  }
  
  90% {
    opacity: 0.0;
  }
  
  100% {
    opacity: 1.0;
  }
}
@keyframes blink2 {
  0% {
    opacity: 1.0;
  }
  80% {
    opacity: 1.0;
  }
  
  90% {
    opacity: 0.0;
  }
  
  100% {
    opacity: 1.0;
  }
}
.row1col3 {
  animation: blinkl3 5s step-start 0s infinite;
  -webkit-animation: blink3 5s step-start 0s infinite;
}
@-webkit-keyframes blink2 {
  0% {
    opacity: 1.0;
  }
  90% {
    opacity: 1.0;
  }
  
  95% {
    opacity: 0.0;
  }
  
  100% {
    opacity: 1.0;
  }
}
@keyframes blink3 {
  0% {
    opacity: 1.0;
  }
  90% {
    opacity: 1.0;
  }
  
  95% {
    opacity: 0.0;
  }
  
  100% {
    opacity: 1.0;
  }
}
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 width="841.89px" height="595.28px" viewBox="0 0 841.89 595.28" enable-background="new 0 0 841.89 595.28" xml:space="preserve">
	 
	<g>
		<path class="firstpath" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
			M253.441,284.167c0,0-0.883-14.535,15.429-18.551c5.364-1.32,15.943-0.665,21.667,6.79c13.859,18.051-3.235,32.286-8.087,37.262
			c-4.853,4.979-7.713,21.027-17.543,20.528c-9.829-0.497-12.69-6.717-12.317-11.818"/>
			
		<path class="secondpath" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
			M285.249,285.252c0,0,0.654-8.212-8.864-10.544c-9.519-2.334-16.796,8.211-10.825,17.449c2.613-1.12,5.226,0.652,5.599,2.52
			c0.373,1.866-1.213,4.199-3.826,4.199"/>
			
		<path class="thirdpath" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
			M257.815,307.553c0,0-3.732,5.879,2.333,8.118c6.065,2.241,5.318-8.118,8.865-9.237c3.545-1.119,11.943-2.519,11.943-10.265
			c0-7.744-6.398-16.451-17.522-11.958"/>
	</g>

	<line class="row1col1" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="319.41" y1="287.987" x2="324.156" y2="286.627"/>

	<line class="row1col2" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="328.667" y1="285.335" x2="332.744" y2="284.167"/>

	<line class="row1col3" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="338.25" y1="301.171" x2="343.41" y2="301.171"/>

	<line class="row1col2" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="328.667" y1="301.171" x2="333.75" y2="301.171"/>

	<line class="row1col1" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="319.41" y1="301.171" x2="324.156" y2="301.171"/>

	<line class="row1col1" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="313.741" y1="314.625" x2="319.41" y2="315.987"/>

	<line class="row1col2" fill="none" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="323.741" y1="316.746" x2="329.667" y2="318.142"/>

【讨论】:

  • 酷!太感谢了。我会自己调整动画。
猜你喜欢
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2012-09-27
相关资源
最近更新 更多