'How to get this transition to start from specific spot

I've been trying to challenge myself to make an animated burger menu. I don't want to copy paste someone else's stuff and want to learn how to do this myself.

I want my menu bar to fold out from the burger menu instead of the side of the page buy can't seem to figure it out. The hamburger rotates into a single vertical line and I want my menu to fly in from that line. How do I do this? Thanks for your help.

I have my code here:

HTML:

  <!DOCTYPE html>
<html>
    <head>
        <link HREF="style.css" rel="stylesheet">

        <link rel="preconnect" href="https://fonts.googleapis.com">
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link href="https://fonts.googleapis.com/css2?family=Roboto+Serif:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet">
    
        <script type="text/javascript" src="script.js"></script>

        <title>TEST</title>

    </head>

    <body>
        <div class="page">


        <div class="nav-container" onclick="hamburger(this)">
            
            <div class="ham-container">
                <div class="hamburger-1"></div>
                <div class="hamburger-2"></div>
                <div class="hamburger-3"></div>
            </div> 

            <div class="nav-bar">
                <a>Home</a>     
                <a>Services</a>     
                <a>About</a>    
                <a>Projects</a>
            </div>


        </div>


    </body>

and my CSS:

    * {
    box-sizing: border-box;
    margin: 0 auto;
}

.page {
    height: 100vh;
    background-color: rgb(238, 212, 174);
}


.ham-container {
    position: absolute;
    top: 20px;
    left: 3vw;
    cursor: pointer;
    display: inline-block;
 

}
.hamburger-1,
.hamburger-2,
.hamburger-3 {
    width: 35px;
    height: 5px;
    background-color: red;
    margin: 5px 0;
    transition: 0.35s ease-in-out;
}

.nav-bar {
    height: 55px;
    width: 95vw;
    position: absolute;
    top: 10px;
    left: -100vw;
    display: flex;
    justify-content: space-between;
    color: white;
    font-size: 2.5rem;
    background-color: rgba(0, 0, 0, 0.3);
    transition: 0.35s ease-in-out;
}

.nav-bar a {
    font-family: 'Roboto Serif', sans-serif;
    padding: 10px;
}


.change .hamburger-1 {
    transform:  rotate(90deg) translateY(-10px);

}

.change .hamburger-2 {
    opacity: 0;
}

.change .hamburger-3 {
    transform: rotate(-90deg) translateY(10px);
}

.change .nav-bar {
    left: calc(3vw + 30px);
    transition-delay: 0.35s;
}

the whole thing is triggered with JS:

    function hamburger(x) {
    x.classList.toggle("change");
  }

You can also view this on codepen



Solution 1:[1]

Leveraging the .nav-container for positioning and a background color on your toggle button the code snippet below puts the .nav-bar right behind the button before animating so it looks like it comes out of it.

function hamburger(x) {
  x.classList.toggle("change");
}
* {
  box-sizing: border-box;
  margin: 0 auto;
}

.page {
  height: 100vh;
  background-color: rgb(238, 212, 174);
}

.nav-container {
  position: relative;
  top: 20px;
  margin-left: 3%;
  overflow: hidden;
}

.ham-container {
  position: relative;
  display: inline-block;
  background: rgb(238, 212, 174);
  height: 70px;
  padding-top: 18px;
  cursor: pointer;
  z-index: 1;
}

.hamburger-1,
.hamburger-2,
.hamburger-3 {
  width: 35px;
  height: 5px;
  background-color: red;
  margin: 5px 0;
  transition: 0.35s ease-in-out;
}

.nav-bar {
  height: 55px;
  width: calc(100% - 35px);
  position: absolute;
  top: 8px;
  left: calc(-100% + 35px);
  display: flex;
  justify-content: space-between;
  color: white;
  font-size: 2.5rem;
  background-color: rgba(0, 0, 0, 0.3);
  transition: 0.35s ease-in-out;
}

.nav-bar a {
  font-family: 'Roboto Serif', sans-serif;
  padding: 10px;
}

.change .hamburger-1 {
  transform: rotate(90deg) translateY(-15px);
}

.change .hamburger-2 {
  opacity: 0;
}

.change .hamburger-3 {
  transform: rotate(-90deg) translateY(15px);
}

.change .nav-bar {
  left: 35px;
  transition-delay: 0.25s;
}
<!DOCTYPE html>
<html>

<head>
  <link HREF="style.css" rel="stylesheet">

  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Roboto+Serif:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
    rel="stylesheet">

  <script type="text/javascript" src="script.js"></script>

  <title>TEST</title>

</head>

<body>
  <div class="page">


    <div class="nav-container" onclick="hamburger(this)">

      <div class="ham-container">
        <div class="hamburger-1"></div>
        <div class="hamburger-2"></div>
        <div class="hamburger-3"></div>
      </div>

      <div class="nav-bar">
        <a>Home</a>
        <a>Services</a>
        <a>About</a>
        <a>Projects</a>
      </div>


    </div>


</body>

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 wouch