Mega Navbar - HTML/CSS
Tags: html, css, javascript, webdev
Published: 2023-02-21 14:11:27

Hello Everyone today I will be showing how to create a Meganav with HTML, CSS, and JavaScript.
Let's get Started...

# Demo -
{% codepen https://codepen.io/shubhamtiwari909/pen/KKxVYwB %}

# HTML-
```html
<header>
  <nav>
    <ul class="meganav">
      <li class="meganav--item">
        <a href="#" class="meganav--link">Home</a>
      </li>
      <li class="meganav--item">
        <a href="#" class="meganav--link">Frontend</a>
        <div class="meganav--content">
           <img src="image-link" />
          <ul class="meganav--content__items">
            <li><a href="#">HTML</a></li>
            <li><a href="#">CSS</a></li>
            <li><a href="#">JAVASCRIPT</a></li>
            <li><a href="#">REACT JS</a></li>
            <li><a href="#">NEXT JS</a></li>
          </ul>
        </div>
      </li>
      <li class="meganav--item">
       <a href="#" class="meganav--link">Backend</a>
        <div class="meganav--content">
          <img src="image-linkg" />
          <ul class="meganav--content__items">
            <li><a href="#">NODE JS</a></li>
            <li><a href="#">EXPRESS JS</a></li>
            <li><a href="#">MONGO DB</a></li>
            <li><a href="#">FIREBASE</a></li>
            <li><a href="#">MY SQL</a></li>
          </ul>
        </div>
      </li>
      <li class="meganav--item">
        <a href="#" class="meganav--link">Home</a>
      </li>
      <li class="meganav--item">
        <a href="#" class="meganav--link">Contact</a>
      </li>
    </ul>
  </nav>
</header>
```
* I have created a Navbar with nav items
* There are 2 items where we will be showing meganav, frontend and backend links.
* Both Frontend and Backend links have a sibling div element which holds the meganav content.
* What we will do is to add a hover effect to the ".meganav--item" class and change the opacity of ".meganav--content" with it.
You will get this part in CSS section

# SCSS -
* I am using SASS just for nesting classes, all the code here is pure CSS.
```css
header {
  position: relative;
}
.meganav {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 1rem;
  background-color: black;

  &--link {
    color: white;
  }
  &--item {
    padding: 1rem 0;
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
  }
  &--content {
    position: absolute;
    top: 120%;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 1rem;
    width: 90%;
    height: 200px;
    border-radius: 10px;
    box-shadow: 2px 2px 50px 2px #000000;
    padding: 1rem 1.5rem;
    opacity: 0;
    visibility: hidden;
    transition: all 0.3s ease-in-out;
    background-color: white;

    & > img {
      width: 200px;
      height: 100px;
    }
    &__items {
      width: 50%;
      display: flex;
      flex-wrap: wrap;
      gap: 1.5rem;
      & > li > a {
        color: black;
      }
    }
  }

  &--item:hover &--content {
    opacity: 1;
    visibility: visible;
    top: 100%;
  }
}
```
* The ".meganav--content" is made position absolute, relative to header which is positioned relative.
* "&" this symbol here is the parent selector in SASS, what it does is take the parent classname and append it to the text after it. For example "&--item:hover &--content" means ".meganav--item:hover .meganav--content"
* "&--item:hover &--content" for this part, what is happening here is that when the meganav item is hovered, we will change the opacity and visibility of ".meganav--content" to 1 and visible, making it visible on hover only."top:100%" is just for transition effect.

# Responsive Part -
```css
@media screen and (max-width: 600px) {
  .meganav {
    flex-direction: column;
    &--content {
      position: static;
      display:none;
      width: 100%;
      height: 250px;
      margin: 10px 0 0 0;

      &__items {
        width: 100%;
        flex-direction: column;
        align-items: center;
        padding: 1.5rem;
      }
      & > img {
        display: none;
      }
    }
  }
  .show {
    display: flex;
    opacity: 1;
    visibility: visible;
    transform: translateX(0);
  }
}
```
* We are just making the "meganav--content" to position static and hiding it using "display:none".Also on mobile device we are hiding the meganav--content images, only showing the links
* ".show" class is used to toggle the meganav links using javascript.

## JavaScript - 
```js
const meganav = document.querySelectorAll(".meganav--link");

if (window.innerWidth < 600) {
  Array.from(meganav).forEach((item) => {
    item.addEventListener("click", (e) => {
      const target = e.target;
      if (target.nextElementSibling !== null) {
        target.nextElementSibling.classList.toggle("show");
      }
    });
  });
}
```
* We are selecting all the links with ".meganav--link" class and attaching an click event listener to them.
* When any link is clicked, it will check whether it has a next sibling element or not, if it has, toggle the "show" class to that sibling element which is the meganav--content here
* Also using "window.innerWidth", we will apply this toggle effect only when the viewport is less than 600px.

THANK YOU FOR CHECKING THIS POST
You can contact me on -
Instagram - https://www.instagram.com/supremacism__shubh/
LinkedIn - https://www.linkedin.com/in/shubham-tiwari-b7544b193/
Email - shubhmtiwri00@gmail.com

^^You can help me with some donation at the link below Thank you👇👇 ^^
☕ --> https://www.buymeacoffee.com/waaduheck <--

Also check these posts as well
https://dev.to/shubhamtiwari909/website-components-you-should-know-25nm

https://dev.to/shubhamtiwari909/smooth-scrolling-with-js-n56

https://dev.to/shubhamtiwari909/swiperjs-3802

https://dev.to/shubhamtiwari909/custom-tabs-with-sass-and-javascript-4dej