#1 - Menu Button
div.menu
  div.menu-trigger.js-menu-trigger
    button.menu-button.open(type='button')
      - for (let i = 1; i <= 3; i++)
        span.menu-button-line
    button.menu-button.close(type='button')
      - for (let i = 1; i <= 2; i++)
        span.menu-button-lineconst html    = document.documentElement
const element = document.getElementsByClassName('js-menu-trigger');
element[0].addEventListener('click', function(){
  html.classList.toggle('is-menu-opened');
});menu-button-line-size = 4px
.menu
  // fixed top right
  // z-index 100
.menu-trigger
  background #333
  overflow hidden
  size 70
.menu-button
  absolute top right bottom left
  box-sizing border-box
  cursor pointer
  display inline-block
  font-size 0
  margin auto
.menu-button-line
  absolute left
  box-sizing border-box
  display block
  size 100% menu-button-line-size
  transform none
  transform-origin 0 0
  transition all 0.5s
  &::before
    absolute top left
    background #fff
    content ''
    display block
    size 100%
.menu-button.open
  size 30 22
  .menu-button-line
    &:nth-child(1)
      top 0
      transition transform 0.2s cubic-bezier(0.77, 0, 0.355, 1) 0.6s
    &:nth-child(2)
      bottom 0
      margin auto
      top 0
      transition transform 0.2s cubic-bezier(0.77, 0, 0.355, 1) 0.7s
    &:nth-child(3)
      bottom 0
      transition transform 0.2s cubic-bezier(0.77, 0, 0.355, 1) 0.8s
  &:hover
    .menu-button-line
      &:nth-child(1)
        &::before
          animation menuButtonHoverX 0.5s cubic-bezier(0.645, 0.045, 0.175, 1) 0.1s
      &:nth-child(2)
        &::before
          animation menuButtonHoverX 0.5s cubic-bezier(0.645, 0.045, 0.175, 1) 0.2s
      &:nth-child(3)
        &::before
          animation menuButtonHoverX 0.5s cubic-bezier(0.645, 0.045, 0.175, 1) 0.3s
  .is-menu-opened &
    .menu-button-line
      transform scaleX(0)
      transform-origin 100% 0
      &:nth-child(1)
        transition transform 0.2s cubic-bezier(0.645, 0.045, 0.175, 1) 0s
      &:nth-child(2)
        transition transform 0.2s cubic-bezier(0.645, 0.045, 0.175, 1) 0.1s
      &:nth-child(3)
        transition transform 0.2s cubic-bezier(0.645, 0.045, 0.175, 1) 0.2s
.menu-button.close
  pointer-events none
  size 30
  transform rotate(45deg)
  .menu-button-line
    &:nth-child(1)
      left 0
      size 100% menu-button-line-size
      top 50%
      transform translateY(-50%) scaleX(0)
      transform-origin 100% 50%
      transition transform 0.2s cubic-bezier(0.645, 0.045, 0.175, 1) 0s
    &:nth-child(2)
      left 50%
      size menu-button-line-size 100%
      top 0
      transform translateX(-50%) scaleY(0)
      transform-origin 50% 100%
      transition transform 0.2s cubic-bezier(0.645, 0.045, 0.175, 1) 0.15s
  &:hover
    .menu-button-line
      &:nth-child(1)
        &::before
          animation menuButtonHoverX 0.5s cubic-bezier(0.645, 0.045, 0.175, 1) 0s
      &:nth-child(2)
        &::before
          animation menuButtonHoverY 0.5s cubic-bezier(0.645, 0.045, 0.175, 1) 0.15s
  .is-menu-opened &
    pointer-events auto
    .menu-button-line
      &:nth-child(1)
        transform translateY(-50%) scaleX(1)
        transform-origin 0 50%
        transition transform 0.3s cubic-bezier(0.77, 0, 0.355, 1) 0.5s
      &:nth-child(2)
        transform translateX(-50%) scaleY(1)
        transform-origin 50% 0
        transition transform 0.3s cubic-bezier(0.77, 0, 0.355, 1) 0.6s
@keyframes menuButtonHoverX
  0%
    transform none
    transform-origin 100% 0
  45%
    transform scaleX(0)
    transform-origin 100% 0
  55%
    transform scaleX(0)
    transform-origin 0 0
  100%
    transform none
    transform-origin 0
@keyframes menuButtonHoverY
  0%
    transform none
    transform-origin 0 100%
  45%
    transform scaleY(0)
    transform-origin 0 100%
  55%
    transform scaleY(0)
    transform-origin 0 0
  100%
    transform none
    transform-origin 0 0<link href="https://codepen.io/futemma/pen/REpRLV" rel="stylesheet" />