【问题标题】:How to move all paths in an SVG to the same point如何将 SVG 中的所有路径移动到同一点
【发布时间】:2019-01-21 16:27:05
【问题描述】:

我想用 CSS 为网站徽标制作动画。我的徽标类似于:A B C。现在它是一个包含 3 条路径的 SVG,如下所示:

<div id="logo-wrapper">
  <svg class="logo-svg" enable-background="new 0 0 100 20" version="1.1" viewBox="0 0 100 20" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
      <path class="logo-letter logo-a" d="..." fill="#26508C"/>
      <path class="logo-letter logo-b" d="..." fill="#26508C"/>
      <path class="logo-letter logo-c" d="..." fill="#26508C"/>
  </svg>
</div>

“A”应该留在原地,“B”和“C”应该向左移动,在最后的“A”前面完成。 IE。这 3 条路径以一个单词开头,它们应该在相同的位置(“A”所在的位置)结束。

我尝试了什么:

.logo-b,
.logo-c  {
  animation: go-left 2s ease infinite;
}

@keyframes go-left {
  100% { transform: translate(0%, 0%); } 
}

我开始尝试使用translate(-100px,0px)(SVG 应该是 100px 宽),但从逻辑上讲,这会将其他 100px 旁边的所有字母移到左侧。

任何帮助将不胜感激。谢谢!

编辑:我想我可以分别为每条路径设置动画,类似于“B”的translate(-50px,0px) 和“C”的translate(-80px,0px)。但实际上在我的实际项目中,大约有 15 条路径,我想有一个更好(更少代码)的解决方案。

【问题讨论】:

  • 我会推荐一个像 snap.svg snapsvg.io/docs/#Element.animate 这样的 JavaScript 库来管理你的动画。它将允许您指定实际的XY 坐标,即您希望路径结束的位置(在动画结束时)。
  • 另一种选择是让所有对象从其终点的固有位置开始,然后使用transform: translate() 属性手动置换每个对象。那么如果你的@keyframe 动画是{ transform: translate(0%, 0%); } 他们都会回到他们的初始位置。

标签: css svg css-animations translate-animation


【解决方案1】:

这是一个想法。

创作您的 svg,使所有对象都处于其最终位置,然后使用 css 变换将它们移动到它们的起始位置。然后你的动画:

@keyframes go-left {
  100% { transform: translate(0%, 0%); } 
}

会将它们全部移动到原来的位置。

参见示例:

.obj1 {
transform: translate(33%, 0%);
}

.obj2 {
transform: translate(66%, 0%);
}

.obj1, .obj2, .obj3  {
   animation: go-left 2s ease infinite;
}

@keyframes go-left {
  100% { transform: translate(0%, 0%); } 
}
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 537.71 130.97">
  <defs>
    <style>
      .cls-1 {
        fill: #fff;
        stroke: #000;
        stroke-miterlimit: 10;
        stroke-width: 7px;
      }
    </style>
  </defs>
  <title>Untitled-1</title>
  <rect class="cls-1 obj1" x="21.85" y="19.4" width="94" height="94"/>
  <circle class="cls-1 obj2" cx="68.35" cy="65.9" r="57.5"/>
  <polygon class="cls-1 obj3" points="68.86 7.91 87.81 46.31 130.19 52.47 99.52 82.36 106.76 124.57 68.86 104.64 30.95 124.57 38.19 82.36 7.52 52.47 49.9 46.31 68.86 7.91"/>
</svg>

无论你有多少对象,这都会起作用。只要您对使用 CSS 转换设置它们的“开始”位置感到满意。

【讨论】:

  • 这是个好主意,但类似于我在上面的编辑中描述的方法:为每个元素/形状单独设置位置。由于看起来没有更简单的方法可以在不使用库的情况下执行此操作,因此我将其标记为已接受。谢谢! :)
猜你喜欢
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2012-05-22
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多