Mega menú desplegable

Ejercicio para practicar habilidades de HTML y CSS. Dentro de un menú común de opciones, abrimos un menú desplegable estándar y otro tipo mega menú sin framework.

Podés visitar el ejercicio que desarrollaremos aquí

💻 Ver explicación en video de youtube.

HTML

<!DOCTYPE html>
<html lang="es">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <link rel="stylesheet" href="style.css">
   <title>Mega menú desplegable</title>
</head>
<body>
   <header>
       <nav class="contenedor">
           <input type="checkbox"  id="abrir-menu">
           <a href="#" id="logo">🏢 LOGO</a>
           <ul class="opciones">
               <label for="abrir-menu" id="cerrar-label">
                   <svg xmlns="http://www.w3.org/2000/svg" height="30px" viewBox="0 -960 960 960" width="30px" fill="var(--color-texto)"><path d="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z"/></svg>
               </label>
               <li><a href="#inicio">Inicio</a></li>
               <li>
                   <a href="#"class="escritorio" >Sucursales <svg xmlns="http://www.w3.org/2000/svg" height="30px" viewBox="0 -960 960 960" width="30px" fill="var(--color-texto)"><path d="M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z"/></svg></a>
                   <input type="checkbox"  id="menu1" class="celu-input">
                   <label for="menu1" class="celu-label">Sucursales <svg xmlns="http://www.w3.org/2000/svg" height="30px" viewBox="0 -960 960 960" width="30px" fill="var(--color-texto)"><path d="M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z"/></svg></label>
                   <ul class="subopciones">
                       <li><a href="#argentina">argentina</a></li>
                       <li><a href="#paraguay">paraguay</a></li>
                       <li><a href="#uruguay">uruguay</a></li>
                       <li><a href="#chile">chile</a></li>
                       <li><a href="#bolivia">bolivia</a></li>
                   </ul>
               </li>
               <li>
                   <a href="#"class="escritorio">Productos <svg xmlns="http://www.w3.org/2000/svg" height="30px" viewBox="0 -960 960 960" width="30px" fill="var(--color-texto)"><path d="M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z"/></svg></a>
                   <input type="checkbox"  id="menu2" class="celu-input">
                   <label for="menu2" class="celu-label">Productos <svg xmlns="http://www.w3.org/2000/svg" height="30px" viewBox="0 -960 960 960" width="30px" fill="var(--color-texto)"><path d="M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z"/></svg></label>
                   <div class="mega-opciones">
                       <div class="contenido">
                           <div class="columna">
                               <img src="imagenes/img.jpg" alt="">
                           </div>
                           <div class="columna">
                               <h3>Mujeres</h3>
                               <ul class="mega-opcion">
                                   <li><a href="#indumentaria-m">indumentaria</a></li>
                                   <li><a href="#zapatillas-m">zapatillas</a></li>
                                   <li><a href="#accesorios-m">accesorios</a></li>
                                   <li><a href="#perfumeria-m">perfumería</a></li>
                               </ul>
                           </div>
                           <div class="columna">
                               <h3>Hombres</h3>
                               <ul class="mega-opcion">
                                   <li><a href="#indumentaria-v">indumentaria</a></li>
                                   <li><a href="#zapatillas-v">zapatillas</a></li>
                                   <li><a href="#accesorios-v">accesorios</a></li>
                                   <li><a href="#perfumeria-v">perfumería</a></li>
                               </ul>
                           </div>
                           <div class="columna">
                               <h3>Niños</h3>
                               <ul class="mega-opcion">
                                   <li><a href="#indumentaria-n">indumentaria</a></li>
                                   <li><a href="#zapatillas-n">zapatillas</a></li>
                                   <li><a href="#accesorios-n">accesorios</a></li>
                                   <li><a href="#jugueteria-n">juguetería</a></li>
                               </ul>
                           </div>
                       </div>
                   </div>
               </li>
               <li><a href="#contacto">contacto</a></li>
           </ul>
           <label for="abrir-menu" id="abrir-label">
               <svg xmlns="http://www.w3.org/2000/svg" height="30px" viewBox="0 -960 960 960" width="30px" fill="var(--color-texto)"><path d="M120-240v-80h720v80H120Zm0-200v-80h720v80H120Zm0-200v-80h720v80H120Z"/></svg>
           </label>
       </nav>
   </header>
   <main>
       <section id="inicio">Inicio</section>    
       <section id="argentina">Argentina</section>
       <section id="uruguay">Uruguay</section>
       <section id="paraguay">Paraguay</section>
       <section id="chile">Chile</section>
       <section id="bolivia">Bolivia</section>
       <section id="indumentaria-m">Indumentaria Mujer</section>
       <section id="zapatillas-m">Zapatillas</section>
       <section id="accesorios-m">Accesorios Mujer</section>
       <section id="perfumeria-m">Perfumería Mujer</section>
       <section id="indumentaria-v">Indumentaria Hombres</section>
       <section id="zapatillas-v">Zapatillas Hombres</section>
       <section id="accesorios-v">Accesorios Hombres</section>
       <section id="perfumeria-v">Perfumería Hombres</section>
       <section id="indumentaria-n">Indumentaria Niños</section>
       <section id="zapatillas-n">Zapatillas  Niños</section>
       <section id="accesorios-n">Accesorios  Niños</section>
       <section id="jugueteria-n">Jugueteria  Niños</section>
       <section id="contacto">Contacto</section>
   </main>
   <footer></footer>
   <script src="script.js"></script>
