Как добавить противоположную анимацию

143
22 декабря 2019, 07:10

Хочу сделать вот такую анимацию: https://dribbble.com/shots/3633228-Avanti-e-indietro-loader .

Но застопорился :( Буду очень благодарен кто поможет доделать анимацию (желательно доделать с помощью javascript/jquery)! Вот код:

:root { 
  --duration: 1.5s; 
  --container-size: 210px; 
  --box-size: 33px; 
  --box-border-radius: 15%; 
} 
 
html, 
body { 
  width: 100%; 
  height: 100%; 
  overflow: hidden; 
  margin: 0; 
  padding: 0; 
  display: flex; 
  justify-content: center; 
  align-items: center; 
} 
 
.circle { 
  width: var(--container-size); 
  display: flex; 
  justify-content: space-between; 
  align-items: center;  
  position: relative; 
  } 
 
.
Answer 1

Вот вариант, только с таймингами и оформлением еще надо поколдовать...

HTML

<div class="playground">
  <div class="boll"></div>
  <div class="ellipse">
    <div class="circle"></div>
  </div>
  <div class="ellipse">
    <div class="circle"></div>
  </div>
  <div class="ellipse">
    <div class="circle"></div>
  </div>
  <div class="ellipse">
    <div class="circle"></div>
  </div>
</div>

CSS

:root {
  --duration: 5s;
  --half-duration: 2.5s;
  --container-size: 210px;
  --box-size: 33px;
  --box-border-radius: 15%;
}
html,
body {
  width: 100%;
  height: 100%;
  overflow: hidden;
  margin: 0;
  padding: 0;
  display: flex;
  justify-content: center;
  align-items: center;
}
.playground {
  width: var(--container-size);
  display: flex;
  justify-content: space-between;
  align-items: center; 
  position: relative;
  }

.ellipse {
  width: 165px;
  height: 165px;
  border-radius: 50%;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  position: relative;
  border: none;
  transform-style: preserve-3d;
  transform: rotateZ(180deg) rotateY(55deg);
}
.ellipse .circle {
  width: 33px;
  height: 33px;
  border-radius: 50%;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  position: absolute;
}
.boll {
  margin-left: -25px;
  width: 33px;
  height: 33px;
  position: absolute;
  display: block;
  transform-origin: -50% center;
  border-radius: 50%;
  animation: slide var(--half-duration) ease-in-out infinite alternate;
}
.ellipse:nth-child(2) .circle {
  animation: move-1 linear infinite;
  animation-duration: var(--duration);
}
.ellipse:nth-child(3) .circle {
  animation: move-2 linear infinite;
  animation-duration: var(--duration);
}
.ellipse:nth-child(4) .circle {
  animation: move-3 linear infinite;
  animation-duration: var(--duration);
}
.ellipse:nth-child(5) .circle {
  animation: move-4 linear infinite;
  animation-duration: var(--duration);
}

@keyframes move-4 {
  0%, 7.5% {
    background-color: deeppink;
    transform: rotateZ(360deg) translateX(40px) rotateZ(-360deg) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
  17.5%, 50%, 82.5% {
    background-color: magenta;
    transform: rotateZ(180deg) translateX(40px) rotateZ(-180deg) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
  92.5%, 100% {
    background-color: deeppink;
    transform: rotateZ(0) translateX(40px) rotateZ(0) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
}
@keyframes move-3 {
  0%, 15% {
    background-color: tomato;
    transform: rotateZ(360deg) translateX(40px) rotateZ(-360deg) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
  25%, 50%, 75% {
    background-color: deeppink;
    transform: rotateZ(180deg) translateX(40px) rotateZ(-180deg) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
  85%, 100% {
    background-color: tomato;
    transform: rotateZ(0) translateX(40px) rotateZ(0) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
}
@keyframes move-2 {
  0%, 22.5% {
    background-color: darkorange;
    transform: rotateZ(360deg) translateX(40px) rotateZ(-360deg) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
  32.5%, 50%, 67.5% {
    background-color: tomato;
    transform: rotateZ(180deg) translateX(40px) rotateZ(-180deg) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
  77.5%, 100% {
    background-color: darkorange;
    transform: rotateZ(0) translateX(40px) rotateZ(0) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
}
@keyframes move-1 {
  0%, 30% {
    background-color: orange;
    transform: rotateZ(360deg) translateX(40px) rotateZ(-360deg) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
  40%, 50%, 60% {
    background-color: darkorange;
    transform: rotateZ(180deg) translateX(40px) rotateZ(-180deg) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
  70%, 100% {
    background-color: orange;
    transform: rotateZ(0) translateX(40px) rotateZ(0) rotateY(-70deg);
             box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
}
@keyframes slide {
  0% {
    background-color: deeppink;
    transform: translatex(calc(var(--container-size) + (var(--box-size) * 0.5)));
    box-shadow:  6px 6px  rgba(0,0,0,0.09);
  }
  100% {
    background-color: orange;
    transform: translatex(0vw);
    box-shadow:  6px 6px  rgba(0,0,0,0.09);
  }
}

Смотрите здесь: JSFiddle

Эллипсы позволяют вытянуть кривую обскока. Пример - здесь

READ ALSO
Как обернуть текст внутри label в тег?

Как обернуть текст внутри label в тег?

Всем привет! Хочу попросить советИмеется такой код HTML:

127
Фильтр вывода записей в WordPress

Фильтр вывода записей в WordPress

Сделал AJAX фильтр записей WordPressДля простоты включил в него только чекбокс, который включает сортировку записей по порядку (ASC)

165
Делегаты и их использование на манер событий

Делегаты и их использование на манер событий

Копаясь в книге Троэлсена по-поводу делегатов заметил такую забавную штуку что делегаты могут использоваться на манер событий и собсвтенно...

155