У меня есть css-анимация, в которой в зависимости от ситуации я хочу иметь возможность переключаться вперед или назад в любое время на основе некоторого JS. Вот простой пример:
html
<div id = "box"></div>
<button onclick = "toggle()">toggle</button>
js
window.isSmall = true;
window.toggle = function() {
if (isSmall) {
var el = document.getElementById("box");
el.classList.add("bigger");
} else {
// ????
}
isSmall = !isSmall;
}
css
@keyframes bigger {
from { width:100px; height:100px; }
to { width:200px; height:200px; }
}
#box {
width:100px;
height:100px;
background-color: red;
}
.bigger {
animation-name: bigger;
animation-duration: 1s;
animation-fill-mode: forwards;
}
Рабочий пример: http://jsfiddle.net/gbh408up/
Я думал, что это будет довольно просто, но, к удивлению, я не смог найти способ сделать это. Обратите внимание, я специально ищу решение с анимацией, а НЕ переходами. Любые идеи?
И почему вы хотите использовать молоток, когда вам нужна отвертка?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете работать с 2 классами, которые оживляют то, что требуется.
window.isSmall = true;
window.toggle = () => {
const box = document.getElementById("box");
if (isSmall) {
box.classList.remove("smaller");
box.classList.add("bigger");
} else {
box.classList.remove("bigger");
box.classList.add("smaller");
}
isSmall = !isSmall;
console.info(isSmall)
}@keyframes bigger {
from {
width: 100px;
height: 100px;
}
to {
width: 200px;
height: 200px;
}
}
@keyframes smaller {
from {
width: 200px;
height: 200px;
}
to {
width: 100px;
height: 100px;
}
}
#box {
width: 100px;
height: 100px;
background-color: red;
}
.bigger {
animation-name: bigger;
animation-duration: 1s;
animation-fill-mode: forwards;
}
.smaller {
animation-name: smaller;
animation-duration: 1s;
animation-fill-mode: forwards;
}<div id = "box"></div>
<button onclick = "toggle()">toggle</button>Ха, это забавно, я думал, что уже пробовал это, но я, должно быть, нащупал что-то по пути и пропустил это. Это здорово, спасибо!
Я только что закончил разбираться в этом. Итак, вот мое решение:
<div id = "box"></div>
<button onclick = "toggle()">toggle</button>
window.isSmall = true;
window.toggle = function() {
var el = document.getElementById("box");
if (el.className == "a") {
el.className = "b";
} else {
el.className = "a";
}
isSmall = !isSmall;
console.info('toggle');
}
@keyframes a {
from { width:100px; height:100px; }
to { width:200px; height:200px; }
}
@keyframes b {
from { width:200px; height:200px; }
to { width:100px; height:100px; }
}
#box {
width:100px;
height:100px;
background-color: red;
}
.a {
animation-name: a;
animation-duration: 1s;
animation-fill-mode: forwards;
}
.b {
animation-name: b;
animation-duration: 1s;
animation-fill-mode: forwards;
}
Я изменил «больше» на просто «а», а мое «меньшее» на просто «б». Но это работает. Хорошо, теперь он у меня на скрипке.
https://jsfiddle.net/markem/2b6n3gmc/1/
Кроме того, здесь, в StackOverflow, был дан ответ на этот вопрос:
наверное 2 анимации?