SVG элемент вращается по кругу - PullRequest
4 голосов
/ 25 апреля 2019

Итак, у меня есть элемент SVG - большой круг - и группа элементов внутри.

Я бы хотел вращать эти элементы вокруг этого большого круга.Код очень прост, но я уже волнуюсь, как установить этот круг (graph__skils) на правильный путь (большой круг).Как вы можете видеть по ссылке ниже, этот маленький круг вращается неправильно на большом круге.Пожалуйста, помогите

Поворот круга 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);
  }
}

Ответы [ 3 ]

4 голосов
/ 25 апреля 2019

Центр элемента SVG не является центром ваших планет. Вам нужно будет изменить transform-origin на 345px 328px. Чтобы рассчитать новый центр, я использовал метод getBBox () для graph__middle

.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>
4 голосов
/ 25 апреля 2019

Вместо этого вы можете вращать большой круг, как показано ниже:

.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>
2 голосов
/ 28 апреля 2019

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>
...