</body>
</html>

CSS

   :root{
       --color-texto:white;
   }
   *{
       margin: 0;
       padding: 0;
       box-sizing: border-box;
   }
   html{
       scroll-behavior: smooth;
       scroll-padding-top: 4rem;
   }
   ul{
       list-style: none;
   }
   a{
       text-decoration: none;
       color: inherit;
       white-space: nowrap;
   }
   body{
       font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
       font-size: 1.2rem;
   }
   .contenedor{
       width: min(calc(100% - 32px), 1250px);
       margin: 0 auto;
   }
   .celu-input,.celu-label,#abrir-menu,#abrir-label,#cerrar-label{
       display:none;
   }
   header {
       position: fixed;
       top:0;
       width: 100%;
       background-color: darkcyan;
       color: white;
       line-height: 70px;
       height: 70px;
   }
   header nav{
       display: flex;
       justify-content: space-between;
       align-items: center;
       line-height: 70px;
       height: 70px;
       position: relative;
   }
   header nav a#logo{
       font-size: 1.5rem;
       font-size: 700;
   }
   header nav ul.opciones{
       display: flex;
       justify-content: center;
       gap:3rem;
   }
   header nav ul.opciones a, header nav ul.opciones label {
       font-weight: 600;
       padding: 0 1.5rem;
       text-transform: capitalize;
   }
   header nav ul.opciones a:hover{
   color: cyan;
   }
   header nav ul.opciones ul.subopciones{
       background-color: darkcyan;
       border-radius: 0 0 8px 8px;
       padding-inline: 1rem;
       line-height: 45px;
       position: absolute;
       top:100px;
       visibility: hidden;
       opacity: 0;
       transition: 0.2s linear;
   }
   header nav ul.opciones li:hover ul.subopciones{
       top:70px;
       visibility: visible;
       opacity: 1;
   }

   header nav ul.opciones .mega-opciones{
       background-color: darkcyan;
       line-height: 45px;
       position: absolute;
       top:100px;
       left: 0;
       width: 100%;
       visibility: hidden;
       opacity: 0;
       transition: 0.1s linear;
   }
   header nav ul.opciones li:hover .mega-opciones{
       top:70px;
       visibility: visible;
       opacity: 1;

   }
   header nav ul.opciones .mega-opciones .contenido{
       display: flex;
       justify-content: center;
   }
   header nav ul.opciones .mega-opciones .contenido .columna{
       border-left: 1px solid rgba(0,0,0,0.5);
       width: 25%;
   
   }
   header nav ul.opciones .mega-opciones .contenido .columna h3{
       color: chartreuse;
       padding-left: 1rem;
   }
   header nav ul.opciones .mega-opciones .contenido .columna img{
       width:100%;
       height: 100%;
       object-fit: cover;
   }
   header nav ul.opciones a svg, header nav ul.opciones label svg{
       transform: translateY(25%);
   }
   header nav ul.opciones li a svg{
       transition: 0.5s ease;
   }
   header nav ul.opciones li:hover a svg{
       transform: rotate(180deg);
   }

   section{
       min-height: 100vh;
       display: grid;
       place-items: center;
       font-size: 3rem;
       text-transform: uppercase;
       border-bottom: 3px solid darkcyan;
       text-align: center;
   }

   @media (max-width:978px) {
       #abrir-label,#cerrar-label{
           display: block;
           cursor: pointer;
       }
       #abrir-label{
           transform: translateY(10%);
       }
       #cerrar-label{
           position: absolute;
           top:1.5rem;
           right: 1.5rem;
       }
       header nav ul.opciones{
           position: fixed;
           top:0;
           left: -125%;
           height: 100vh;
           width: min(20rem,80%);
           background-color: darkcyan;
           box-shadow: 0 5px 10px rgba(0,0,0,0.5);
           display: block;
           line-height: 45px;
           padding-top: 10rem;
           overflow-y: auto;
           transition: 0.2s linear;
       }
       #abrir-menu:checked ~ ul.opciones{
           left:0;
       }
       ::-webkit-scrollbar{
           width: 0;
       }
       header nav ul.opciones ul.subopciones{
           padding-left: 2rem;
           position: static;
           visibility: visible;
           opacity: 1;
           max-height: 0;
           overflow: hidden;
           transition: 0.2s linear;
       }
       header nav ul.opciones .mega-opciones{
           position: static;
           visibility: visible;
           opacity: 1;
           max-height: 0;
           overflow: hidden;
       }
       header nav ul.opciones .mega-opciones .contenido{
       flex-direction: column;
       padding-left: 2rem;
       }
       header nav ul.opciones .mega-opciones .contenido .columna:first-child{
       display: none;
       }
       header nav ul.opciones .mega-opciones .contenido .columna{
           border-left: 0px;
       }
       .escritorio{
           display: none;
       }
       .celu-label{
           display: block;
           cursor: pointer;
       }
       .celu-input:checked ~ ul.subopciones{
           max-height: 15rem;
       }
       .celu-input:checked ~ .mega-opciones{
           max-height: 100rem;
       }
       .celu-input:checked ~ label svg{
           transform: rotate(180deg);
       }
       
   }

Javascript

    const menuesinput = document.querySelectorAll('.celu-input')

   window.onscroll = ()=>{
       document.querySelector('#abrir-menu').checked = false;
       menuesinput.forEach(item=>{
           item.checked=false;
       })
   }

   const subopciones = document.querySelectorAll("ul.opciones li");
   const menues = document.querySelectorAll('ul.subopciones');
   const mega = document.querySelector('.mega-opciones');

   subopciones.forEach(opcion=>{
       opcion.addEventListener('click',()=>{

           if (window.matchMedia("(min-width: 978px)").matches){

               menues.forEach(item=>{
                   item.style.display = 'none'; 
               });
               mega.style.display = 'none'; 
           }
       });
   });

   subopciones.forEach(opcion=>{
       opcion.addEventListener('mouseleave',()=>{

           if (window.matchMedia("(min-width: 978px)").matches){

               menues.forEach(item=>{
                   item.style.display = 'block'; 
               });
               mega.style.display = 'block'; 
           }
       });
   });

Recursos

Íconos menú y cerrar : https://fonts.google.com