<h2 class="info">Full Page Navigation</h2>

<button class="nav-button">
  <div class="line line__1"></div>
  <div class="line line__2"></div>
  <div class="line line__3"></div>
</button>

<nav>
  <div class="nav__background"></div>
  <ul>
    <li><a href="#0">Home</a></li>
    <li><a href="#0">About</a></li>
    <li><a href="#0">Contact</a></li>
    <li><a href="#0">Dance</a></li>
  </ul>
</nav>

<div class="support">
  <a href="https://twitter.com/DevLoop01" target="_blank"><i class="fab fa-twitter-square"></i></a>
  <a href="https://codepen.io/dev_loop/" target="_blank"><i class="fab fa-codepen"></i></a>
</div>
@mixin flex-center {
  display: flex;
  justify-content: center;
  align-items: center;
}

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
body {
  position: relative;
  width: 100%;
  height: 100vh;
  overflow: hidden;
  background-image: url("https://source.unsplash.com/lfyKGQWEbew/1200x700");
  background-size: cover;
  font-family: "montserrat";
  z-index: 2;
  &::after{
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    background: rgba(0,0,0,0.3);
  }
}

a {
  text-decoration: none;
  text-transform: uppercase;
  user-select: none;
}

button {
  background: none;
  border: none;
  &:focus {
    outline: none;
  }
}

h2.info {
  position: absolute;
  font-size: 4.5vw;
  width: 100%;
  text-align: center;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.75);
  pointer-events: none;
  user-select: none;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  z-index: 5;
}

.nav-button {
  $width: 25px;
  $transition-time: 350ms;
  position: absolute;
  top: 20px;
  right: 20px;
  width: #{$width + 10px};
  height: #{$width + 10px};
  @include flex-center();
  flex-direction: column;
  cursor: pointer;
  z-index: 12;
  &.close {
    .line {
      &__1 {
        transform: rotate(45deg) translate(2px, -3px);
      }
      &__2 {
        transform: rotate(-45deg);
      }
      &__3 {
        transform: rotate(45deg) translate(-2px, 3px);
      }
    }
  }
  .line {
    width: $width;
    background: #fff;
    height: 2px;
    margin: 3px 0;
    transition: all $transition-time cubic-bezier(0.9, 0, 0.33, 1);
    &__1 {
      width: $width;
      transform-origin: left;
    }
    &__2 {
      width: $width;
      transform-origin: center;
    }
    &__3 {
      width: $width;
      transform-origin: right;
    }
  }
}

nav {
  width: 100%;
  height: 100%;
  @include flex-center();
  z-index: 10;
  ul {
    position: relative;
    height: 600px;
    width: 300px;
    li {
      position: absolute;
      width: 100%;
      list-style: none;
      text-align: center;
      left: 50%;
      transform: translate(-50%, -50%);
      overflow: hidden;
      z-index: 10;
      @for $i from 1 through 4 {
        &:nth-child(#{$i}) {
          top: #{$i * 20%};
        }
      }
      a {
        position: relative;
        font-size: 2.8rem;
        -webkit-text-stroke: 2px #fff;
        color: transparent;
        font-weight: bold;
        letter-spacing: 2px;
        opacity: 0;
        &::after {
          position: absolute;
          content: attr(data-text);
          width: 100%;
          height: 100%;
          left: 0;
          top: 0;
          color: #fff;
          // clip-path: polygon(0% 0, 0% 0px, -25% 100%, 0% 100%);
          clip-path: polygon(100% 100%, 100% 0px, 100% 100%, 0% 100%);
          transition: all 250ms ease;
          pointer-events: none;
        }
        &:hover {
          &::after {
            // clip-path: polygon(0% 0, 125% 0px, 100% 100%, 0% 100%);
            clip-path: polygon(0% 0%, 100% 0px, 100% 100%, 0% 100%);
          }
        }
      }
    }
  }

  .nav__background {
    position: absolute;
    width: 100%;
    height: 100%;
    background: rgba(34, 34, 34, 0.85);
    backdrop-filter: blur(5px);
    transform: scaleY(0);
    z-index: 10;
  }
}

.support{
  position: fixed;
  right: 10px;
  bottom: 10px;
  display: flex;
  z-index: 8;
  a{
    margin: 0 10px;
    color: #fff;
    font-size: 2rem;
    transition: all 400ms ease;
    &:hover{
      color: rgba(255, 255, 255, 0.35);
    }
  }

}
View Compiled
console.clear();

const listEls = Array.from(document.querySelectorAll("li"));
const button = document.querySelector(".nav-button");
const links = Array.from(document.querySelectorAll("li a"));
const listItems = Array.from(document.querySelectorAll("li"));

let menuActive = false;
let mousePos = { x: 0, y: 0 };

links.forEach(item => {
  innerText = item.innerText;
  item.setAttribute("data-text", innerText);
});

button.addEventListener("click", () => {
  menuActive = !menuActive;
  button.classList.toggle("close");
  animateOpenCloseMenu();
});
function animateOpenCloseMenu() {
  let navBG = document.querySelector(".nav__background");
  let tl = gsap.timeline({ defaults: { ease: "power3.out", duration: 0.45 } });
  if (menuActive) {
    tl.fromTo(
      navBG,
      { scaleY: 0, transformOrigin: "bottom" },
      { scaleY: 1, transformOrigin: "top" }
    );
    tl.fromTo(links, { opacity: 0, top: "100%" }, { opacity: 1, top: "0%", stagger: 0.05, delay: -0.35 });
  } else {
    tl.fromTo(links, { opacity: 1, top: "0%" }, { opacity: 0, top: "100%", stagger: -0.05 });
    tl.fromTo(
      navBG,
      { scaleY: 1, transformOrigin: "top" },
      { scaleY: 0, transformOrigin: "bottom", delay: -0.35 }
    );
  }
}
animateOpenCloseMenu();

const options = {
  distanceToMove: 15,
};
function updatePos(el) {
  let dist = calculateDistance(el).distance;
  let angle = calculateDistance(el).angle;
  if (dist < 80) {
    options.distanceToMove = dist;
    gsap.to(el, 0.3, {
      x: (Math.cos(angle) * options.distanceToMove) / 2,
      y: (Math.sin(angle) * options.distanceToMove) / 12,
    });
  } else {
    gsap.to(el, 0.3, {
      x: 0,
      y: 0,
    });
  }
}

function calculateDistance(el) {
  let dx = mousePos.x - (el.getBoundingClientRect().left + el.offsetWidth / 2);
  let dy = mousePos.y - (el.getBoundingClientRect().top + el.offsetHeight / 2);
  let angle = Math.atan2(dy, dx);
  let distance = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
  return { distance, angle };
}

document.body.addEventListener("mousemove", e => {
  mousePos.x = e.x;
  mousePos.y = e.y;
  if (menuActive) {
    listEls.forEach(listEl => {
      updatePos(listEl);
    });
  }
});

External CSS

  1. https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css
  2. https://fonts.googleapis.com/css?family=Montserrat&amp;display=swap

External JavaScript

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