Reputation: 303
I have this hamburger menu implemented in my project. The menu works perfectly alright but the problem is it doesn't close when a User clicks on the Navigation Link, it only closes when clicks on the hamburger menu only. What I'm looking for is - either the user clicks on Hamburger Menu or Navigation-link it should behave the same way. I've tried but failed to achieve this, as this is purely CSS driven and no script is used. Any help is greatly appreciated.
.outer-menu {
position: relative;
z-index: 1;
}
.outer-menu .checkbox-toggle {
position: absolute;
top: 0;
left: 0;
z-index: 2;
cursor: pointer;
width: 30px;
height: 30px;
opacity: 0;
}
.outer-menu .checkbox-toggle:checked + .hamburger > div {
-webkit-transform: rotate(135deg);
transform: rotate(135deg);
}
.outer-menu .checkbox-toggle:checked + .hamburger > div:before,
.outer-menu .checkbox-toggle:checked + .hamburger > div:after {
top: 0;
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
}
.outer-menu .checkbox-toggle:checked + .hamburger > div:after {
opacity: 0;
}
.outer-menu .checkbox-toggle:checked ~ .menu {
pointer-events: auto;
visibility: visible;
}
.outer-menu .checkbox-toggle:checked ~ .menu > div {
-webkit-transform: scale(1);
transform: scale(1);
-webkit-transition-duration: 0.75s;
transition-duration: 0.75s;
}
.outer-menu .checkbox-toggle:checked ~ .menu > div > div {
opacity: 1;
-webkit-transition: opacity 0.4s ease 0.4s;
transition: opacity 0.4s ease 0.4s;
}
.outer-menu .checkbox-toggle:hover + .hamburger {
box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.1);
}
.outer-menu .checkbox-toggle:checked:hover + .hamburger > div {
-webkit-transform: rotate(225deg);
transform: rotate(225deg);
}
.outer-menu .hamburger {
position: absolute;
top: 0;
left: 0;
z-index: 1;
width: 30px;
height: 30px;
padding: 1px;
background: rgba(33, 150, 243, 0.0);
border-radius: 0 0.12em 0.12em 0;
cursor: pointer;
-webkit-transition: box-shadow 0.4s ease;
transition: box-shadow 0.4s ease;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .hamburger > div {
position: relative;
-webkit-box-flex: 0;
flex: none;
width: 100%;
height: 2px;
background: #000000;
-webkit-transition: all 0.4s ease;
transition: all 0.4s ease;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .hamburger > div:before,
.outer-menu .hamburger > div:after {
content: '';
position: absolute;
z-index: 1;
top: -10px;
left: 0;
width: 100%;
height: 2px;
background: inherit;
-webkit-transition: all 0.4s ease;
transition: all 0.4s ease;
}
.outer-menu .hamburger > div:after {
top: 10px;
}
.outer-menu .menu {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
visibility: hidden;
overflow: hidden;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
outline: 1px solid transparent;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .menu > div {
width: 140vw;
height: 140vw;
background: $color-white;
border-radius: 50%;
-webkit-transition: all 0.4s ease;
transition: all 0.4s ease;
-webkit-box-flex: 0;
flex: none;
-webkit-transform: scale(0);
transform: scale(0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
overflow: hidden;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .menu > div > div {
text-align: center;
max-width: 90vw;
max-height: 100vh;
opacity: 0;
-webkit-transition: opacity 0.4s ease;
transition: opacity 0.4s ease;
overflow-y: auto;
-webkit-box-flex: 0;
flex: none;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .menu > div > div > ul {
list-style: none;
padding: 0 1em;
margin: 0;
display: block;
max-height: 100vh;
}
.outer-menu .menu > div > div > ul > li {
padding: 0;
margin-bottom: 2em;
font-size: 2em;
display: block;
}
.outer-menu .menu > div > div > ul > li > a {
position: relative;
display: inline;
cursor: pointer;
-webkit-transition: color 0.4s ease;
transition: color 0.4s ease;
text-transform: uppercase;
}
.outer-menu .menu > div > div > ul > li > a:hover {
color: #e5e5e5;
}
.outer-menu .menu > div > div > ul > li > a:hover:after {
width: 100%;
}
.outer-menu .menu > div > div > ul > li > a:after {
content: '';
position: absolute;
z-index: 1;
bottom: -0.15em;
left: 0;
width: 0;
height: 2px;
background: #333;
-webkit-transition: width 0.4s ease;
transition: width 0.4s ease;
}
<div class="fixed-top shadow-btm">
<div class="container-fluid bg-white">
<div class="container">
<div class="row">
<div class="menulink">
<div class="flex-item">
<!-- <a title="Menu" class="btn btn-link" (click)="open()"><i class="fa fa-bars"></i></a> -->
<div class="outer-menu">
<input class="checkbox-toggle" type="checkbox" />
<div class="hamburger">
<div></div>
</div>
<div class="menu">
<div>
<div>
<ul>
<li class="nav-item" [routerLinkActive]="['active']">
<a class="nav-link" [routerLink]="['/home']" title="Home">Home</a>
</li>
<li class="nav-item" [routerLinkActive]="['active']">
<a class="nav-link" [routerLink]="['/about']" title="Home">About</a>
<li class="nav-item" [routerLinkActive]="['active']">
<a class="nav-link" [routerLink]="['/contact']" title="Contact">Contact</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="flex-item" style="display:none;">
<a class="nav-link" [routerLink]="['/home']" title="XYZ Company">XYZ Company B</a>
</div>
</div>
</div>
</div>
</div>
</div>
Upvotes: 0
Views: 520
Reputation: 161
const hamburgerMenu = document.querySelector(".menu-btn");
const hamburger = document.querySelector(".hamburger");
const menuList = document.querySelector(".menu-list");
hamburgerMenu.onclick = () => {
hamburger.classList.toggle("active");
menuList.classList.toggle("active");
hamburgerMenu.classList.toggle("active");
};
menuList.onclick = function (e) {
if (e.target.classList !== "menu-btn") {
hamburger.classList.remove("active");
menuList.classList.remove("active");
hamburgerMenu.classList.remove("active");
}
};
body{
background-color: black
}
.menu-btn {
cursor: pointer;
height: 55px;
width: 55px;
position: fixed;
top: 30px;
left: 30px;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
z-index: 15;
}
.menu-btn .hamburger {
background-color: whitesmoke;
height: 3px;
width: 50px;
transition: 0.5s;
}
.menu-btn .hamburger::before {
content: "";
position: absolute;
width: inherit;
height: 3px;
transform: translateY(-8px);
background-color: whitesmoke;
transition: 0.5s;
}
.menu-btn .hamburger::after {
content: "";
position: absolute;
width: inherit;
height: 3px;
transform: translateY(8px);
background-color: whitesmoke;
transition: 0.5s;
}
/* -------------hamburger menu ANIMATION starts here----------------- */
.menu-btn.active {
background-color: #edc681;
transition: 0.3s;
}
.menu-btn .hamburger.active {
background-color: transparent;
opacity: 1;
transition: 0.3s;
}
.menu-btn .hamburger.active::before {
background-color: black;
transform: translateY(0px) rotate(-45deg);
transition: 0.5s;
opacity: 1;
}
.menu-btn .hamburger.active::after {
background-color: black;
transform: translateY(0px) rotate(45deg);
transition: 0.5s;
opacity: 1;
}
/* -------------hamburger menu ANIMATION ends here----------------- */
.menu-list {
position: fixed;
top: 0;
left: -100vw;
width: 100vw;
height: 100vh;
/* background-color: rgba(237, 198, 129, 1); */
display: flex;
justify-content: center;
align-items: center;
z-index: 10;
background-color: black
transition: 0.3s all ease-in-out;
}
.menu-list ul {
width: 100%;
display: flex;
align-items: center;
justify-content: space-evenly;
flex-direction: column;
list-style: none;
}
.menu-list ul li a {
color: #edc681;
font-size: 250%;
font-weight: 500;
text-decoration: none;
position: relative;
}
.menu-list ul li a:after {
content: "";
position: absolute;
width: 100%;
transform: scaleX(0);
height: 2px;
bottom: 0;
left: 0;
background-color: whitesmoke;
transform-origin: bottom right;
transition: transform 0.25s ease-out;
}
.menu-list ul li a:hover:after {
transform: scaleX(1);
transform-origin: bottom left;
}
.menu-list.active {
left: 0vw;
}
<div class="menu-btn">
<div class="hamburger"></div>
</div>
<div class="menu-list">
<ul class="menu-items">
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#skills">Skills</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</div>
Upvotes: 0
Reputation: 17687
Since you are using Angular you should take advantage of what it offers.
Just make your component have a property isOpened
and toggle that when you either click on the icon or on a menu item.
See example below
component.ts file
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
isOpened = false;
public toggleMenu() {
this.isOpened = !this.isOpened;
}
}
component.html file
<div [class]="isOpened ? 'opened' : 'closed'" (click)="toggleMenu()"> Menu Icon</div>
<ul *ngIf="isOpened">
<li (click)="toggleMenu()">
Menu item here
</li>
<li (click)="toggleMenu()">
Menu item here
</li>
</ul>
You can style it how you want.
See stackblitz for a working solution : https://stackblitz.com/edit/angular-ozeg8g
Upvotes: 0
Reputation: 14904
You need to add an click listener on your links. Then you just set checked
to false whenver you click on it.
let navs = document.querySelectorAll(".nav-item");
let checkbox = document.querySelector(".checkbox-toggle");
navs.forEach(nav => {
nav.addEventListener("click", () => {
checkbox.checked = false;
})
});
.outer-menu {
position: relative;
z-index: 1;
}
.outer-menu .checkbox-toggle {
position: absolute;
top: 0;
left: 0;
z-index: 2;
cursor: pointer;
width: 30px;
height: 30px;
opacity: 0;
}
.outer-menu .checkbox-toggle:checked + .hamburger > div {
-webkit-transform: rotate(135deg);
transform: rotate(135deg);
}
.outer-menu .checkbox-toggle:checked + .hamburger > div:before,
.outer-menu .checkbox-toggle:checked + .hamburger > div:after {
top: 0;
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
}
.outer-menu .checkbox-toggle:checked + .hamburger > div:after {
opacity: 0;
}
.outer-menu .checkbox-toggle:checked ~ .menu {
pointer-events: auto;
visibility: visible;
}
.outer-menu .checkbox-toggle:checked ~ .menu > div {
-webkit-transform: scale(1);
transform: scale(1);
-webkit-transition-duration: 0.75s;
transition-duration: 0.75s;
}
.outer-menu .checkbox-toggle:checked ~ .menu > div > div {
opacity: 1;
-webkit-transition: opacity 0.4s ease 0.4s;
transition: opacity 0.4s ease 0.4s;
}
.outer-menu .checkbox-toggle:hover + .hamburger {
box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.1);
}
.outer-menu .checkbox-toggle:checked:hover + .hamburger > div {
-webkit-transform: rotate(225deg);
transform: rotate(225deg);
}
.outer-menu .hamburger {
position: absolute;
top: 0;
left: 0;
z-index: 1;
width: 30px;
height: 30px;
padding: 1px;
background: rgba(33, 150, 243, 0.0);
border-radius: 0 0.12em 0.12em 0;
cursor: pointer;
-webkit-transition: box-shadow 0.4s ease;
transition: box-shadow 0.4s ease;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .hamburger > div {
position: relative;
-webkit-box-flex: 0;
flex: none;
width: 100%;
height: 2px;
background: #000000;
-webkit-transition: all 0.4s ease;
transition: all 0.4s ease;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .hamburger > div:before,
.outer-menu .hamburger > div:after {
content: '';
position: absolute;
z-index: 1;
top: -10px;
left: 0;
width: 100%;
height: 2px;
background: inherit;
-webkit-transition: all 0.4s ease;
transition: all 0.4s ease;
}
.outer-menu .hamburger > div:after {
top: 10px;
}
.outer-menu .menu {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
visibility: hidden;
overflow: hidden;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
outline: 1px solid transparent;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .menu > div {
width: 140vw;
height: 140vw;
background: $color-white;
border-radius: 50%;
-webkit-transition: all 0.4s ease;
transition: all 0.4s ease;
-webkit-box-flex: 0;
flex: none;
-webkit-transform: scale(0);
transform: scale(0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
overflow: hidden;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .menu > div > div {
text-align: center;
max-width: 90vw;
max-height: 100vh;
opacity: 0;
-webkit-transition: opacity 0.4s ease;
transition: opacity 0.4s ease;
overflow-y: auto;
-webkit-box-flex: 0;
flex: none;
display: -webkit-box;
display: flex;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.outer-menu .menu > div > div > ul {
list-style: none;
padding: 0 1em;
margin: 0;
display: block;
max-height: 100vh;
}
.outer-menu .menu > div > div > ul > li {
padding: 0;
margin-bottom: 2em;
font-size: 2em;
display: block;
}
.outer-menu .menu > div > div > ul > li > a {
position: relative;
display: inline;
cursor: pointer;
-webkit-transition: color 0.4s ease;
transition: color 0.4s ease;
text-transform: uppercase;
}
.outer-menu .menu > div > div > ul > li > a:hover {
color: #e5e5e5;
}
.outer-menu .menu > div > div > ul > li > a:hover:after {
width: 100%;
}
.outer-menu .menu > div > div > ul > li > a:after {
content: '';
position: absolute;
z-index: 1;
bottom: -0.15em;
left: 0;
width: 0;
height: 2px;
background: #333;
-webkit-transition: width 0.4s ease;
transition: width 0.4s ease;
}
<div class="fixed-top shadow-btm">
<div class="container-fluid bg-white">
<div class="container">
<div class="row">
<div class="menulink">
<div class="flex-item">
<!-- <a title="Menu" class="btn btn-link" (click)="open()"><i class="fa fa-bars"></i></a> -->
<div class="outer-menu">
<input class="checkbox-toggle" type="checkbox" />
<div class="hamburger">
<div></div>
</div>
<div class="menu">
<div>
<div>
<ul>
<li class="nav-item" [routerLinkActive]="['active']">
<a class="nav-link" [routerLink]="['/home']" title="Home">Home</a>
</li>
<li class="nav-item" [routerLinkActive]="['active']">
<a class="nav-link" [routerLink]="['/about']" title="Home">About</a>
<li class="nav-item" [routerLinkActive]="['active']">
<a class="nav-link" [routerLink]="['/contact']" title="Contact">Contact</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="flex-item" style="display:none;">
<a class="nav-link" [routerLink]="['/home']" title="XYZ Company">XYZ Company B</a>
</div>
</div>
</div>
</div>
</div>
</div>
Upvotes: 2