【问题标题】:SVG element rotate on circleSVG元素在圆圈上旋转
【发布时间】:2019-09-14 23:15:32
【问题描述】:

所以我有一个 SVG 元素 - 大圆圈 - 和里面的一组元素。

我想围绕这个大圆圈旋转这些元素。代码非常简单,但我已经开始担心如何在正确的路径(大圆圈)上设置这个圆圈(graph__skils)。正如您在下面的链接中看到的,这个小圆圈在大圆圈上旋转不正确。请帮忙

Circle rotate jsfiddle

HTML 文件

<section class="graph">
 <svg xmlns="http://www.w3.org/2000/svg" 
    width="670" 
    height="696" 
    viewBox="0 0 670 696">
    <g>
      <g class="graph__middle">
         <path fill="#3f9" d="M345 264c34.794 0 63 28.206 63 63s-28.206 63-63 63-63-28.206-63-63 28.206-63 63-63z"/>
      </g>

       <g class="graph__design" >
          <g class="graph_mainCircle">
             <path fill="none" stroke="#cf9" stroke- linecap="round" stroke-linejoin="round" stroke-miterlimit="50" d="M345 197c71.797 0 130 58.203 130 130s-58.203 130-130 130-130-58.203-130-130 58.203-130 130-130z"/>
          </g>

          <g class="graph__skills">
             <g class="graph__middle">
                <path fill="#cf9" d="M445.053 387c11.052 0 20.012 8.954 20.012 20s-8.96 20-20.012 20-20.012-8.954-20.012-20 8.96-20 20.012-20z"/>
              </g>
         </g>
      </g>
    </g>
</svg>

SCSS 文件

.graph {
  position: relative;
  width:500px;
  height:500px;

  svg {
    position: relative;
    border: 2px solid blue;
    width: 99%;
    height: 99%;
  }

  &__design {
    position: relative;
  }

  &__skills {
    transform-origin: center;
    position: absolute;
    animation: mercury-group 18s linear infinite;
  }

  &__middle {
    position: relative;
  }
}

@keyframes mercury-group {
  0% {
    transform: rotateZ(0deg);
  }

  100% {
    transform: rotateZ(-360deg);
  }
}

