Author: | omar-frontend |
---|---|
Views Total: | 1,196 views |
Official Page: | Go to website |
Last Update: | October 28, 2021 |
License: | MIT |
Preview:

Description:
A fancy 3D perspective hamburger navigation built with CSS/CSS3 and a little bit of JavaScript.
How to use it:
1. Add the hamburger menu to your webpage following the HTML structure:
<div class="container"> <!-- Navbar --> <div class="navbar"> <div class="menu"> <h3 class="logo">Site Logo</h3> <div class="hamburger-menu"> <div class="bar"></div> </div> </div> </div> <!-- Main Content Here --> <div class="main-container"> <div class="main"> <header> <div class="overlay"> <div class="inner"> Site Content Here </div> </div> </header> </div> <div class="shadow one"></div> <div class="shadow two"></div> </div> <!-- Nav Links --> <div class="links"> <ul> <li> <a href="#" style="--i: 0.05s;">Home</a> </li> <li> <a href="#" style="--i: 0.1s;">Services</a> </li> <li> <a href="#" style="--i: 0.15s;">Portfolio</a> </li> <li> <a href="#" style="--i: 0.2s;">Testimonials</a> </li> <li> <a href="#" style="--i: 0.25s;">About</a> </li> <li> <a href="#" style="--i: 0.3s;">Contact</a> </li> </ul> </div> </div>
2. The necessary CSS styles.
.container { min-height: 100vh; width: 100%; background-color: #485461; background-image: linear-gradient(135deg, #485461 0%, #28313b 74%); overflow-x: hidden; transform-style: preserve-3d; } .navbar { position: fixed; top: 0; left: 0; width: 100%; z-index: 10; height: 3rem; } .menu { max-width: 72rem; width: 100%; margin: 0 auto; padding: 0 2rem; display: flex; justify-content: space-between; align-items: center; color: #fff; } .hamburger-menu { height: 4rem; width: 3rem; cursor: pointer; display: flex; align-items: center; justify-content: flex-end; } .bar { width: 1.9rem; height: 1.5px; border-radius: 2px; background-color: #eee; transition: 0.5s; position: relative; } .bar:before, .bar:after { content: ""; position: absolute; width: inherit; height: inherit; background-color: #eee; transition: 0.5s; } .bar:before { transform: translateY(-9px); } .bar:after { transform: translateY(9px); } .main { position: relative; width: 100%; left: 0; z-index: 5; overflow: hidden; transform-origin: left; transform-style: preserve-3d; transition: 0.5s; } .overlay { position: absolute; width: 100%; height: 100%; top: 0; left: 0; background-color: rgba(43, 51, 59, 0.8); display: flex; justify-content: center; align-items: center; } .container.active .bar { transform: rotate(360deg); background-color: transparent; } .container.active .bar:before { transform: translateY(0) rotate(45deg); } .container.active .bar:after { transform: translateY(0) rotate(-45deg); } .container.active .main { animation: main-animation 0.5s ease; cursor: pointer; transform: perspective(1300px) rotateY(20deg) translateZ(310px) scale(0.5); } @keyframes main-animation { from { transform: translate(0); } to { transform: perspective(1300px) rotateY(20deg) translateZ(310px) scale(0.5); } } .links { position: absolute; width: 30%; right: 0; top: 0; height: 100vh; z-index: 2; display: flex; justify-content: center; align-items: center; } ul { list-style: none; } .links a { text-decoration: none; color: #eee; padding: 0.7rem 0; display: inline-block; font-size: 1rem; font-weight: 300; text-transform: uppercase; letter-spacing: 1px; transition: 0.3s; opacity: 0; transform: translateY(10px); animation: hide 0.5s forwards ease; } .links a:hover { color: #fff; } .container.active .links a { animation: appear 0.5s forwards ease var(--i); } @keyframes appear { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0px); } } @keyframes hide { from { opacity: 1; transform: translateY(0px); } to { opacity: 0; transform: translateY(10px); } } .shadow { position: absolute; width: 100%; height: 100vh; top: 0; left: 0; transform-style: preserve-3d; transform-origin: left; transition: 0.5s; background-color: white; } .shadow.one { z-index: -1; opacity: 0.15; } .shadow.two { z-index: -2; opacity: 0.1; } .container.active .shadow.one { animation: shadow-one 0.6s ease-out; transform: perspective(1300px) rotateY(20deg) translateZ(215px) scale(0.5); } @keyframes shadow-one { 0% { transform: translate(0); } 5% { transform: perspective(1300px) rotateY(20deg) translateZ(310px) scale(0.5); } 100% { transform: perspective(1300px) rotateY(20deg) translateZ(215px) scale(0.5); } } .container.active .shadow.two { animation: shadow-two 0.6s ease-out; transform: perspective(1300px) rotateY(20deg) translateZ(120px) scale(0.5); } @keyframes shadow-two { 0% { transform: translate(0); } 20% { transform: perspective(1300px) rotateY(20deg) translateZ(310px) scale(0.5); } 100% { transform: perspective(1300px) rotateY(20deg) translateZ(120px) scale(0.5); } } .container.active .main:hover + .shadow.one { transform: perspective(1300px) rotateY(20deg) translateZ(230px) scale(0.5); } .container.active .main:hover { transform: perspective(1300px) rotateY(20deg) translateZ(340px) scale(0.5); }
3. Enable the hamburger button to toggle the 3D menu.
const hamburger_menu = document.querySelector(".hamburger-menu"); const container = document.querySelector(".container"); hamburger_menu.addEventListener("click", () => { container.classList.toggle("active"); });