Два деления, вращающиеся вокруг центра анимации CSS - PullRequest
2 голосов
/ 14 октября 2019

Я пытаюсь "вращаться" по двум отдельным элементам div в круговом движении вокруг центра, однако у меня возникают проблемы с тем, чтобы два элемента div следовали по одному и тому же круговому пути в моей CSS-анимации.

.container {
  width: 500px;
  height: 500px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.box {
  background-color: pink;
  width: 100px;
  height: 100px;
  animation: battle 6s linear infinite;
  position: absolute;
  margin: 10px;
}

@keyframes battle {
  from {
    transform: rotate(0deg) translateX(150px) rotate(0deg);
  }
  to {
    transform: rotate(360deg) translateX(150px) rotate(-360deg);
  }
}
<div class="container">
  <div class="box">
  </div>
  <div class="box">
  </div>
</div>

Jsfiddle

Ответы [ 2 ]

4 голосов
/ 14 октября 2019

Пусть ваш родительский элемент будет направляющим;

Когда цель состоит в том, чтобы вращаться на одинаковом расстоянии вокруг центра (в противоположность, скажем, «эллиптической орбите», которая больше напоминает овальную форму), чемСамый простой способ - предоставить родителю установить согласованную границу и присоединить к нему дочерние элементы, чтобы использовать его положение в качестве пути анимации. Цель состоит в том, чтобы просто создать иллюзию отдельных элементов, движущихся синхронно, когда на самом деле вращается только один элемент, центр которого по умолчанию transform-origin выступает в качестве ориентира для детей, «вращающихся» внутри него.

В нашемВ этом случае мы взяли родителя с равной окружностью, примерно равной размеру «желаемой орбиты», и мы дали ему border-radius 50% для создания круга. Это не делает точку на элементе меньше или дальше от другого. Мы делаем его элементом position: relative, чтобы мы могли применять position: absolute к любым его дочерним элементам. В этом примере мы используем псевдоэлементы, но они также могут легко быть дополнительными элементами узла DOM, такими как div.

За счет привязки наших дочерних элементов к определенным точкам на родительском элементе мы создаем равное расстояние от X / Y родительского элемента. transform-origin центр, который мы желаем, и применяем rotate transform, чтобы раскрутить родителя. Однако, если бы мы только сделали это, то потомки также пошли бы по этому пути и не держали бы вертикаль (как предполагается, желательно), поэтому мы просто повторно используем ту же анимацию, примененную к родителю, но в reverse, чтобы сместить его вращение. В результате родительский элемент вращается в одном направлении, а дочерние - в другом, чтобы создать эффект, видимый в примере. Надеюсь, это поможет!

#rotator {
  position: relative;
  width: 7rem;
  height: 7rem;
  animation: rotations 6s linear infinite;
  border: 1px orange dashed;
  border-radius: 50%;
  margin: 3rem;
}

#rotator:before, #rotator:after {
  position: absolute;
  content: '';
  display: block;
  height: 3rem;
  width: 3rem;
  animation: inherit;
  animation-direction: reverse;
}

#rotator:before {
  background-color: red;
  top: -.25rem;
  left: -.25rem;
}

#rotator:after {
  background-color: green;
  bottom: -.25rem;
  right: -.25rem;
}


@keyframes rotations {
  to { transform: rotate(360deg) }
}
<div id="rotator"></div>
4 голосов
/ 14 октября 2019

То, что я делал много лет назад, может быть близко к тому, что вы ищете:

// Base
body {
  background: #252525;
}


// Keyframes
@keyframes rotateClockwise {
  100% {
    transform: rotate(360deg);
  }
}

@keyframes rotateCounterClockwise {
  100% {
    transform: rotate(-360deg);
  }
}


// Ring
.ring {
  position: relative;
  left: 50%;
  top: 50px;
  margin-left: -100px;
  height: 200px;
  width: 200px;
  border: 10px solid #666;
  border-radius: 50%;
}


// Dots
.dot {
  position: absolute;
  height: 250px;
  width: 40px;
  top: -25px;
  left: 50%;
  margin-left: -20px;
  
  &:before {
    display: block;
    content: '';
    height: 40px;
    width: 40px;
    border-radius: 50%;
    box-shadow: 0 2px 3px rgba(0,0,0,.1);
  }
}

.dot--one {
  animation: rotateClockwise 4s linear infinite;
  
  &:before {
    background: #e6a933;
  }
}

.dot--two {
  animation: rotateCounterClockwise 2s linear infinite;

  &:before {
    background: #e63348;
  }
}

.dot--three {
  animation: rotateClockwise 7s linear infinite;
  
  &:before {
    background: #70b942;
  }
}

.dot--four {
  animation: rotateCounterClockwise 12s linear infinite;
  
  &:before {
    background: #009ee3;
  }
}
<div class="ring">
  <div class="dot dot--one"></div>
  <div class="dot dot--two"></div>
  <div class="dot dot--three"></div>
  <div class="dot dot--four"></div>
</div>

https://codepen.io/seanstopnik/pen/93f9cbcbcf9b38684bfc75f38c9c4db3

...