【问题讨论】:

    标签: css animation svg


    【解决方案1】:

    svg 元素的中心不是行星的中心。您需要将transform-origin 更改为345px 328px。为了计算新中心,我使用了 graph__middle 的 getBBox() 方法

    .graph {
      position: relative;
      width: 500px;
      height: 500px;
    }
    .graph svg {
      position: relative;
      border: 2px solid blue;
      width: 99%;
      height: 99%;
    }
    .graph__design {
      position: relative;
    }
    .graph__skills {
      transform-origin: 345px 328px;
      position: absolute;
      animation: mercury-group 18s linear infinite;
    }
    .graph__middle {
      position: relative;
    }
    
    @keyframes mercury-group {
      0% {
        transform: rotateZ(0deg);
      }
      100% {
        transform: rotateZ(-360deg);
      }
    }
    <section class="graph">
         <svg xmlns="http://www.w3.org/2000/svg" 
            width="670" 
            height="696" 
            viewBox="0 0 670 696">
            <g>
              <g class="graph__middle" id="KK">
                 <path fill="red" d="M345 264c34.794 0 63 28.206 63 63s-28.206 63-63 63-63-28.206-63-63 28.206-63 63-63z"/>
              </g>
    
               <g class="graph__design" >
                  <g class="graph_mainCircle">
                     <path fill="none" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="50" d="M345 197c71.797 0 130 58.203 130 130s-58.203 130-130 130-130-58.203-130-130 58.203-130 130-130z"/>
                  </g>
    
                  <g class="graph__skills">
                     <g class="graph__middle">
                        <path d="M445.053 387c11.052 0 20.012 8.954 20.012 20s-8.96 20-20.012 20-20.012-8.954-20.012-20 8.96-20 20.012-20z"/>
                      </g>
                 </g>
              </g>
            </g>
           
           <circle cx="345" cy="328" r="3" />
        </svg>
    </section>

    【讨论】:

      【解决方案2】:

      您可以像下面这样旋转大圆圈:

      .graph {
        position: relative;
        width: 500px;
        height: 500px;
      }
      
      svg {
        position: relative;
        border: 2px solid blue;
        width: 99%;
        height: 99%;
      }
      
      .graph__design {
        position: relative;
        transform-box:fill-box;
        transform-origin: center;
        animation: mercury-group 18s linear infinite;
      }
      
      .graph__skills {
        transform-origin: center;
        position: absolute;
      }
      
      .graph__middle {
        position: relative;
      }
      
      
      
      @keyframes mercury-group {
        0% {
          transform: rotateZ(0deg);
        }
        
        100% {
          transform: rotateZ(-360deg);
        }
      }
      <section class="graph">
        <svg xmlns="http://www.w3.org/2000/svg" width="670" height="696" viewBox="0 0 670 696">
              <g>
                <g class="graph__middle">
                   <path fill="#3f9" d="M345 264c34.794 0 63 28.206 63 63s-28.206 63-63 63-63-28.206-63-63 28.206-63 63-63z"/>
                </g>
      
                 <g class="graph__design" >
                    <g class="graph_mainCircle">
                       <path fill="none" stroke="#cf9" stroke- linecap="round" stroke-linejoin="round" stroke-miterlimit="50" d="M345 197c71.797 0 130 58.203 130 130s-58.203 130-130 130-130-58.203-130-130 58.203-130 130-130z"/>
                    </g>
      
                    <g class="graph__skills">
                       <g class="graph__middle">
                          <path fill="#cf9" d="M445.053 387c11.052 0 20.012 8.954 20.012 20s-8.96 20-20.012 20-20.012-8.954-20.012-20 8.96-20 20.012-20z"/>
                        </g>
                   </g>
                </g>
              </g>
          </svg>
      </section>

      【讨论】:

      • 好的,谢谢,这是个好主意,但是我里面有更多的圆圈,当我添加第二个时,它们会失去稳定性。我不知道发生了什么事。我不知道是什么原因。从早上开始我就一直在与它作斗争 - jsfiddle.net/n5amvbdw/2
      • @Agata 如果添加另一个元素(例如:jsfiddle.net/s5hdawep),则需要调整变换原点,因为它不再是正方形
      【解决方案3】:

      SVG 示例

      我的例子并没有完全回答你的问题,但我希望你能从我的回答中得到一些想法。

      从动画的名字来看mercury-group你想创建一个太阳系的模型。
      我提出了行星围绕太阳旋转的动画的变体。

      我将太阳系行星的旋转中心定位在太阳中心,坐标为x =" 250 "y =" 175 "太阳中心

      因此,行星绕太阳公转的动画组有以下形式:

      <animateTransform 
            attributeName="transform" 
            type="rotate"
            values="0 250 175;360 250 175" 
            dur="12s"
            repeatCount="indefinite"
        />        
      

      滤镜和渐变用于设计行星和太阳的外观。

      太阳波纹和改变颜色的动画

      <radialGradient id="gradSun">
              <stop offset="80%" stop-color="yellow">
               <animate attributeName="offset" values="80%;20%;80%" dur="6s" repeatCount="indefinite" />
               </stop>
              <stop offset="100%" stop-color="gold" >
              <animate attributeName="stop-color" values="gold;red;gold" dur="6s" repeatCount="indefinite" />
              </stop>
            </radialGradient>   
      

      下面是行星绕太阳旋转的完整动画代码:

      .solar-system{
        background-color:#002;
        width:100%;
        height:100%;
      }
      .sun{
        
        fill:url(#gradSun);
        filter:url(#dropShadow2);
        
       }
       .Earth-orbit{
        stroke:rgba(255,255,255,.4);
          stroke-width:1;
        fill:none;
        }
      .Earth{
         filter:url(#dropShadow1);
         fill:url(#gradEarth);
       }
      <div class="solar-system">
        <svg version="1.1" xmlns="http://www.w3.org/2000/svg" 
          xmlns:xlink="http://www.w3.org/1999/xlink"
            viewBox="0 0 500 400" > 
       <defs>
       <filter id="dropShadow1" 
          x="-20%" y="-20%" 
      		width="150%" height="150%">
      	<feGaussianBlur   stdDeviation="1" />
       </filter>
          <filter id="dropShadow2" 
      		x="-20%" y="-20%" 
      		width="150%" height="150%">
      		<feGaussianBlur   stdDeviation="4" />
      	</filter>
      	 <radialGradient id="gradSun">
              <stop offset="80%" stop-color="yellow">
      		 <animate attributeName="offset" values="80%;20%;80%" dur="6s" repeatCount="indefinite" />
      		 </stop>
              <stop offset="100%" stop-color="gold" >
      		<animate attributeName="stop-color" values="gold;red;gold" dur="6s" repeatCount="indefinite" />
      		</stop>
            </radialGradient>
       <linearGradient id="gradEarth">
      	<stop offset="40%" stop-color="dodgerblue"></stop>
      	<stop offset="100%" stop-color="yellowgreen" ></stop>
       </linearGradient>	  
       </defs>	 
       <!-- planet rotation animation -->
         <g>
        <animateTransform 
      	  attributeName="transform" 
      	  type="rotate"
            values="360 250 175;0 250 175" 
      	  dur="12s"
      	  repeatCount="indefinite"
        />
       <circle class="Earth-orbit" cx="250" cy="175" r="90"     />
       <circle class="Earth" cx="160" cy="175" r="10" transform="rotate(45 250 175)"  />
      </g>
       <circle class="sun" cx="250" cy="175" r="20"  /> 
      </svg>

      【讨论】:

        【解决方案4】:

        首先,你必须设置关键帧,然后使用 css 动画

        @-webkit-keyframes rotated {
        0% {
            -webkit-transform: rotate(0);
            transform: rotate(0);
        }
        
        100% {
            -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
        }}
        
        
        @keyframes rotated {
        0% {
            -webkit-transform: rotate(0);
            transform: rotate(0);
        }
        
        100% {
            -webkit-transform: rotate(360deg);
            transform: rotate(360deg);
        }}
        

        然后在css中使用动画

        .bg-shape{
        animation: rotated 35s linear infinite;}
        

        然后在html中使用svg图片来旋转

        <div class="col-lg-4">
                                <div class="inner-wrapper text-center">
                                    <div class="mb-3">
                                        <img src="../img/svg/shape-37.svg" alt="" class="bg-shape">
                                    </div>
                                </div>
                            </div>
        

        【讨论】:

          猜你喜欢
          • 2017-09-16
          • 2020-10-02
          • 2018-07-01
          • 1970-01-01
          • 2019-04-25
          • 2015-07-20
          • 2021-07-30
          • 2016-02-21
          • 1970-01-01
          相关资源
          最近更新 更多