Как сделать НЕ параллельную сменяемость анимаций в css?

Как сделать так, чтобы после завершения одной анимации, НЕ параллельно начиналась другая? (затем чтобы все повторялось)


Ответы (1 шт):

Автор решения: ΝNL993

Поигрался с CSS'ом, понял что без старого доброго JS никак, анимацию можно задержать конечно, но только один раз, в итоге анимации синхронизируются и начинают работать вместе, тут пример такой проблемы:

#anim1, #anim2 {
  width: 50px;
  height: 50px;
  outline: 1px solid black;
}

#anim1 {
  animation: anim 3s infinite both;
}

#anim2 {
  animation: anim 3s /* <-- Время анимации */ 3s /* <-- Задержка */ infinite both;
}

@keyframes anim {
  0% {
    background: red;
  }

  50% {
    background: blue;
  }

  100% {
    background: red;
  }
}
<div id="anim1"></div>
<div id="anim2"></div>

Но мы ведь не ограничены одним CSS'ом, можно и JavaScript воспользоваться, тут пример как я реализовать в JavaScript:

let anim1 = document.querySelector('#anim1')
let anim2 = document.querySelector('#anim2')

class AnimationAutoChangeState {
  constructor(elem1, elem2) {
    this.elem1 = elem1
    this.elem2 = elem2
  }

  init() {
    let elem1 = this.elem1
    let elem2 = this.elem2

    elem2.style.animationPlayState = 'paused'

    for (let i = 0; i < 2; i++) {
      let els = getElements(elem1, elem2, i)

      addListener(els.el1, els.el2)
    }

    function getElements(element1, element2, index) {
      return index === 0 ? {
        el1: elem1,
        el2: elem2,
      } : {
        el1: elem2,
        el2: elem1,
      }
    }

    function addListener(element1, element2) {
      let animationName = 'animationPlayState'

      element1.addEventListener('animationiteration', () => {
        element1.style[animationName] = 'paused'
        element2.style[animationName] = 'running'
      })
    }
  }
}

new AnimationAutoChangeState(anim1, anim2)
  .init()
#anim1, #anim2 {
  width: 50px;
  height: 50px;
  outline: 1px solid black;
}

#anim1 {
  animation: anim 3s infinite both;
}

#anim2 {
  animation: anim 3s infinite both;
}

@keyframes anim {
  0% {
    background: red;
  }

  50% {
    background: blue;
  }

  100% {
    background: red;
  }
}
<div id="anim1"></div>
<div id="anim2"></div>

Объяснение

Я воспользовался событием animationiteration, чтобы оно сработало нужно чтобы элемент постоянно воспроизводил анимацию бесконечно (нужно либо в animation добавить infinite, либо создать пропорцию animation-iteration-count со значением infinite), так что убедитесь что у вас анимация воспроизводится бесконечно. Я создал класс AnimationAutoChangeState, в конструктор идёт два аргумента, первый elem1, второй elem2. У второго элемента сразу отключается воспроизведение анимации, и дальше добавляется событие animationiteration элементам. При окончании итерации анимации у первого элемента, у второго элемента она начинает воспроизводиться, а у первого наоборот останавливается, точно также всё происходит у второго элемента, только элементы изменены местами.

→ Ссылка