<div class="btn btnOpen">
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
    <path d="M0 0h24v24H0z" fill="none" />
    <path d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" />
  </svg>
</div>

<div class="btn btnClose">
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
    <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" />
    <path d="M0 0h24v24H0z" fill="none" />
  </svg>
</div>

<ul>
  <li>Menu Item 1</li>
  <li>Menu Item 2</li>
  <li>Menu Item 3</li>
  <li>Menu Item 4</li>
  <li>Menu Item 5</li>
  <li>Menu Item 6</li>
</ul>

<h1>Click the arrow</h1>
*, :before, :after
  box-sizing: border-box

html, body
  width: 100%
  height: 100%
  margin: 0

html
  font-size: 10px
  font-family: 'Courier New', Courier, monospace

body
  display: flex
  align-items: center
  justify-content: center
  background-image: linear-gradient( 135deg, #5EFCE8 0%, #736EFE 100%)
  overflow: hidden

.btn
  position: absolute
  top: 2rem
  right: 2rem
  z-index: 10
  width: 60px
  height: 60px
  display: flex
  align-items: center
  justify-content: center
  border-radius: 0
  user-select: none
  cursor: pointer
  transition: background 0.1s ease-in-out

.btnOpen:hover
  background-color: #fff  

.btnClose
  z-index: 9
  transform: translateX(70px)
  opacity: 0

  &:hover
    background-color: #5EFCE8

ul
  position: fixed
  top: 0
  right: 0
  width: 300px
  height: 100%
  margin: 0
  padding: 10rem 0 0
  list-style: none
  background-color: white
  transform: translateX(300px)

li
  position: relative
  font-size: 2rem
  padding: 2rem 0 2rem 4rem
  user-select: none
  cursor: pointer
  transition: background 0.2s ease-in

  &:hover
    background-color: #5EFCE8
View Compiled

const btnOpen = document.querySelector('.btnOpen');
const btnClose = document.querySelector('.btnClose');


// ---------------


const tl = new TimelineMax({paused: true});

tl.timeScale(1);

tl.to('h1', 0.3, { opacity: 0 })

  .to(btnOpen, 0.5, {
    x: -300,
    opacity: 0,
    ease: Power2.easeInOut,
  }, '-=0.5')

  .to('ul', 0.5, {
    x: 0,
    ease: Power2.easeInOut,
  }, '-=0.5')

  .to(btnClose, 0.5, {
    x: 0,
    opacity: 1,
    rotation: 360,
    ease: Power1.easeInOut,
  }, '-=0.5')


  .staggerFrom('li', 0.2, {
    opacity: 0,
    x: 70,
    ease: Back.easeOut,
  }, 0.06, '-=0.18');


// ---------------


openMenu = () => tl.play();
closeMenu = () => tl.reverse();

btnOpen.addEventListener('click', openMenu, false);
btnClose.addEventListener('click', closeMenu, false);
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/gsap/2.0.1/TweenMax.min.js