Как перевернуть ключевой кадр?

Я попытался создать адаптивное веб-приложение, которое на мобильных устройствах выглядит следующим образом:

Как перевернуть ключевой кадр?

При нажатии на строку меню он преобразуется в:

Как перевернуть ключевой кадр?

Стиль написан на 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?

Если это изменяется между открытым и закрытым состоянием, вы должны использовать переход, а не анимацию.

zero298 21.08.2018 22:24
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
1
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте переход для переключения между состояниями. Вы не можете легко указать анимации двигаться вперед и назад, потому что их значение интерполяции, текущий временной шаг, на котором анимация включается, в некотором роде фиксировано. Даже если вы вдруг сказали стилю, что он должен двигаться назад, а не вперед, он не будет анимировать так, как вы думаете, потому что он просто применит новую функцию интерполяции с тем же текущим временным шагом, что означает, что он просто привяжется к новому интерполяция.

Вместо этого примените многоуровневые переходы и установите различные задержки перехода, инвертированные в зависимости от того, какими вы хотите, чтобы они были, когда вы удаляете «активный» класс.

Например, в вашем стиле вы хотели подождать, чтобы применить изменение преобразования, пока не пройдете 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>

Что вы имеете в виду под интерполяцией?

softshipper 22.08.2018 09:32

Другие вопросы по теме