每个 <g> 的 CSS 动画“原点”

Posted

技术标签:

【中文标题】每个 <g> 的 CSS 动画“原点”【英文标题】:CSS animation 'origin' for each <g> 【发布时间】:2019-07-04 21:01:48 【问题描述】:

使用 CSS 动画,我为单词中的每个字母添加了“摆动”效果。每个字母由一个 SVG 组 &lt;g&gt; 组成。但是,正如您在示例中看到的那样,每个字母的效果变得更加极端,而我希望每个字母都有一致的“摆动”(每个字母的效果相同)。如何做到这一点?

注意:我没有包含 SVG 源代码,以保持问题整洁。如有需要,可以在示例中看到。

谢谢。

SCSS

// Logo
.logo 
    position: fixed;
    top: 50%;
    left: 50%;
  transform: translate(-50%,-50%);
    z-index: 1;
    width: 260px;
    display: block;

    // SVG
    svg 
        display: block;
        width: 100%;
        overflow: visible;

        g 
            fill: transparent;
            transition: all 300ms ease-in-out;

            @keyframes wobble 
              0%  transform: rotate(0) translate3d(0, 0, 0) 
              25%  transform: rotate(2deg) translate3d(1px, 0, 0) 
              50%  transform: rotate(-1deg) translate3d(0, -1px, 0) 
              75%  transform: rotate(1deg) translate3d(-1px, 0, 0) 
              100%  transform: rotate(-2deg) translate3d(-1px, -1px, 0) 
            

            animation-duration: 400ms;
            animation-iteration-count: infinite;
            animation-fill-mode: none;
            animation-name: wobble;
            animation-timing-function: ease-in-out;

            path 
                fill: red;
            
        
  

Example

【问题讨论】:

你必须为每个字母使用 SVG 吗? 如果您将transform-origin: center; 添加到g,您会看到“摆动”居中。我猜是你的 SVG 动画,而不是每个 g 【参考方案1】:

我不知道如何使用 SVG 来做到这一点 - 我确实设法想出了与您的要求相似的东西。

部分解决方案涉及使用旋转中心点:

transform-origin: center;

请看下面的演示

#my-logo div 
  display: inline-block;
  color: red;
  font-size: 60px;
  font-family: arial;
  font-weight: bolder;
  text-transform: uppercase;
  fill: transparent;
  transition: all 300ms ease-in-out;
  transform-origin: center;
  animation-duration: 400ms;
  animation-iteration-count: infinite;
  animation-fill-mode: none;
  animation-name: wobble;
  animation-timing-function: ease-in-out;


@keyframes wobble 
  0% 
    transform: rotate(0) translate3d(0, 0, 0);
  
  25% 
    transform: rotate(2deg) translate3d(1px, 0, 0);
  
  50% 
    transform: rotate(-1deg) translate3d(0, -1px, 0);
  
  75% 
    transform: rotate(1deg) translate3d(-1px, 0, 0);
  
  100% 
    transform: rotate(-2deg) translate3d(-1px, -1px, 0);
  
<div id="my-logo">
  <div>o</div>
  <div>u</div>
  <div>t</div>
  <div>r</div>
  <div>a</div>
  <div>g</div>
  <div>e</div>
  <div>
    <!-- also works with images -->
    <img src="http://placekitten.com/100/100" />
  </div>
</div>

【讨论】:

感谢@ochi - 感谢您的回答,这是一个很好的解决方案。但是,由于我需要它用于 SVG,所以 iot 并没有完全回答这个问题,所以我没有标记为正确。再次感谢

以上是关于每个 <g> 的 CSS 动画“原点”的主要内容,如果未能解决你的问题,请参考以下文章

CSS3 | CSS3实现云雾缭绕动画效果

Css3控制变形原点

svg子元素上的CSS变换原点问题

css3 动画

操纵 svg 圆原点以创建围绕中心的旋转动画

css3 转换 过渡 动画 CSS 优化