I was following a tutorial on how to create this nice looking sidebar that expands when hovering and fade in elements but it has a dropdown menu that expands when hovering as well (the desktop version) and I need it to expand only when clicking it.
If you hover over Profile and Notifications menu items they toggle when hovering and I need it to toggle when click.
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!--========== BOX ICONS ==========-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/boxicons@latest/css/boxicons.min.css">
<!--========== CSS ==========-->
<link rel="stylesheet" href="assets/css/styles.css">
<title>Responsive sidebar submenus</title>
</head>
<body>
<!--========== HEADER ==========-->
<header class="header">
<div class="header__container">
<img src="https://pruebaapp.ga/wp-content/uploads/2021/03/profile-1-150x150.jpeg" alt="" class="header__img">
<a href="#" class="header__logo">YOUR LOGO</a>
<div class="header__search">
<input type="search" placeholder="Search" class="header__input">
<i class='bx bx-search header__icon'></i>
</div>
<div class="header__toggle">
<i class='bx bx-menu' id="header-toggle"></i>
</div>
</div>
</header>
<!--========== NAV ==========-->
<div class="nav" id="navbar">
<nav class="nav__container">
<div>
<a href="#" class="nav__link nav__logo">
<i class='bx bxs-disc nav__icon' ></i>
<span class="nav__logo-name">Bedimcode</span>
</a>
<div class="nav__list">
<div class="nav__items">
<h3 class="nav__subtitle">Profile</h3>
<a href="#" class="nav__link active">
<i class='bx bx-home nav__icon' ></i>
<span class="nav__name">Home</span>
</a>
<div class="nav__dropdown">
<a href="#" class="nav__link">
<i class='bx bx-user nav__icon' ></i>
<span class="nav__name">Profile</span>
<i class='bx bx-chevron-down nav__icon nav__dropdown-icon'></i>
</a>
<div class="nav__dropdown-collapse">
<div class="nav__dropdown-content">
<a href="#" class="nav__dropdown-item">Passwords</a>
<a href="#" class="nav__dropdown-item">Mail</a>
<a href="#" class="nav__dropdown-item">Accounts</a>
</div>
</div>
</div>
<a href="#" class="nav__link">
<i class='bx bx-message-rounded nav__icon' ></i>
<span class="nav__name">Messages</span>
</a>
</div>
<div class="nav__items">
<h3 class="nav__subtitle">Menu</h3>
<div class="nav__dropdown">
<a href="#" class="nav__link">
<i class='bx bx-bell nav__icon' ></i>
<span class="nav__name">Notifications</span>
<i class='bx bx-chevron-down nav__icon nav__dropdown-icon'></i>
</a>
<div class="nav__dropdown-collapse">
<div class="nav__dropdown-content">
<a href="#" class="nav__dropdown-item">Blocked</a>
<a href="#" class="nav__dropdown-item">Silenced</a>
<a href="#" class="nav__dropdown-item">Publish</a>
<a href="#" class="nav__dropdown-item">Program</a>
</div>
</div>
</div>
<a href="#" class="nav__link">
<i class='bx bx-compass nav__icon' ></i>
<span class="nav__name">Explore</span>
</a>
<a href="#" class="nav__link">
<i class='bx bx-bookmark nav__icon' ></i>
<span class="nav__name">Saved</span>
</a>
</div>
</div>
</div>
<a href="#" class="nav__link nav__logout">
<i class='bx bx-log-out nav__icon' ></i>
<span class="nav__name">Log Out</span>
</a>
</nav>
</div>
<!--========== CONTENTS ==========-->
<main>
<section>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Incidunt vel illum fuga unde cum, voluptates magni molestias eveniet culpa autem ut, totam veniam, suscipit tempore ullam pariatur est at asperiores?</p>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Incidunt vel illum fuga unde cum, voluptates magni molestias eveniet culpa autem ut, totam veniam, suscipit tempore ullam pariatur est at asperiores?</p>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Incidunt vel illum fuga unde cum, voluptates magni molestias eveniet culpa autem ut, totam veniam, suscipit tempore ullam pariatur est at asperiores?</p>
</section>
</main>
<!--========== MAIN JS ==========-->
<script src="assets/js/main.js"></script>
</body>
I have made a pen with this element so you can see it:
https://codepen.io/henrymendeez/pen/rNjNNdw
Advertisement
Answer
- Replace this:
/* Show dropdown collapse */
.nav__dropdown:hover {
max-height: 100rem;
}
/* Rotate icon arrow */
.nav__dropdown:hover .nav__dropdown-icon {
transform: rotate(180deg);
}
With this:
/* Show dropdown collapse */
.nav__dropdown.open {
max-height: 100rem;
}
/* Rotate icon arrow */
.nav__dropdown.open .nav__dropdown-icon {
transform: rotate(180deg);
}
- Add this to the javascript:
const navDropdown = document.querySelectorAll(".nav__dropdown");
for (let i = 0; i < navDropdown.length; i++) {
navDropdown[i].addEventListener("click", () =>
navDropdown[i].classList.toggle("open")
);
}
This is what we get:
/*==================== SHOW NAVBAR ====================*/
const showMenu = (headerToggle, navbarId) => {
const toggleBtn = document.getElementById(headerToggle),
nav = document.getElementById(navbarId);
// Validate that variables exist
if (headerToggle && navbarId) {
toggleBtn.addEventListener("click", () => {
// We add the show-menu class to the div tag with the nav__menu class
nav.classList.toggle("show-menu");
// change icon
toggleBtn.classList.toggle("bx-x");
});
}
};
showMenu("header-toggle", "navbar");
/*==================== LINK ACTIVE ====================*/
const linkColor = document.querySelectorAll(".nav__link");
function colorLink() {
linkColor.forEach((l) => l.classList.remove("active"));
this.classList.add("active");
}
linkColor.forEach((l) => l.addEventListener("click", colorLink));
const navDropdown = document.querySelectorAll(".nav__dropdown");
for (let i = 0; i < navDropdown.length; i++) {
navDropdown[i].addEventListener("click", () =>
navDropdown[i].classList.toggle("open")
);
}/*========== GOOGLE FONTS ==========*/
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap");
/*========== VARIABLES CSS ==========*/
:root {
--header-height: 3.5rem;
--nav-width: 219px;
/*========== Colors ==========*/
--first-color: #6923d0;
--first-color-light: #f4f0fa;
--title-color: #19181b;
--text-color: #58555e;
--text-color-light: #a5a1aa;
--body-color: #f9f6fd;
--container-color: #ffffff;
/*========== Font and typography ==========*/
--body-font: "Poppins", sans-serif;
--normal-font-size: 0.938rem;
--small-font-size: 0.75rem;
--smaller-font-size: 0.75rem;
/*========== Font weight ==========*/
--font-medium: 500;
--font-semi-bold: 600;
/*========== z index ==========*/
--z-fixed: 100;
}
@media screen and (min-width: 1024px) {
:root {
--normal-font-size: 1rem;
--small-font-size: 0.875rem;
--smaller-font-size: 0.813rem;
}
}
/*========== BASE ==========*/
*,
::before,
::after {
box-sizing: border-box;
}
body {
margin: var(--header-height) 0 0 0;
padding: 1rem 1rem 0;
font-family: var(--body-font);
font-size: var(--normal-font-size);
background-color: var(--body-color);
color: var(--text-color);
}
h3 {
margin: 0;
}
a {
text-decoration: none;
}
img {
max-width: 100%;
height: auto;
}
/*========== HEADER ==========*/
.header {
position: fixed;
top: 0;
left: 0;
width: 100%;
background-color: var(--container-color);
box-shadow: 0 1px 0 rgba(22, 8, 43, 0.1);
padding: 0 1rem;
z-index: var(--z-fixed);
}
.header__container {
display: flex;
align-items: center;
height: var(--header-height);
justify-content: space-between;
}
.header__img {
width: 35px;
height: 35px;
border-radius: 50%;
}
.header__logo {
color: var(--title-color);
font-weight: var(--font-medium);
display: none;
}
.header__search {
display: flex;
padding: 0.4rem 0.75rem;
background-color: var(--first-color-light);
border-radius: 0.25rem;
}
.header__input {
width: 100%;
border: none;
outline: none;
background-color: var(--first-color-light);
}
.header__input::placeholder {
font-family: var(--body-font);
color: var(--text-color);
}
.header__icon,
.header__toggle {
font-size: 1.2rem;
}
.header__toggle {
color: var(--title-color);
cursor: pointer;
}
/*========== NAV ==========*/
.nav {
position: fixed;
top: 0;
left: -100%;
height: 100vh;
padding: 1rem 1rem 0;
background-color: var(--container-color);
box-shadow: 1px 0 0 rgba(22, 8, 43, 0.1);
z-index: var(--z-fixed);
transition: 0.4s;
}
.nav__container {
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
padding-bottom: 3rem;
overflow: auto;
scrollbar-width: none;
/* For mozilla */
}
/* For Google Chrome and others */
.nav__container::-webkit-scrollbar {
display: none;
}
.nav__logo {
font-weight: var(--font-semi-bold);
margin-bottom: 2.5rem;
}
.nav__list,
.nav__items {
display: grid;
}
.nav__list {
row-gap: 2.5rem;
}
.nav__items {
row-gap: 1.5rem;
}
.nav__subtitle {
font-size: var(--normal-font-size);
text-transform: uppercase;
letter-spacing: 0.1rem;
color: var(--text-color-light);
}
.nav__link {
display: flex;
align-items: center;
color: var(--text-color);
}
.nav__link:hover {
color: var(--first-color);
}
.nav__icon {
font-size: 1.2rem;
margin-right: 0.5rem;
}
.nav__name {
font-size: var(--small-font-size);
font-weight: var(--font-medium);
white-space: nowrap;
}
.nav__logout {
margin-top: 5rem;
}
/* Dropdown */
.nav__dropdown {
overflow: hidden;
max-height: 21px;
transition: 0.4s ease-in-out;
}
.nav__dropdown-collapse {
background-color: var(--first-color-light);
border-radius: 0.25rem;
margin-top: 1rem;
}
.nav__dropdown-content {
display: grid;
row-gap: 0.5rem;
padding: 0.75rem 2.5rem 0.75rem 1.8rem;
}
.nav__dropdown-item {
font-size: var(--smaller-font-size);
font-weight: var(--font-medium);
color: var(--text-color);
}
.nav__dropdown-item:hover {
color: var(--first-color);
}
.nav__dropdown-icon {
margin-left: auto;
transition: 0.4s;
}
/* Show dropdown collapse */
.nav__dropdown.open {
max-height: 100rem;
}
/* Rotate icon arrow */
.nav__dropdown.open .nav__dropdown-icon {
transform: rotate(180deg);
}
/*===== Show menu =====*/
.show-menu {
left: 0;
}
/*===== Active link =====*/
.active {
color: var(--first-color);
}
/* ========== MEDIA QUERIES ==========*/
/* For small devices reduce search*/
@media screen and (max-width: 320px) {
.header__search {
width: 70%;
}
}
@media screen and (min-width: 768px) {
body {
padding: 1rem 3rem 0 6rem;
}
.header {
padding: 0 3rem 0 6rem;
}
.header__container {
height: calc(var(--header-height) + 0.5rem);
}
.header__search {
width: 300px;
padding: 0.55rem 0.75rem;
}
.header__toggle {
display: none;
}
.header__logo {
display: block;
}
.header__img {
width: 40px;
height: 40px;
order: 1;
}
.nav {
left: 0;
padding: 1.2rem 1.5rem 0;
width: 68px;
/* Reduced navbar */
}
.nav__items {
row-gap: 1.7rem;
}
.nav__icon {
font-size: 1.3rem;
}
/* Element opacity */
.nav__logo-name,
.nav__name,
.nav__subtitle,
.nav__dropdown-icon {
opacity: 0;
transition: 0.3s;
}
/* Navbar expanded */
.nav:hover {
width: var(--nav-width);
}
/* Visible elements */
.nav:hover .nav__logo-name {
opacity: 1;
}
.nav:hover .nav__subtitle {
opacity: 1;
}
.nav:hover .nav__name {
opacity: 1;
}
.nav:hover .nav__dropdown-icon {
opacity: 1;
}
}<!--========== BOX ICONS ==========-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/boxicons@latest/css/boxicons.min.css">
<header class="header">
<div class="header__container">
<img src="https://pruebaapp.ga/wp-content/uploads/2021/03/profile-1-150x150.jpeg" alt="" class="header__img">
<a href="#" class="header__logo">YOUR LOGO</a>
<div class="header__search">
<input type="search" placeholder="Search" class="header__input">
<i class='bx bx-search header__icon'></i>
</div>
<div class="header__toggle">
<i class='bx bx-menu' id="header-toggle"></i>
</div>
</div>
</header>
<!--========== NAV ==========-->
<div class="nav" id="navbar">
<nav class="nav__container">
<div>
<a href="#" class="nav__link nav__logo">
<i class='bx bxs-disc nav__icon'></i>
<span class="nav__logo-name">Bedimcode</span>
</a>
<div class="nav__list">
<div class="nav__items">
<h3 class="nav__subtitle">Profile</h3>
<a href="#" class="nav__link active">
<i class='bx bx-home nav__icon'></i>
<span class="nav__name">Home</span>
</a>
<div class="nav__dropdown">
<a href="#" class="nav__link">
<i class='bx bx-user nav__icon'></i>
<span class="nav__name">Profile</span>
<i class='bx bx-chevron-down nav__icon nav__dropdown-icon'></i>
</a>
<div class="nav__dropdown-collapse">
<div class="nav__dropdown-content">
<a href="#" class="nav__dropdown-item">Passwords</a>
<a href="#" class="nav__dropdown-item">Mail</a>
<a href="#" class="nav__dropdown-item">Accounts</a>
</div>
</div>
</div>
<a href="#" class="nav__link">
<i class='bx bx-message-rounded nav__icon'></i>
<span class="nav__name">Messages</span>
</a>
</div>
<div class="nav__items">
<h3 class="nav__subtitle">Menu</h3>
<div class="nav__dropdown">
<a href="#" class="nav__link">
<i class='bx bx-bell nav__icon'></i>
<span class="nav__name">Notifications</span>
<i class='bx bx-chevron-down nav__icon nav__dropdown-icon'></i>
</a>
<div class="nav__dropdown-collapse">
<div class="nav__dropdown-content">
<a href="#" class="nav__dropdown-item">Blocked</a>
<a href="#" class="nav__dropdown-item">Silenced</a>
<a href="#" class="nav__dropdown-item">Publish</a>
<a href="#" class="nav__dropdown-item">Program</a>
</div>
</div>
</div>
<a href="#" class="nav__link">
<i class='bx bx-compass nav__icon'></i>
<span class="nav__name">Explore</span>
</a>
<a href="#" class="nav__link">
<i class='bx bx-bookmark nav__icon'></i>
<span class="nav__name">Saved</span>
</a>
</div>
</div>
</div>
<a href="#" class="nav__link nav__logout">
<i class='bx bx-log-out nav__icon'></i>
<span class="nav__name">Log Out</span>
</a>
</nav>
</div>
<!--========== CONTENTS ==========-->
<main>
<section>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Incidunt vel illum fuga unde cum, voluptates magni molestias eveniet culpa autem ut, totam veniam, suscipit tempore ullam pariatur est at asperiores?</p>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Incidunt vel illum fuga unde cum, voluptates magni molestias eveniet culpa autem ut, totam veniam, suscipit tempore ullam pariatur est at asperiores?</p>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Incidunt vel illum fuga unde cum, voluptates magni molestias eveniet culpa autem ut, totam veniam, suscipit tempore ullam pariatur est at asperiores?</p>
</section>
</main>👉 Check it in action on Codepen
If you want the dropdown to close when nav is closed then add this to the script:
const main = document.querySelector("main");
main.addEventListener("mousemove", (e) => {
for (let i = 0; i < navDropdown.length; i++) {
navDropdown[i].classList.remove("open");
}
});