Анимация ключевых кадров CSS из JS

#javascript #css #css-animations #keyframe

#javascript #css #css-анимация #ключевой кадр

Вопрос:

я хочу запустить анимацию на основе ключевых кадров css из javascript. После прочтения некоторых ответов на stackoverflow я попытался использовать функцию jquery addClass (нажмите на синюю фигуру, чтобы запустить анимацию): https://codepen.io/valentin-wei/pen/KKMRrYK

   With this approach i can only animate it once.
  

Есть ли способ последовательно анимировать эту фигуру взад и вперед с помощью javascript?

Ответ №1:

Решение, которое вы ищете javascript , — это либо разумное использование css-keyframes :

В вашем примере codepen replace everything inside you css with this code :

 test {
  background-color: blue;
  width:346px;
  height:213px;
    clip-path:  polygon(323.19px 0.00px, 0.00px 186.65px, 0.00px 213.00px, 346.00px 13.17px, 323.19px 0.00px);
}

.animate { 
  animation-duration: 3s;
  animation-name: animtest;
  animation-delay: 0;
  animation-iteration-count: infinite;
  animation-direction: forward;
}
.reverseanimate { 
  animation-duration: 3s;
  animation-name: animtest;
  animation-delay: 0;
  animation-iteration-count: infinite;
  animation-direction: reverse;
}

@keyframes animtest {
  0% {
    clip-path: polygon(323.19px 0.00px, 0.00px 186.65px, 0.00px 213.00px, 346.00px 13.17px, 323.19px 0.00px)
  }
  100% {
    clip-path: polygon(0.00px 168.65px, 0.00px 229.00px, 345.00px 30.17px, 292.64px 0.00px, 0.00px 168.65px)
  }
}
  

затем, replace everything inside you js with this code :

 let target = document.getElementById('test');
 setInterval(function(){  
 if ($(target).hasClass("animate")) {
    $(target).removeClass("animate");
    $(target).addClass("reverseanimate");
  }
  else {
    $(target).addClass("animate");
    $(target).removeClass("reverseanimate");
  }
 }, 3000);
  

ПРИМЕЧАНИЕ: по какой-то причине я не смог создать учетную запись в codepen

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

1. Спасибо за ваш ответ, но, к сожалению, это решение не работает для меня. Событие «щелчок» было просто примером. Мне нужно иметь возможность полностью запускать анимацию и ее обратный аналог из javascript

2. Я также отредактировал свой ответ, на этот раз я использовал jQuery (не ванильный js), используя setIntervals() , вы также можете заменить его как полностью запущенную функцию вместо метода. не могу точно сказать, на какой ответ вы надеетесь

3. Это для вашего редактирования. Это почти то, что я ищу. Однако я не хочу, чтобы он постоянно анимировался. Он должен просто анимировать анимацию или reverseanimation (в зависимости от состояния анимации) только один раз при вызове. В вашем решении анимация никогда не останавливается, например, если я удаляю интервал (вероятно, из-за бесконечного количества анимаций-итераций). Я пытался разобраться с вашим предложением, изменив некоторые параметры или поместив его в событие щелчка, но я не смог получить желаемый результат. Я надеюсь, что это проясняет мой вопрос.

Ответ №2:

После некоторых дальнейших исследований я смог решить эту проблему.

Вместо использования свойства анимации css я теперь использую переход:

 .animate { 
   transition: clip-path 3s;
   clip-path: polygon(0.00px 168.65px, 0.00px 229.00px, 345.00px 30.17px, 292.64px 0.00px, 0.00px 168.65px)

}
.reverseanimate { 
   transition: clip-path 3s;
   clip-path: polygon(323.19px 0.00px, 0.00px 186.65px, 0.00px 213.00px, 346.00px 13.17px, 323.19px 0.00px)
}
  

Я также обновил свой codepen, чтобы предоставить рабочий пример: https://codepen.io/valentin-wei/pen/KKMRrYK