Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

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

#javascript #css #jquery #анимация


Хочу сделать вот такую анимацию: 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;
  }

.📦 {
  width: var(--box-size);
  height: var(--box-size);
  position: relative;
  display: block;
  transform-origin: -50% center;
  border-radius: 50%;

}
.📦:after {
  content: "";
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  right: 0;
  background-color: orange; 
  border-radius: 50%;
animation-delay: 5s;
}

.📦:nth-child(1) {
          animation: slide var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(1):after {
          animation: color-change var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(2) {
          animation: flip-1 var(--duration)  infinite alternate;       
}
.📦:nth-child(3) {
          animation: flip-2 var(--duration)  infinite alternate;
}
.📦:nth-child(4) {
          animation: flip-3 var(--duration)  infinite alternate;
}
.📦:nth-child(5) {
          animation: flip-4  var(--duration)  infinite alternate;
}
.📦:nth-child(2):after {
  background-color: orange;
}
.📦:nth-child(3):after {
  background-color: darkorange;
}
.📦:nth-child(4):after {
  background-color: tomato;
}
.📦:nth-child(5):after {
  background-color: deeppink;
}
@keyframes slide {
  0% {
    background-color: orange;
            transform: translatex(0vw);
             box-shadow:  6px 6px  rgba(0,0,0,0.09);
  }
  100% {
    background-color: deeppink;
            transform: translatex(calc(var(--container-size) - (var(--box-size) *
1.54)));
            box-shadow:  6px 6px  rgba(0,0,0,0.09);
  }
}
@keyframes color-change {
  0% {
    background-color: orange;
  }
  100% {
    background-color: deeppink;
  }
}
@keyframes flip-1 {
  0%,
    15% {
            transform: rotate(0);
             box-shadow:  6px 6px  rgba(0,0,0,0.09);
  }
  35%,
    100% {
            transform: rotate(-180deg);
           box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
}
@keyframes flip-2 {
  0%,
    30% {
            transform: rotate(0);
             box-shadow:  6px 6px  rgba(0,0,0,0.09);
  }
  50%,
    100% {
            transform: rotate(-180deg);
              box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
}
@keyframes flip-3 {
  0%,
    45% {
            transform: rotate(0);
             box-shadow:  6px 6px  rgba(0,0,0,0.09);
  }
  65%,
    100% {
            transform: rotate(-180deg);
              box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
}
@keyframes flip-4 {
  0%,
    60% {
            transform: rotate(0);
             box-shadow:  6px 6px  rgba(0,0,0,0.09);
  }
  80%,
    100% {
           transform: rotate(-180deg);
            box-shadow:  -6px -6px  rgba(0,0,0,0.09);
  }
}


Ответы

Ответ 1



Вот вариант, только с таймингами и оформлением еще надо поколдовать... HTML
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 Эллипсы позволяют вытянуть кривую обскока. Пример - здесь

Комментариев нет:

Отправить комментарий