SVG 动画圆圈垂直和水平居中

Posted

技术标签:

【中文标题】SVG 动画圆圈垂直和水平居中【英文标题】:SVG animated circles to the center vertically and horizontally 【发布时间】:2021-11-18 05:15:09 【问题描述】:

我正在尝试创建一个 SVG 加载占位符,我想将 3 个动画 圆圈垂直和水平放置在矩形中的中心,而不会相互重叠。我尝试将它们放入 g 并使用 CSS 应用 widthmargin 但这不起作用。有没有办法实现?

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"   viewBox="0 0 500 100">
      <rect   fill="#f3f3f3"/>
      <circle fill="#2FC143" stroke="none" cx="6" cy="50" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 15 ; 0 -15; 0 15" repeatCount="indefinite" begin="0.1"></animateTransform>
      </circle>
      <circle fill="#2FC143" stroke="none" cx="30" cy="50" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 10 ; 0 -10; 0 10" repeatCount="indefinite" begin="0.2"></animateTransform>
      </circle>
      <circle fill="#2FC143" stroke="none" cx="54" cy="50" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 5 ; 0 -5; 0 5" repeatCount="indefinite" begin="0.3"></animateTransform>
      </circle>
</svg>

【问题讨论】:

【参考方案1】:

我会简化 SVG 并使用 css 来布置 SVG 在其父容器中的位置/方式。

另外,如果您在 SVG 填充属性中使用 currentColor,颜色将被继承。

body,
html 
  margin: 0;
  height: 100%;


.svg-wrapper 
  background: #eee;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 300px;


svg 
  width: 60px;
  color: #2FC143;


.secondary 
  background: #ddd;
  height: 100px;
  width: 300px;


.secondary svg 
  color: lightcoral;
<div class="svg-wrapper">
  <svg viewBox="0 0 60 42">
      <circle fill="currentColor" stroke="none" cx="6" cy="21" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 15 ; 0 -15; 0 15" repeatCount="indefinite" begin="0.1"></animateTransform>
      </circle>
      <circle fill="currentColor" stroke="none" cx="30" cy="21" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 10 ; 0 -10; 0 10" repeatCount="indefinite" begin="0.2"></animateTransform>
      </circle>
      <circle fill="currentColor" stroke="none" cx="54" cy="21" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 5 ; 0 -5; 0 5" repeatCount="indefinite" begin="0.3"></animateTransform>
      </circle>
  </svg>
</div>

<div class="svg-wrapper secondary">
  <svg viewBox="0 0 60 42">
      <circle fill="currentColor" stroke="none" cx="6" cy="21" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 15 ; 0 -15; 0 15" repeatCount="indefinite" begin="0.1"></animateTransform>
      </circle>
      <circle fill="currentColor" stroke="none" cx="30" cy="21" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 10 ; 0 -10; 0 10" repeatCount="indefinite" begin="0.2"></animateTransform>
      </circle>
      <circle fill="currentColor" stroke="none" cx="54" cy="21" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 5 ; 0 -5; 0 5" repeatCount="indefinite" begin="0.3"></animateTransform>
      </circle>
  </svg>
</div>

没有 CSS 你可以使用preserveAspectRatio

<svg viewBox="0 0 60 42" preserveAspectRatio="xMidYMid meet"  >
      <rect   fill="#f3f3f3"/>
      <circle fill="currentColor" stroke="none" cx="6" cy="21" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 15 ; 0 -15; 0 15" repeatCount="indefinite" begin="0.1"></animateTransform>
      </circle>
      <circle fill="currentColor" stroke="none" cx="30" cy="21" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 10 ; 0 -10; 0 10" repeatCount="indefinite" begin="0.2"></animateTransform>
      </circle>
      <circle fill="currentColor" stroke="none" cx="54" cy="21" r="6">
        <animateTransform attributeName="transform" dur="1s" type="translate" values="0 5 ; 0 -5; 0 5" repeatCount="indefinite" begin="0.3"></animateTransform>
      </circle>
  </svg>

【讨论】:

我认为动画和半径可以做到的最小viewBox高度是42,动画在这段代码sn-p中被剪掉了一点。此外,xmnls 属性可以完全删除,因为它是内联 SVG,而不是用作图像。 感谢@JHeth 更新了您的建议 @ksav 我正在使用 LiteSpeed Webserver 插件,它只允许内联 SVG。我没有用 HTML 包装它的选项。不过谢谢。

以上是关于SVG 动画圆圈垂直和水平居中的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何在垂直stackview中水平居中元素

css如何实现span在div中水平居中

模态框中水平垂直居的问题

如何使文字在div中水平和垂直居中的css代码

以自定义垂直距离水平居中子视图|斯威夫特

在GridPane JAVAFX中水平居中一行