Я попытался создать адаптивное веб-приложение, которое на мобильных устройствах выглядит следующим образом:
При нажатии на строку меню он преобразуется в:
Стиль написан на SCSS и выглядит следующим образом:
.topbar-menu {
width: 100%;
height: 100%;
display: flex;
align-items: center;
position: relative;
.topbar-navi-menu {
margin-left: 15px;
height: 30px;
width: 40px;
display: block;
cursor: pointer;
position: relative;
i {
position: absolute;
height: 5px;
width: 100%;
background-color: #ffffff;
&.topbar-animate-forward {
&:first-child {
animation: topbar-first-bulk 500ms forwards;
}
&:nth-child(2) {
animation: topbar-middle-bulk 500ms forwards;
}
&:last-child {
animation: topbar-last-bulk 500ms forwards;
}
}
&:first-child {
top: 0;
}
&:nth-child(2) {
top: 50%;
transform: translateY(-50%);
}
&:last-child {
bottom: 0;
}
}
@keyframes topbar-first-bulk {
0% {
top: 0;
transform: translateY(0%) rotate(0deg);
}
25% {
top: 50%;
transform: translateY(-50%) rotate(0deg);
}
50% {
top: 50%;
transform: translateY(-50%) rotate(-45deg);
}
100% {
top: 50%;
transform: translateY(-50%) rotate(-45deg);
}
}
@keyframes topbar-middle-bulk {
0% {
top: 50%;
transform: translateY(-50%) rotate(0deg);
}
25% {
top: 50%;
transform: translateY(-50%) rotate(0deg);
}
50% {
top: 50%;
transform: translateY(-50%) rotate(45deg);
}
100% {
top: 50%;
transform: translateY(-50%) rotate(45deg);
}
}
@keyframes topbar-last-bulk {
0% {
bottom: 0;
transform: translateY(0%) rotate(0deg);
}
25% {
bottom: 50%;
transform: translateY(50%) rotate(0deg);
}
50% {
bottom: 50%;
transform: translateY(50%) rotate(-45deg);
}
100% {
bottom: 50%;
transform: translateY(50%) rotate(-45deg);
}
}
}
}
Я использую причина реагировать, это похоже на reactjs. Структура JSX:
<div className = "topbar-container">
<section className = "topbar-menu">
<a
onClick = {
_evt => self.send(MobileMenuToggler(self.state.showMobileMenu))
}
className = "topbar-navi-menu">
<i className = {self.state.mobileMenuAnimate} />
<i className = {self.state.mobileMenuAnimate} />
<i className = {self.state.mobileMenuAnimate} />
</a>
</section>
</div>
Как вернуть анимацию в строку меню с помощью CSS?






Используйте переход для переключения между состояниями. Вы не можете легко указать анимации двигаться вперед и назад, потому что их значение интерполяции, текущий временной шаг, на котором анимация включается, в некотором роде фиксировано. Даже если вы вдруг сказали стилю, что он должен двигаться назад, а не вперед, он не будет анимировать так, как вы думаете, потому что он просто применит новую функцию интерполяции с тем же текущим временным шагом, что означает, что он просто привяжется к новому интерполяция.
Вместо этого примените многоуровневые переходы и установите различные задержки перехода, инвертированные в зависимости от того, какими вы хотите, чтобы они были, когда вы удаляете «активный» класс.
Например, в вашем стиле вы хотели подождать, чтобы применить изменение преобразования, пока не пройдете 25% анимации. Просто установите для этого свойства задержку перехода.
Прочтите эту статью, чтобы узнать больше о многоступенчатой анимации: Использование многоступенчатой анимации и переходов.
const toggle = document.getElementById("toggle");
toggle.addEventListener("click", e => {
toggle.classList.toggle("topbar-animate-forward");
});.topbar-container {
background-color: blue;
padding: 1em;
}
.topbar-menu {
width: 100%;
height: 100%;
display: flex;
align-items: center;
position: relative;
}
.topbar-menu .topbar-navi-menu {
margin-left: 15px;
height: 30px;
width: 40px;
display: block;
cursor: pointer;
position: relative;
}
.topbar-menu .topbar-navi-menu i {
position: absolute;
height: 5px;
width: 100%;
background-color: #ffffff;
}
.topbar-menu .topbar-navi-menu i {
transition: top 500ms ease-in-out 125ms, bottom 500ms ease-in-out 125ms, transform 500ms ease-in-out;
}
.topbar-menu .topbar-navi-menutopbar-animate-forward i {
transition: top 500ms ease-in-out, bottom 500ms ease-in-out, transform 500ms ease-in-out 125ms;
}
.topbar-menu .topbar-navi-menu i:first-child {
top: 0;
transform: translateY(0%) rotate(0deg);
}
.topbar-menu .topbar-navi-menu.topbar-animate-forward i:first-child {
top: 50%;
transform: translateY(-50%) rotate(-45deg);
}
.topbar-menu .topbar-navi-menu i:nth-child(2) {
top: 50%;
transform: translateY(-50%);
}
.topbar-menu .topbar-navi-menu.topbar-animate-forward i:nth-child(2) {
top: 50%;
transform: translateY(-50%) rotate(45deg);
}
.topbar-menu .topbar-navi-menu i:last-child {
bottom: 0;
transform: translateY(0%) rotate(0deg);
}
.topbar-menu .topbar-navi-menu.topbar-animate-forward i:last-child {
bottom: 50%;
transform: translateY(50%) rotate(-45deg);
}<div class = "topbar-container">
<section class = "topbar-menu">
<a id = "toggle" class = "topbar-navi-menu">
<i></i>
<i></i>
<i></i>
</a>
</section>
</div>Что вы имеете в виду под интерполяцией?
Если это изменяется между открытым и закрытым состоянием, вы должны использовать переход, а не анимацию.