<button type="button" class="menu-button js-menu-trigger" aria-label="Click to open menu"></button>
<div class="pen-title js-menu-trigger">
  <h1>Grid Menu</h1>
  <div class="info">Click here</div>
</div>

<div class="menu js-menu">
  <div class="menu__item">
    <div class="menu__item__bg-container"></div>
    <div class="menu__item__content">
      <a href="#" class="btn-link">Home</a>
    </div>
  </div>
  <div class="menu__item">
    <div class="menu__item__bg-container"></div>
    <div class="menu__item__content">
      <a href="#" class="btn-link">About</a>
    </div>
  </div>
  <div class="menu__item">
    <div class="menu__item__bg-container"></div>
    <div class="menu__item__content">
      <nav class="main-navigation">
        <a class="main-navigation__link" href="#">Lorem, ipsum.</a>
        <a class="main-navigation__link" href="#">Ipsum dolor.</a>
        <a class="main-navigation__link" href="#">amet consectetur.</a>
        <a class="main-navigation__link" href="#">voluptate provident</a>
      </nav>
    </div>
  </div>
  <div class="menu__item">
    <div class="menu__item__bg-container"></div>
    <div class="menu__item__content">
      <a href="#" class="btn-link">Contact</a>
    </div>
  </div>
  <div class="menu__item">
    <div class="menu__item__bg-container"></div>
    <div class="menu__item__content">
      <a href="#" class="btn-link">More</a>
    </div>
  </div>
</div>
$color-1: #272727;
$color-2: #ecf445;
$color-3: #e17055;
$color-4: #eee;

* {
  box-sizing: border-box;
}


body {
  margin: 0;
  background: darken($color-1, 5%) url(https://picsum.photos/1920/1080?image=33) no-repeat center / cover;
  background-blend-mode: overlay;
}

.pen-title {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) scale(1);
  transition: all 300ms ease;
  z-index: 2;
  opacity: 1;
  transition-delay: 600ms;
  cursor: pointer;
  color: #fff;
  font-family: Helvetica, arial, sans-serif;
  text-align: center;
  
  .info {
    font-size: 10px;
    letter-spacing: 3px;
    font-weight: bold;
    color: $color-2;
  }
  h1 {
    letter-spacing: 4px;
    margin: 2px auto;
    font-size: 18px;
  }
  
  &.menu-trigger--menu-open {
    opacity: 0;
    top: -100%;
    transform: translate(-50%, -50%) scale(0.1);
    transition-delay: 0ms;
  }
}

.main-navigation {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100%;
  
  .main-navigation__link {
    text-decoration: none;
    color: #fff;
    font-size: 1.5rem;
    font-family: Helvetica, arial, sans-serif;
    padding: 4% 0.2rem;
    font-weight: bold;
    transition: all 300ms ease;
    position: relative;
    display: block;
    
    @media (min-width: 480px) {
      font-size: 2rem;
    }
    
    &:after {
      content: '';
      display: block;
      width: 10px;
      height: 2px;
      background: $color-2;
      position: absolute;
      bottom: 18%;
      left: 0;
      transform-origin: left;
      transition: all 300ms ease-out;
    }
    
    &:hover {
      &:after {
        transform: scaleX(4);
      }
    }
  }
}

.btn-link {
  display: flex;
  height: 100%;
  width: 100%;
  flex: 1 1 auto;
  justify-content: center;
  align-items: center;
  text-decoration: none;
  color: $color-1;
  font-size: 14px;
  font-weight: bold;
  letter-spacing: 3px;
  font-family: Helvetica, arial, sans-serif;
  position: relative;

  &:before {
    content: '';
    position: absolute;
    display: block;
    width: 1px;
    height: calc(50% - 60px);
    transform-origin: top;
    transition: all 300ms ease;
    transform: scaleY(0);
    background: $color-1;
    top: 20px;
    left: 50%;
    margin-left: -2px;
    opacity: 1;
  }
  
  &:hover {
    &:before {
      transform: scaleY(1);
    }
  }
 
}

