Как сделать такую сложную анимацию на CSS?

Рейтинг: -1Ответов: 1Опубликовано: 09.04.2023

Есть картинки мяча и ворот:

введите сюда описание изображения введите сюда описание изображения

Как можно на CSS сделать такую анимацию?

  1. Мяч качается по дуге и вращается по часовой стрелке зацикленно. Анимация плавная, без рывков и нелинейная. Что-то на подобие этого:

введите сюда описание изображения

  1. После нажатия на кнопку мяч начинает лететь в ворота (сначала в верхний угол, потом в нижний).

Нажатие на кнопку сделано на jQuery:

$(".button").click(function(){
 // Действие
});

введите сюда описание изображения введите сюда описание изображения введите сюда описание изображения введите сюда описание изображения введите сюда описание изображения введите сюда описание изображения

Ответы

▲ 5

Как я понял, анимация довольно условная, поэтому большую её часть можно сделать без скриптов:

body {
  margin: 0;
  min-height: 100vh;
  background: 0% 0% / auto radial-gradient(#1a237e, #000) no-repeat;
  display: flex;
  flex-flow: column nowrap;
  justify-content: center;
  align-items: center;
  overflow: hidden;
}

.wrapper {
  font-size: min(10vh,10vw); /* Масштаб */
  width: 6.98em; height: 5.58em;
  perspective: 5.58em;
  background-image: radial-gradient(closest-side, #673ab7, #3f51b521, #fff0);
}

.wrapper > div { position: absolute; }

.gate {
  width: 6.98em; height: 5.58em;
  transform-origin: bottom center;
  transform: translateZ(-5.58em);
  background-image: url('https://i.sstatic.net/0NfPK.png');
  background-size: 100%;
}

.field {
  width: 6.98em; height: 5.58em;
  transform-origin: bottom center;
  transform: rotateX(90deg) scale(2);
  background-image: linear-gradient(#0880, #161);
  box-shadow: inset 0 -0.03em 0.02em 0.05em #eee8;
}

.ball-kick {
  position: relative;
  width: 6.98em; height: 5.58em;
  transform-origin: bottom center;
  transition: 0.4s ease-out;
}
input:checked ~ .wrapper .ball-kick { transform: translateZ(-5.58em) scale(0.4); }

.ball-wrapper {
  position: absolute; left: 50%;
  width: 2.21em; height: 5.58em;
  transform-origin: top center;
  animation: ball_move 2s ease-in-out infinite alternate;
}
input:checked ~ .wrapper .ball-wrapper {
  animation-play-state: paused;
  transform: translatex(-50%) rotate(0turn);
  transition: 0.5s ease-out;
}

.ball {
  position: absolute; bottom: 0;
  width: 2.21em; height: 2.21em;
  transform-origin: center center;
  background-image: url('https://i.sstatic.net/myNKU.png');
  background-size: 100%;
  animation: ball_spin 2s linear infinite;
}
input:checked ~ .wrapper .ball {
  animation-duration: 60s;
  transition: 0.5s ease-in;
}

@keyframes ball_move {
  from { transform: translatex(-50%) rotate(-0.1turn); }
  to { transform: translatex(-50%) rotate(0.1turn); }
}
@keyframes ball_spin { to { transform: rotate(1turn); }}
<input type="checkbox">
<div class="wrapper">
  <div class="field"></div>
  <div class="gate"></div>
  <div class="ball-kick">
    <div class="ball-wrapper">
      <div class="ball"></div>
    </div>
  </div>
</div>

Скриптами делайте логику и контроль состояний.