Итак, я некоторое время работал над сборкой и через некоторое время вернулся на веб-сайты, и один из вопросов, который все еще беспокоит меня сегодня: почему я не могу изменить класс из одной анимации (open / слайд в анимацию просмотра) в другой (закрытие / слайд из анимации просмотра)? Мне требовалось установить четыре разных имени класса для достижения этой цели, например:
.open {
height: 50px;
animation: keyframe 1s forwards 1 0s;
}
.opened {
height: 50px;
}
.close {
height: 0;
animation: keyframe 1s reverse forwards 1 0s;
}
closed {
height: 0;
}
А затем в моем javascript я вынужден добавить ключевой кадр, установить тайм-аут, а затем изменить его на без ключевого кадра в противном случае, если, скажем, закрытие уже произошло и осталось включенным без перехода к классу без анимации, а в javascript я делаю это go от закрытия прямо до открытия, это НЕ будет открывать анимацию? Так что мне приходилось делать что-то подобное в javascript:
if (window.pageYOffset == 0 && !elm.classList.contains("closed")) {
elm.className = "close";
setTimeout(() => {
elm.className = "closed";
}, 1000);
} else if (window.pageYOffset > 0 && !elm.classList.contains("opened")) {
elm.className = "open";
setTimeout(() => {
elm.className = "opened";
}, 1000);
}
Я хочу сделать вот что:
if (window.pageYOffset == 0 && !elm.classList.contains("close")) {
elm.className = "close";
} else if (window.pageYOffset > 0 && !elm.classList.contains("open")) {
elm.className = "open";
}
Но если вы это сделаете браузер, который я использую, - это Google Chrome, НЕ будет переключаться и воспроизводить анимацию, и это подводит меня к следующей части моего вопроса: какое время таймаута требуется в этом случае? Кажется, у меня должен быть хотя бы тайм-аут больше 50 мс, чтобы он зарегистрировал переключатель класса и сделал анимацию? Как рассчитать требуемый срок? Я предполагаю, что я должен создать бесконечный l oop после удаления части имени класса, а затем, когда он будет удален, активировать вторую часть добавления другого имени класса? Я должен сделать это, например:
elm.className = "";
setTimeout(() => {
elm.className = "new_class"
}, 50);
Этот пример показывает, как меня заставляют хотя бы удалить текущую анимацию «закрытия», дождаться тайм-аута, а затем добавить анимацию «открытия», но что Я не знаю, сколько времени требуется, чтобы этот тайм-аут был эффективным? Я видел, что использование чего-либо менее 50 мс будет отменено и не будет работать с новой анимацией.