.menu-button {
  position: fixed;
  top: 20px;
  right: 20px;
  z-index: 3;
  background: $color-2;
  border: none;
  box-shadow: none;
  outline: none;
  width: 40px;
  height: 40px;
  padding: 0;
  font-family: Helvetica, arial, sans-serif;
  font-size: 10px;
  cursor: pointer;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  transition: all 300ms ease;
  
  &:after {
    content: '+';
    width: 30px;
    height: 30px;
    display: block;
    color: #000;
    font-size: 24px;
    font-weight: lighter;
    transition: all 300ms ease;
  }
  
  &:hover {
    transform: scale(1.1);
  }
  
  &.menu-trigger--menu-open {
    &:after {
      transform: rotate(765deg);
    }
  }
}

.menu {
  height: 100vh;
  width: 100vw;
  display: grid;
  overflow-y: auto;
  grid-template-columns: 100%;
  grid-template-rows: 20% 20% 20% 10% 10% 10% 10%;
  
  @media (min-width: 480px) {
    grid-template-columns: 30% 70%;
    grid-template-rows: 25% 25% 25% 25%;
  }
  
  @media (min-width: 800px) {
    grid-template-columns: 20% 30% 50%;
    grid-template-rows: 60% 40%;
  }

}

.menu__item {
  opacity: 0;
  transition: all 200ms ease;
  overflow: hidden;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  flex: 1 1 auto;
  
  .menu__item__bg-container {
    position: absolute;
    height: 100%;
    width: 100%;
    top: 0;
    left: 0;
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center;
    mix-blend-mode: overlay;
    transform-origin: center;
    transform: scale(2);
    transition: all 2000ms ease-out;
    z-index: 1;
  }
  
  .menu__item__content {
    display: flex;
    flex: 1 1 auto;
    justify-content: center;
    align-items: center;
    height: 100%;
    width: 100%;
    position: relative;
    z-index: 2;
    opacity: 0;
    transition: all 300ms ease;
  }
  
  &:first-child {
    background-color: $color-1;
    
    .btn-link {
      color: #eee;
      &:before {
        background: #ccc;
      }
    }
  }
  
  &:nth-child(2) {
    background-color: $color-2;
  }
  
  &:nth-child(3) {
    background-color: $color-1;
    grid-column-start: 1;
    grid-row-start: 1;
    grid-row-end: 4;
    
    @media (min-width: 480px) {
      grid-column-start: 2;
      grid-row-start: 1;
      grid-row-end: 5;
    }

    @media (min-width: 800px) {
      grid-column-start: 3;
      grid-row-start: 1;
      grid-row-end: 3;
    }

  }
  
  &:nth-child(4) {
    background-color: $color-3;
  }
  
  &:nth-child(5) {
    background-color: $color-4;
  }
  
  @for $i from 1 through 5 {
    &:nth-child(#{$i}) {
      transition-delay: #{$i * 50}ms;
      
      .menu__item__bg-container {
        background-image: url(https://picsum.photos/800/600?image=#{$i * 11});
      }
      
      .menu__item__content {
        transition-delay: #{($i * 50) - 50}ms;
      }
      
      @if $i % 2 == 0 {
        transform-origin: left;
        transform: scaleX(0);
      } @else {
        transform-origin: bottom;
        transform: scaleY(0);
      }
    }
    
    .menu--open & {
       &:nth-child(#{$i}) {
          transition-delay: #{$i * 200}ms;
         .menu__item__content {
           transition-delay: #{($i * 200) + 500}ms;
         }
       }
    }
  }
  
  .menu--open & {
    transform: scale(1);
    opacity: 1;
    transition: all 400ms ease;
    
    .menu__item__bg-container {
      transform: scale(1);
    }
    
    .menu__item__content {
      opacity: 1;
    }

    &:hover {
      .menu__item__bg-container {
        transform: scale(1.2);
      }
    }
  }

}
View Compiled
const penTitle = document.querySelector('.pen-title');
const menu = document.querySelector('.js-menu');
const menuTrigger = document.querySelectorAll('.js-menu-trigger');
menuTrigger.forEach(btn => {
  btn.addEventListener('click', function() {
    menuTrigger.forEach(b => {
      b.classList.toggle('menu-trigger--menu-open');
    });
    menu.classList.toggle('menu--open');
  });
});
View Compiled
Run Pen

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.